Molecule — тестируем роли Ansible

в 4:11, , рубрики: devops, системное администрирование, метки: , , ,

Доброго времени суток. На Хабре не раз упоминался ansible, но статей о тестировании его ролей при помощи molecule мной обнаружено не было, однако Я нахожу данный фреймворк крайне удобным и хотел бы поделиться этим с аудиторией Хабра.

Molecule — тестируем роли Ansible - 1

Но для начала немного о том, чем я пользовался прежде.

Прежде для тестирования создаваемых мной ролей ansible я использовал vagrant, вбивая незамысловатые:

$ vagrant init debian/jessie64
$ vagrant up

Создавая виртуальные машины, после чего писал inventory и playbook для запуска роли, пока однажды мне не довелось познакомиться с molecule.

Что может предложить molecule?

  1. Первоначальная инициализация роли
  2. Driver/Provider
  3. Тесты на идемпотентность
  4. Верификация

Первоначальная инициализация роли

В случае указания новой роли создает типовую структуру для роли 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js