Я работал над написанием нескольких универсальных плейбуков для модификации инфраструктуры, и мы многое разработали для создания и модификации инфраструктуры для нас. Сначала путешествие было гладким, но по мере того, как мы продвигались вперед, мы создавали все больше и больше ролей. мы столкнулись с проблемами, например, когда мы не касаемся роли в течение длительного времени и когда мы смеем смахнуть с нее пыль, чтобы внести некоторые изменения, мы обычно сталкиваемся с проблемами, поскольку роль не работает или внесенные нами изменения могут сломаться для любых других ролей. . Это не новая проблема, с которой мы сталкиваемся, когда поддерживаем инфраструктуру как код и ее часть разработки программного обеспечения. Теперь большой вопрос, как мы можем решить эту проблему или избавиться от этих ситуаций?
Чтобы преодолеть эту проблему/ситуацию, мы хотели реализовать какой-то способ, чтобы мы могли протестировать наши роли ansible и легко перенести их в производственную инфраструктуру. Чтобы решить эту проблему, мы хотели внедрить непрерывную интеграцию (CI) для наших плейбуков, а также ввести модульные и интеграционные тесты для наших плейбуков. Чтобы решить эту проблему, мы пришли через Molecule . Molecule помогает в тестировании и разработке ролей Ansible. Molecule предоставляет возможность тестирования с несколькими экземплярами, операционными системами и дистрибутивами, поставщиками виртуализации, средами тестирования и сценариями тестирования. Это все, чего мы хотели, и мы начали использовать это для нашей инфраструктуры.
Сегодня мы немного поработаем с Molecule и посмотрим, как мы можем протестировать наши роли на разных дистрибутивах. Это также даст представление о том, как вы можете протестировать одно и то же на разных ОС и дистрибутивах. Чтобы начать работу с молекулой, нам нужно установить python-pip, так как он основан на Python.
# I will be taking this example on CentOS # IT requires Ansible >= 2.2 and Python 2.7sudo yum install -y epel-release sudo yum install -y gcc python-pip python-devel openssl-devel
Как только вы закончите установку python pip, давайте просто установим molecule.
sudo python-pip install molecule
Чтобы начать реализацию и тестирование, мы создадим одну роль с именем molecule-demo, после чего инициализируем роль molecule. Для инициализации нам просто нужно запустить следующую команду.
# This will initialize molecule-demo role and directory structure molecule init role --driver-name docker --role-name molecule-demo --verifier-name testinfra
Эта команда создаст для нас проект молекулы, и мы можем увидеть это, выполнив tree
команду « ». Это всего лишь простой шаблон для создания роли ansible с файлами молекул по умолчанию.
root@Ansible:/home/ubuntu/molecule-demo# tree . ├── defaults │ └── main.yml ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── molecule │ └── default │ ├── create.yml │ ├── destroy.yml │ ├── Dockerfile.j2 │ ├── INSTALL.rst │ ├── molecule.yml │ ├── playbook.yml │ └── tests │ ├── test_default.py │ └── test_default.pyc ├── README.md ├── tasks │ └── main.yml └── vars └── main.yml8 directories, 14 files
Как только вы закончите с этим, вы можете запустить простой тест, который был по умолчанию в молекуле. Чтобы проверить, работает ли установка, вы можете запустить molecule test
команду « », это запустит тесты по умолчанию.
Вы увидите этот вывод, где вы можете видеть, что мы выполнили тест по умолчанию, присутствующий в tests/test_default.py
. Прежде чем мы продолжим и посмотрим, какой тест мы на самом деле провели, я хотел бы дать вам представление о том, что на самом деле это делает в фоновом режиме.
По сути, он проверит molecule.yml
файл, чтобы получить подробную информацию о платформе, на которой мы хотим его протестировать. Для нас мы настроили запуск его в контейнерах докеров (в соответствии с командой инициализации). мы хотели протестировать этот плейбук на CentOS 7. Это загрузит официальный образ CentOS 7 и будет считать его базовым образом, а затем попытается запустить ваш плейбук внутри контейнера. Как только выполнение плейбука будет выполнено, он выполнит определенные тестовые случаи и даст вам результат.
Давайте просто создадим роль, а затем напишем простой тестовый пример для ее проверки. Для начала откройте файл task/main.yml
в любом из ваших любимых редакторов и вставьте следующий код.
# put this code in task/main.yml
---
- name: "Installing httpd service"
yum:
name: httpd
state: installed
Приведенный выше код просто установит службу httpd в машине/машине CentOS. Теперь, чтобы проверить, устанавливает ли это службу httpd, мы напишем простой тест, чтобы проверить это. Теперь откройте molecule/default/tests/test_default.py
и вставьте в него приведенный ниже код.
import osimport testinfra.utils.ansible_runnertestinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')def test_package(Package):
service = Package("httpd")
assert service.is_installed
Итак, теперь мы написали нашу Ansible playbook для установки службы httpd, а также написали тестовый пример, чтобы проверить, установлена ли служба или нет. Теперь давайте просто запустим его и проверим, проходит ли наш тест или нет. Чтобы запустить тест, просто запустите, molecule test
и вы увидите следующий вывод, показывающий, что тест пройден.
root@Ansible:/home/ubuntu/molecule-demo# molecule test --> Test matrix└── default ├── destroy ├── dependency ├── syntax ├── create ├── converge ├── idempotence ├── lint ├── side_effect ├── verify └── destroy --> Scenario: 'default' --> Action: 'destroy'PLAY [Destroy] *****************************************************************TASK [Destroy molecule instance(s)] ******************************************** ok: [localhost] => (item=(censored due to no_log))PLAY RECAP ********************************************************************* localhost : ok=1 changed=0 unreachable=0 failed=0--> Scenario: 'default' --> Action: 'dependency' Skipping, missing the requirements file. --> Scenario: 'default' --> Action: 'syntax'playbook: /home/ubuntu/molecule-demo/molecule/default/playbook.yml--> Scenario: 'default' --> Action: 'create'PLAY [Create] ******************************************************************TASK [Create Dockerfiles from image names] ************************************* ok: [localhost] => (item=(censored due to no_log))TASK [Discover local Docker images] ******************************************** ok: [localhost] => (item=(censored due to no_log))TASK [Build an Ansible compatible image] *************************************** changed: [localhost] => (item=(censored due to no_log))TASK [Create molecule instance(s)] ********************************************* changed: [localhost] => (item=(censored due to no_log))PLAY RECAP ********************************************************************* localhost : ok=4 changed=2 unreachable=0 failed=0--> Scenario: 'default' --> Action: 'converge'PLAY [Converge] ****************************************************************TASK [Gathering Facts] ********************************************************* ok: [instance]TASK [molecule-demo : Installing httpd service] ******************************** changed: [instance]PLAY RECAP ********************************************************************* instance : ok=2 changed=1 unreachable=0 failed=0--> Scenario: 'default' --> Action: 'idempotence' Idempotence completed successfully. --> Scenario: 'default' --> Action: 'lint' --> Executing Yamllint on files found in /home/ubuntu/molecule-demo/... Lint completed successfully. --> Executing Flake8 on files found in /home/ubuntu/molecule-demo/molecule/default/tests/... Lint completed successfully. --> Executing Ansible Lint on /home/ubuntu/molecule-demo/molecule/default/playbook.yml... Lint completed successfully. --> Scenario: 'default' --> Action: 'side_effect' Skipping, side effect playbook not configured. --> Scenario: 'default' --> Action: 'verify' --> Executing Testinfra tests found in /home/ubuntu/molecule-demo/molecule/default/tests/... ============================= test session starts ============================== platform linux2 -- Python 2.7.12, pytest-3.2.2, py-1.4.34, pluggy-0.4.0 rootdir: /home/ubuntu/molecule-demo/molecule/default, inifile: plugins: testinfra-1.6.3 collected 1 itemtests/test_default.py .=============================== warnings summary =============================== None Module already imported so can not be re-written: testinfra Package fixture is deprecated. Use host fixture and get Package module with host.package TestinfraBackend fixture is deprecated. Use host fixture and get backend with host.backend-- Docs: http://doc.pytest.org/en/latest/warnings.html ===================== 1 passed, 3 warnings in 4.42 seconds ===================== Verifier completed successfully. --> Scenario: 'default' --> Action: 'destroy'PLAY [Destroy] *****************************************************************TASK [Destroy molecule instance(s)] ******************************************** changed: [localhost] => (item=(censored due to no_log))PLAY RECAP ********************************************************************* localhost : ok=1 changed=1 unreachable=0 failed=0
Итак, из приведенного выше вывода команды ясно видно, что написанный нами тест пройден, что означает, что пакет httpd успешно установлен. Таким образом, мы можем протестировать наши роли перед их выполнением в производственной инфраструктуре. Как известно, инфраструктура состоит из разных платформ и разных ОС. Мы также должны иметь возможность проверить, поддерживает ли наш плейбук разные версии ОС или нет. Как мы можем сделать это с помощью молекулы. Посмотрим.
Откройте файл molecule/default/molecule.yml
файла. вы увидите конфигурацию для платформ, на которых вы хотите протестировать. Текущая конфигурация предполагает, что мы тестируем это на CentOS 7, что, если я хочу проверить, работает ли мой плейбук на CentOS 6.9 или нет. Давайте введем данные платформы в molecule.yml
файл и проверим с помощью molecule test
.
--- dependency: name: galaxy driver: name: docker lint: name: yamllint platforms: - name: instance image: centos:7 - name: instance2 image: centos:6.9 provisioner: name: ansible lint: name: ansible-lint scenario: name: default verifier: name: testinfra lint: name: flake8
Таким образом, вы можете проверить, работает ли ваша роль или нет, а также для каких платформ она может поддерживаться. Таким образом, мы преодолели проблему тестирования и обеспечения работы всех наших плейбуков, а также добавили CI (непрерывную интеграцию) в рабочий процесс. В настоящее время молекула не поддерживает окна, но вы все равно можете использовать ее (не с докером) с бродягой, чтобы проверить свои роли для окон.
Статья является переводом abhijeet-kamble619.medium.com