Как реализовать непрерывное тестирование Ansible ролей с помощью Molecule и Travis CI на Ubuntu 18.04

Автор выбралMozilla Foundation для получения пожертвования в рамках программыWrite for DOnations.

Вступление

Ansible - это безагентный инструмент управления конфигурацией, который использует шаблоны YAML для определения списка задач, которые будут выполняться на хостах. В Ansibleroles - это набор переменных, задач, файлов, шаблонов и модулей, которые используются вместе для выполнения единственной сложной функции.

Molecule - это инструмент для автоматического тестирования ролей Ansible, специально разработанный для поддержки разработки постоянно хорошо написанных и поддерживаемых ролей. Модульные тесты Molecule позволяют разработчикам тестировать роли одновременно в нескольких средах и при разных параметрах. Важно, чтобы разработчики постоянно запускали тесты для кода, который часто меняется; Этот рабочий процесс гарантирует, что роли продолжают работать при обновлении библиотек кода. Запуск Molecule с использованием инструмента непрерывной интеграции, такого какTravis CI, позволяет запускать тесты непрерывно, гарантируя, что вклад в ваш код не приведет к критическим изменениям.

В этом руководстве вы будете использовать готовую базовую роль, которая устанавливает и настраивает веб-сервер Apache и брандмауэр на серверах Ubuntu и CentOS. Затем вы инициализируете сценарий Molecule в этой роли, чтобы создать тесты и убедиться, что роль работает так, как задумано в ваших целевых средах. После настройки Molecule вы будете использовать Travis CI для постоянного тестирования вашей вновь созданной роли. Каждый раз, когда в ваш код вносятся изменения, Travis CI запускаетmolecule test, чтобы убедиться, что роль по-прежнему работает правильно.

Предпосылки

Прежде чем начать этот урок, вам понадобится:

[[step-1 -—- forking-the-base-role-repository]] == Шаг 1. Создание репозитория базовых ролей

Вы будете использовать предварительно созданную рольansible-apache, которая устанавливает Apache и настраивает брандмауэр в дистрибутивах на основе Debian и Red Hat. Вы раскроете эту роль и будете использовать ее в качестве основы, а затем создадите на ней тесты Molecule. Форкинг позволяет создавать копию репозитория, чтобы вы могли вносить в него изменения, не вмешиваясь в исходный проект.

Начнем с создания вилки ролиansible-apache. Перейдите в репозиторийansible-apache и нажмите кнопкуFork.

Как только вы разветвите репозиторий, GitHub приведет вас на страницу вашего форка. Это будет копия базового репозитория, но от вашего собственного аккаунта.

Нажмите зеленую кнопкуClone or Download, и вы увидите поле сClone with HTTPS.

Скопируйте URL, указанный для вашего хранилища. Вы будете использовать это на следующем шаге. URL будет похож на это:

https://github.com/username/ansible-apache.git

Вы заменитеusername своим именем пользователя GitHub.

Установив свой форк, вы клонируете его на своем сервере и начнете готовить свою роль в следующем разделе.

[[step-2 -—- prepare-your-role]] == Шаг 2 - Подготовка вашей роли

Выполнив шаг 1 предварительных требованийHow To Test Ansible Roles with Molecule on Ubuntu 18.04, у вас будут установлены Molecule и Ansible в виртуальной среде. Вы будете использовать эту виртуальную среду для разработки своей новой роли.

Сначала активируйте виртуальную среду, которую вы создали, выполнив необходимые условия, выполнив:

source my_env/bin/activate

Выполните следующую команду, чтобы клонировать репозиторий, используя URL-адрес, который вы только что скопировали на шаге 1:

git clone https://github.com/username/ansible-apache.git

Ваш вывод будет выглядеть примерно так:

OutputCloning into 'ansible-apache'...
remote: Enumerating objects: 16, done.
remote: Total 16 (delta 0), reused 0 (delta 0), pack-reused 16
Unpacking objects: 100% (16/16), done.

Перейдите во вновь созданный каталог:

cd ansible-apache

Базовая роль, которую вы скачали, выполняет следующие задачи:

  • Includes variables: роль начинается с включения всех необходимыхvariables в соответствии с распределением хоста. Ansible использует переменные для обработки различий между различными системами. Поскольку вы используете Ubuntu 18.04 и CentOS 7 в качестве хостов, роль будет распознавать, что семейства ОС являются Debian и Red Hat соответственно, и включать переменные изvars/Debian.yml иvars/RedHat.yml.

  • Includes distribution-relevant tasks: эти задачи включаютtasks/install-Debian.yml иtasks/install-RedHat.yml. В зависимости от указанного дистрибутива он устанавливает соответствующие пакеты. Для Ubuntu это пакетыapache2 иufw. Для CentOS это пакетыhttpd иfirewalld.

  • Ensures latest index.html is present: эта задача копирует шаблонtemplates/index.html.j2, который Apache будет использовать в качестве домашней страницы веб-сервера.

  • Starts relevant services and enables them on boot: запускает и включает необходимые службы, установленные как часть первой задачи. Для CentOS этоhttpd иfirewalld, а для Ubuntu -apache2 иufw.

  • Configures firewall to allow traffic: сюда входятtasks/configure-Debian-firewall.yml илиtasks/configure-RedHat-firewall.yml. Ansible настраивает Firewalld или UFW в качестве брандмауэра и вносит в белый список службуhttp.

Теперь, когда у вас есть понимание того, как работает эта роль, вы настроите Molecule для ее тестирования. Для этих задач вы напишите тестовые примеры, которые охватывают изменения, которые они вносят.

[[step-3 -—- writing-your-tests]] == Шаг 3. Написание тестов

Чтобы убедиться, что ваша базовая роль выполняет свои задачи в соответствии с назначением, вы запустите сценарий Molecule, укажите целевые среды и создадите три пользовательских тестовых файла.

Начните с инициализации сценария Molecule для этой роли с помощью следующей команды:

molecule init scenario -r ansible-apache

Вы увидите следующий вывод:

Output--> Initializing new scenario default...
Initialized scenario in /home/sammy/ansible-apache/molecule/default successfully.

Вы добавите CentOS и Ubuntu в качестве целевых сред, включив их в качестве платформ в файл конфигурации Molecule. Для этого отредактируйте файлmolecule.yml с помощью текстового редактора:

nano molecule/default/molecule.yml

Добавьте следующий выделенный контент в конфигурацию Molecule:

~/ansible-apache/molecule/default/molecule.yml

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: centos7
    image: milcom/centos7-systemd
    privileged: true
  - name: ubuntu18
    image: solita/ubuntu-systemd
    command: /sbin/init
    privileged: true
    volumes:
      - /lib/modules:/lib/modules:ro
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

Здесь вы указываете две целевые платформы, которые запускаются в привилегированном режиме, так как вы работаете со службами systemd:

  • centos7 - первая платформа, использующая изображениеmilcom/centos7-systemd.

  • ubuntu18 - вторая платформа, использующая изображениеsolita/ubuntu-systemd. Помимо использования привилегированного режима и монтирования необходимых модулей ядра, вы запускаете/sbin/init при запуске, чтобы убедиться, что iptables запущен и работает.

Сохраните и выйдите из файла.

Для получения дополнительной информации о запуске привилегированных контейнеров посетитеofficial Molecule documentation.

Вместо того, чтобы использовать тестовый файл Molecule по умолчанию, вы будете создавать три пользовательских тестовых файла, один для каждой целевой платформы и один файл для написания тестов, общих для всех платформ. Начните с удаления тестового файла сценария по умолчаниюtest_default.py с помощью следующей команды:

rm molecule/default/tests/test_default.py

Теперь вы можете перейти к созданию трех пользовательских тестовых файлов,test_common.py,test_Debian.py иtest_RedHat.py для каждой из ваших целевых платформ.

Первый тестовый файл,test_common.py, будет содержать общие тесты, которые будет выполнять каждый из хостов. Создайте и отредактируйте общий тестовый файлtest_common.py:

nano molecule/default/tests/test_common.py

Добавьте следующий код в файл:

~/ansible-apache/molecule/default/tests/test_common.py

import os
import pytest

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')


@pytest.mark.parametrize('file, content', [
  ("/var/www/html/index.html", "Managed by Ansible")
])
def test_files(host, file, content):
    file = host.file(file)

    assert file.exists
    assert file.contains(content)

В вашем файлеtest_common.py вы импортировали необходимые библиотеки. Вы также написали тест под названиемtest_files(), который выполняет единственную общую задачу между дистрибутивами, которую выполняет ваша роль: копирование вашего шаблона в качестве домашней страницы веб-серверов.

Следующий тестовый файл,test_Debian.py, содержит тесты, специфичные для дистрибутивов Debian. Этот тестовый файл специально предназначен для вашей платформы Ubuntu.

Создайте и отредактируйте тестовый файл Ubuntu, выполнив следующую команду:

nano molecule/default/tests/test_Debian.py

Теперь вы можете импортировать необходимые библиотеки и определить платформуubuntu18 в качестве целевого хоста. Добавьте следующий код в начало этого файла:

~/ansible-apache/molecule/default/tests/test_Debian.py

import os
import pytest

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('ubuntu18')

Затем в том же файле вы добавите тестtest_pkg().

Добавьте в файл следующий код, который определяет тестtest_pkg():

~/ansible-apache/molecule/default/tests/test_Debian.py

...
@pytest.mark.parametrize('pkg', [
    'apache2',
    'ufw'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

    assert package.is_installed

Этот тест проверяет, установлены ли на хосте пакетыapache2 иufw.

[.note] #Note: При добавлении нескольких тестов в тестовый файл Molecule убедитесь, что между каждым тестом есть две пустые строки, иначе вы получите синтаксическую ошибку от Molecule.
#

Чтобы определить следующий тест,test_svc(), добавьте следующий код под тестомtest_pkg() в вашем файле:

~/ansible-apache/molecule/default/tests/test_Debian.py

...
@pytest.mark.parametrize('svc', [
    'apache2',
    'ufw'
])
def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled

test_svc() проверит, запущены и включены ли службыapache2 иufw.

Наконец, вы добавите свой последний тестtest_ufw_rules() в файлtest_Debian.py.

Добавьте этот код под тестtest_svc() в свой файл, чтобы определитьtest_ufw_rules():

~/ansible-apache/molecule/default/tests/test_Debian.py

...
@pytest.mark.parametrize('rule', [
    '-A ufw-user-input -p tcp -m tcp --dport 80 -j ACCEPT'
])
def test_ufw_rules(host, rule):
    cmd = host.run('iptables -t filter -S')

    assert rule in cmd.stdout

test_ufw_rules() проверит, разрешает ли ваша конфигурация брандмауэра трафик на порт, используемый службой Apache.

После добавления каждого из этих тестов ваш файлtest_Debian.py будет выглядеть так:

~/ansible-apache/molecule/default/tests/test_Debian.py

import os
import pytest

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('ubuntu18')


@pytest.mark.parametrize('pkg', [
    'apache2',
    'ufw'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

    assert package.is_installed


@pytest.mark.parametrize('svc', [
    'apache2',
    'ufw'
])
def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled


@pytest.mark.parametrize('rule', [
    '-A ufw-user-input -p tcp -m tcp --dport 80 -j ACCEPT'
])
def test_ufw_rules(host, rule):
    cmd = host.run('iptables -t filter -S')

    assert rule in cmd.stdout

Файлtest_Debian.py теперь включает три теста:test_pkg(),test_svc() иtest_ufw_rules().

Сохраните и выйдите изtest_Debian.py.

Затем вы создадите тестовый файлtest_RedHat.py, который будет содержать тесты, специфичные для дистрибутивов Red Hat, для вашей платформы CentOS.

Создайте и отредактируйте тестовый файл CentOS,test_RedHat.py, выполнив следующую команду:

nano molecule/default/tests/test_RedHat.py

Как и в случае с тестовым файлом Ubuntu, вы теперь напишете три теста, которые будут включены в ваш файлtest_RedHat.py. Перед добавлением тестового кода вы можете импортировать необходимые библиотеки и определить платформуcentos7 в качестве целевого хоста, добавив следующий код в начало вашего файла:

~/ansible-apache/molecule/default/tests/test_RedHat.py

import os
import pytest

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('centos7')

Затем добавьте тестtest_pkg(), который будет проверять, установлены ли пакетыhttpd иfirewalld на хосте.

Следуя коду для импорта вашей библиотеки, добавьте в файл тестtest_pkg(). (Опять же, не забудьте включить две пустые строки перед каждым новым тестом.)

~/ansible-apache/molecule/default/tests/test_RedHat.py

...
@pytest.mark.parametrize('pkg', [
    'httpd',
    'firewalld'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

      assert package.is_installed

Теперь вы можете добавить тестtest_svc(), чтобы убедиться, что службыhttpd иfirewalld работают и включены.

Добавьте кодtest_svc() в свой файл после тестаtest_pkg():

~/ansible-apache/molecule/default/tests/test_RedHat.py

...
@pytest.mark.parametrize('svc', [
    'httpd',
    'firewalld'
])
  def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled

Последним тестом в файлеtest_RedHat.py будетtest_firewalld(), который проверит, есть ли у Firewalld сервисhttp в белом списке.

Добавьте тестtest_firewalld() в свой файл после кодаtest_svc():

~/ansible-apache/molecule/default/tests/test_RedHat.py

...
@pytest.mark.parametrize('file, content', [
    ("/etc/firewalld/zones/public.xml", "")
])
def test_firewalld(host, file, content):
    file = host.file(file)

    assert file.exists
    assert file.contains(content)

После импорта библиотек и добавления трех тестов ваш файлtest_RedHat.py будет выглядеть так:

~/ansible-apache/molecule/default/tests/test_RedHat.py

import os
import pytest

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('centos7')


@pytest.mark.parametrize('pkg', [
    'httpd',
    'firewalld'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

    assert package.is_installed


@pytest.mark.parametrize('svc', [
    'httpd',
    'firewalld'
])
def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled


@pytest.mark.parametrize('file, content', [
    ("/etc/firewalld/zones/public.xml", "")
])
def test_firewalld(host, file, content):
    file = host.file(file)

    assert file.exists
    assert file.contains(content)

Теперь, когда вы завершили написание тестов для всех трех файлов,test_common.py,test_Debian.py иtest_RedHat.py, ваша роль готова к тестированию. На следующем шаге вы будете использовать Molecule для запуска этих тестов для вашей вновь сконфигурированной роли.

[[step-4 -—- testing-against-your-role]] == Шаг 4. Проверка на соответствие вашей роли

Теперь вы выполните свои недавно созданные тесты для базовой ролиansible-apache, используя Molecule. Чтобы запустить ваши тесты, используйте следующую команду:

molecule test

После завершения всех тестов Molecule вы увидите следующий вывод:

Output...
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in /home/sammy/ansible-apache/molecule/default/tests/...
    ============================= test session starts ==============================
    platform linux -- Python 3.6.7, pytest-4.1.1, py-1.7.0, pluggy-0.8.1
    rootdir: /home/sammy/ansible-apache/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 12 items

    tests/test_common.py ..                                                  [ 16%]
    tests/test_RedHat.py .....                                               [ 58%]
    tests/test_Debian.py .....                                               [100%]

    ========================== 12 passed in 80.70 seconds ==========================
Verifier completed successfully.

В выводе вы увидитеVerifier completed successfully; это означает, что верификатор выполнил все ваши тесты и успешно вернул их.

Теперь, когда вы успешно завершили разработку своей роли, вы можете зафиксировать свои изменения в Git и настроить Travis CI для непрерывного тестирования.

[[step-5 -—- using-git-to-share-your-updated-role]] == Шаг 5. Использование Git для публикации обновленной роли

До сих пор в этом руководстве вы клонировали роль с именемansible-apache и добавляли к ней тесты, чтобы убедиться, что она работает с хостами Ubuntu и CentOS. Чтобы поделиться своей обновленной ролью с общественностью, вы должны зафиксировать эти изменения и отправить их на свою вилку.

Запустите следующую команду, чтобы добавить файлы и зафиксировать внесенные вами изменения:

git add .

Эта команда добавит все файлы, которые вы изменили в текущем каталоге, в промежуточную область.

Вам также необходимо указать свое имя и адрес электронной почты вgit config для успешной фиксации. Вы можете сделать это, используя следующие команды:

git config user.email "[email protected]"
git config user.name "John Doe"

Передайте измененные файлы в свой репозиторий:

git commit -m "Configured Molecule"

Вы увидите следующий вывод:

Output[master b2d5a5c] Configured Molecule
 8 files changed, 155 insertions(+), 1 deletion(-)
 create mode 100644 molecule/default/Dockerfile.j2
 create mode 100644 molecule/default/INSTALL.rst
 create mode 100644 molecule/default/molecule.yml
 create mode 100644 molecule/default/playbook.yml
 create mode 100644 molecule/default/tests/test_Debian.py
 create mode 100644 molecule/default/tests/test_RedHat.py
 create mode 100644 molecule/default/tests/test_common.py

Это означает, что вы успешно зафиксировали свои изменения. Теперь внесите эти изменения в ваш форк с помощью следующей команды:

git push -u origin master

Вы увидите приглашение для ввода учетных данных GitHub. После ввода этих учетных данных ваш код будет отправлен в ваш репозиторий, и вы увидите следующие выходные данные:

OutputCounting objects: 13, done.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (13/13), 2.32 KiB | 2.32 MiB/s, done.
Total 13 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 2 local objects.
To https://github.com/username/ansible-apache.git
   009d5d6..e4e6959  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

Если вы перейдете в репозиторий вашей вилки по адресуgithub.com/username/ansible-apache, вы увидите новую фиксацию с именемConfigured Molecule, отражающую изменения, внесенные вами в файлы.

Теперь вы можете интегрировать Travis CI с вашим новым репозиторием, чтобы любые изменения, внесенные в вашу роль, автоматически запускали тесты Molecule. Это гарантирует, что ваша роль всегда работает с хостами Ubuntu и CentOS.

[[step-6 -—- integration-travis-ci]] == Шаг 6. Интеграция Travis CI

На этом этапе вы собираетесь интегрировать Travis CI в свой рабочий процесс. После включения любые изменения, которые вы вносите в форк, будут запускать сборку Travis CI. Это делается для того, чтобы Travis CI всегда запускалmolecule test, когда участники вносят изменения. Если будут внесены какие-либо критические изменения, Travis объявит статус сборки как таковой.

Перейдите кTravis CI, чтобы включить репозиторий. Перейдите на страницу своего профиля, где вы можете нажать кнопкуActivate для GitHub.

Вы можете найти дополнительные инструкцииhere по активации репозиториев в Travis CI.

Чтобы Travis CI работал, вы должны создать файл конфигурации, содержащий инструкции для него. Чтобы создать файл конфигурации Travis, вернитесь на сервер и выполните следующую команду:

nano .travis.yml

Чтобы продублировать среду, созданную в этом руководстве, вы должны указать параметры в файле конфигурации Travis. Добавьте следующее содержимое в ваш файл:

~/ansible-apache/.travis.yml

---
language: python
python:
  - "2.7"
  - "3.6"
services:
  - docker
install:
  - pip install molecule docker
script:
  - molecule --version
  - ansible --version
  - molecule test

Параметры, которые вы указали в этом файле:

  • language: когда вы указываете Python в качестве языка, среда CI использует отдельные экземплярыvirtualenv для каждой версии Python, указанной вами в ключеpython.

  • python: Здесь вы указываете, что Трэвис будет использовать Python 2.7 и Python 3.6 для выполнения ваших тестов.

  • services: Docker нужен для запуска тестов в Molecule. Вы указываете, что Travis должен обеспечить присутствие Docker в вашей среде CI.

  • install: Здесь вы указываете предварительные шаги по установке, которые Travis CI выполнит в вашемvirtualenv.

    • pip install molecule docker, чтобы проверить наличие Ansible и Molecule вместе с библиотекой Python для удаленного API Docker.

  • script: указывает шаги, которые необходимо выполнить Travis CI. В вашем файле вы указываете три шага:

    • molecule --version выводит версию Molecule, если Molecule была успешно установлена.

    • ansible --version выводит версию Ansible, если Ansible был успешно установлен.

    • molecule test наконец запускает ваши тесты Molecule.

Причина, по которой вы указываетеmolecule --version иansible --version, заключается в том, чтобы отловить ошибки в случае сбоя сборки в результате неправильной конфигурацииansible илиmolecule из-за управления версиями.

После добавления содержимого в файл конфигурации Travis CI сохраните и выйдите из.travis.yml.

Теперь, каждый раз, когда вы вносите любые изменения в свой репозиторий, Travis CI автоматически запускает сборку на основе указанного выше файла конфигурации. Если какая-либо из команд в блокеscript не сработает, Travis CI сообщит о статусе сборки как таковой.

Чтобы упростить просмотр статуса сборки, вы можете добавить значок, указывающий статус сборки, вREADME вашей роли. Откройте файлREADME.md с помощью текстового редактора:

nano README.md

Добавьте следующую строку вREADME.md для отображения статуса сборки:

~/ansible-apache/README.md

[![Build Status](https://travis-ci.org/username/ansible-apache.svg?branch=master)](https://travis-ci.org/username/ansible-apache)

Заменитеusername своим именем пользователя GitHub. Зафиксируйте и отправьте изменения в свой репозиторий, как вы делали ранее.

Сначала выполните следующую команду, чтобы добавить.travis.yml иREADME.md в область подготовки:

git add .travis.yml README.md

Теперь внесите изменения в ваш репозиторий, выполнив:

git commit -m "Configured Travis"

Наконец, внесите эти изменения в ваш форк с помощью следующей команды:

git push -u origin master

Если вы перейдете в свой репозиторий GitHub, вы увидите, что изначально он сообщаетbuild: unknown.

build-status-unknown

В течение нескольких минут Трэвис начнет сборку, которую вы можете отслеживать на веб-сайте Travis CI. Как только сборка будет успешной, GitHub также сообщит о статусе как таковом в вашем хранилище - используя значок, который вы поместили в ваш файл README:

build-status-passing

Вы можете получить полную информацию о сборках, перейдя на сайт Travis CI:

travis-build-status

Теперь, когда вы успешно настроили Travis CI для своей новой роли, вы можете постоянно тестировать и интегрировать изменения в свои роли Ansible.

Заключение

В этом руководстве вы раздвоили роль, которая устанавливает и настраивает веб-сервер Apache из GitHub, и добавили интеграции для Molecule, написав тесты и настроив их для работы с контейнерами Docker, на которых работают Ubuntu и CentOS. Передав свою недавно созданную роль в GitHub, вы позволили другим пользователям получить доступ к вашей роли. Когда участники вносят изменения в вашу роль, Travis CI автоматически запускает Molecule для проверки вашей роли.

Когда вы освоитесь с созданием ролей и их тестированием с помощью Molecule, вы можете интегрировать это сAnsible Galaxy, чтобы роли автоматически добавлялись после успешной сборки.

Related