TGViewer
Сочный DevOps Сочный DevOps @andtree_sec · 420 subscribers
Post #213 191
Molecule в сиай

Немного про то, как мы запускаем молекула в сиай. Про то, как писать молекула тесты тут речи не пойдет.

Предположим, что в роли в molecule у нас есть несколько сценариев.
default(debian), centos, rocky.
Можно добавить сколько угодно своих или разделить еще более явно сценарии по версиям дистрибутивов.

Основной .gitlab-ci:
workflow:
auto_cancel:
on_new_commit: interruptible

variables:
ANSIBLE_MAIN_VERSION: "ansible-2.15"
ANSIBLE_HOST_KEY_CHECKING: "false"
ANSIBLE_RETRY_FILES_ENABLED: "false"
ANSIBLE_SSH_PIPELINING: "true"
ANSIBLE_DISPLAY_SKIPPED_HOSTS: "false"
ANSIBLE_FORCE_COLOR: "true"

stages:
- primary_test
- additional_tests

before_script:
- export PATH="/home/gitlab-runner/.local/bin:$PATH"
- pip install --no-cache-dir --upgrade --ignore-installed tox
- |
for req in molecule/*/requirements.yml; do envsubst < "$req" > /tmp/req.yml.tmp && mv /tmp/req.yml.tmp "$req"
done

# Базовый тест: main ansible version × все сценарии
molecule-test:
stage: primary_test
script:
- tox -e ${ANSIBLE_MAIN_VERSION}
after_script:
- >
if [ $CI_JOB_STATUS == 'canceled' ]; then
molecule destroy --scenario-name ${MOLECULE_SCENARIO} || true
fi
parallel:
matrix:
- MOLECULE_SCENARIO:
- default
- centos
- rocky
interruptible: true
tags:
- molecule-test

# Дополнительные тесты: остальные ansible versions × все сценарии
tox-tests:
stage: additional_tests
script:
- tox -e ${ANSIBLE}
after_script:
- >
if [ $CI_JOB_STATUS == 'canceled' ]; then
molecule destroy --scenario-name ${MOLECULE_SCENARIO} || true
fi
parallel:
matrix:
- ANSIBLE:
- ansible-2.16
- ansible-2.17
- ansible-2.18
MOLECULE_SCENARIO:
- default
- centos
- rocky
interruptible: true
tags:
- molecule-test


В основном тесте прогоняем все сценарии по всем версиям дистрибутивов но с ansible-core 2.15. Остальное запускаем через matrix и tox.

Пример tox.ini:
[tox]
envlist = ansible-2.{15,16,17,18}
skipsdist = true
recreate = true
parallel_show_output = true

[testenv]
commands =
python --version
ansible --version
ansible-lint --version
molecule --version
molecule test --scenario-name {env:MOLECULE_SCENARIO:default}

setenv =
TOX_ENVNAME={envname}
PY_COLORS=1
ANSIBLE_FORCE_COLOR=1
ANSIBLE_HOST_KEY_CHECKING="false"
ANSIBLE_RETRY_FILES_ENABLED="false"
ANSIBLE_SSH_PIPELINING="true"
ANSIBLE_DISPLAY_SKIPPED_HOSTS="false"

passenv = *

[testenv:ansible-2.15]
basepython = python3.11
deps =
-rrequirements.txt
ansible-core==2.15.*
ansible-lint==24.*

[testenv:ansible-2.16]
basepython = python3.12
deps =
-rrequirements.txt
ansible-core==2.16.*
ansible-lint==24.*

[testenv:ansible-2.17]
basepython = python3.12
deps =
-rrequirements.txt
ansible-core==2.17.*
ansible-lint==24.*

[testenv:ansible-2.18]
basepython = python3.12
deps =
-rrequirements.txt
ansible-core==2.18.*
ansible-lint==24.*

Итого на стадии additional_tests мы прогоняем тесты по всей матрице. Разные версии ansible + сценарии. Естественно раннер должен быть в таком случае привелигированным и правильно настроенным. Но это уже отдельная история.

Если используйте tox 4.x.x версии, то лучше использовать именование без точки, иначе может быть конфликт. Например в matrix можно передать так значения:
- ANSIBLE:         
- py311-ansible215
- py312-ansible216
- py312-ansible217
- py312-ansible218


Соответственно в tox.ini:
[tox]
envlist =
py311-ansible215
py312-ansible216
py312-ansible217
py312-ansible218


И далее заменить именование по файлу.

#ansible
#molecule
  • ❤ 2
  • 👌 1
More from @andtree_sec
  1. Sep 7, 2026Давненько не было сообщений. Скорее всего в будущем они уйдут в telegraf, который я еще не…
  2. Jul 6, 2026Последнее время на работе часто приходится работать с apache flink и даже что-то писать на…
  3. Jun 4, 2026Немножко про молекула тесты... У нас принято использовать в переменных lookup плагин для д…
  4. May 20, 2026Очередной небольшой проект. Веб-приложение, которое агрегирует через стандартный механиз g…
  5. May 15, 2026Включаем профилирование в ansible Профилирование, это вывод даты, времени запуска и итогов…
  6. Apr 17, 2026Так выглядит общий dashbord работы с инцидентами.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →