Доброго времени суток. На Хабре не раз упоминался ansible, но статей о тестировании его ролей при помощи molecule мной обнаружено не было, однако Я нахожу данный фреймворк крайне удобным и хотел бы поделиться этим с аудиторией Хабра.
Но для начала немного о том, чем я пользовался прежде.
Прежде для тестирования создаваемых мной ролей ansible я использовал vagrant, вбивая незамысловатые:
$ vagrant init debian/jessie64
$ vagrant up
Создавая виртуальные машины, после чего писал inventory и playbook для запуска роли, пока однажды мне не довелось познакомиться с molecule.
Что может предложить molecule?
- Первоначальная инициализация роли
- Driver/Provider
- Тесты на идемпотентность
- Верификация
Первоначальная инициализация роли
В случае указания новой роли создает типовую структуру для роли ansible
Driver/Provider
Molecule позволяет нам использовать в качестве подопытного кролика либо Docker-контейнер, либо виртуальную машину посредством Vagrant-а определяется это указанием driver-а при инициализации, либо в molecule.yml. Т.к. мне приходится тестировать роли оркестрирующие контейнеры, то предпочтительным для меня в качестве driver-а остается Vagrant. Выбор Vagrant-а в качестве driver-а так же позволяет выбрать Provider-а.
Доступны следующие:
- Libvirt
- Parallels
- VirtualBox (default)
- VMware Fusion
Далее будет рассматриваться вариант Vagrant-а с VirtualBox в качестве provider-а.
Тесты на идемпотентность
Cогласно wiki:
свойство объекта или операции при повторном применении операции к объекту давать тот же результат, что и при одинарном.
Применительно к ролям ansible — при повторном запуске роли не должно произведено каких-либо изменений.
Верификация
Для того, что бы убедиться в том, что роль отработала должным образом — не завалить какой-либо из task-ов недостаточно. Ведь необходимо проверить, что сервисы стартовали, порты открыты и т.д.
Для верификации доступны следующие фреймворки:
- Goss
- Serverspec
- Testinfra (default)
Мной были опробованы Goss и Testinfra. Для себя я выбрал Testinfra.
Пример использования:
$ molecule init --role sample-role
После выполнения данной комманды мы получаем дирректорию sample-role c типичной для роли ansible структурой и необходимыми yaml-файлами:
defaults
handlers
meta
molecule.yml // конфиг-файл для molecule
playbook.yml // плэйбук для запуска нашей роли
README.md
tasks
tests // скрипты для верификации
vars
Можно запустить без указания ключа --role, в этом случае буду созданы файлы molecule.yml и playbook.yml в текущей дирректории.
Бывает, что требуется обеспечить работу роли на нескольких дистрибутивах в этом случае в molecyle.yml стоит указать имена box-ов vagrant-а (в platforms):
vagrant:
platforms:
- name: jessie64
box: debian/jessie64
- name: centos7
box: centos/7
Далее добавляем необходимые действия/переменные и т.д. в роль, после чего тестируем на всех определенных платформах:
$ molecule test --platform all
После этого molecule:
- в случае наличия уже созданных виртуальных машин остановит и удалит их
- поднимет необходимые виртуальные машины
- проверит нашу роль при помощи ansible-lint
- выполнит нашу роль но новосозданных контейнерах
- произведет тест на идемпотентность
- запустить тесты testinfra
- удалит созданные виртуальные машины
Может потребоваться изменить поведение molecule при запуске test, например не производить тест на идемпотентность, для этого в molecule.yml стоит добавить следующее:
molecule:
test:
sequence:
- destroy
- syntax
- create
- converge
- verify
- destroy
Так же можно вызывать каждый из соответствующих шагов отдельно при помощи соответствующей комманды, пример:
$ molecule create --platform all
$ molecule syntax
$ molecule create
$ molecule converge
$ molecule verify
Как один из вариантов — не удалять/создавать новую виртуальную машину перед каждым converge.
Можно указать определенную platform-у и протестировать ее отдельно:
$ molecule create --platform jessie64
$ molecule syntax
$ molecule create
$ molecule converge
$ molecule verify
Спасибо за внимание!
Автор: pull