Ансибль | Тестирование | Молекула | либвирт | Докер

Локальное тестирование ролей Ansible с помощью Molecule в Linux и Windows

Ускорьте циклы разработки и выпускайте с уверенностью

Проблемы с Ansible

Где бы я ни пересекался с Ansible в своей профессиональной жизни, люди, использующие его, всегда сталкивались с одними и теми же проблемами. Хотя всем нужна установка Ansible, которая обеспечивает надежный, воспроизводимый и гибкий способ развертывания конфигурации и установки программного обеспечения на серверах (или виртуальных машинах), реальность такова, что это часто быстро превращается в переплетенный набор задач, ролей и сценариев. Трудно обеспечить высокое качество и сохранить его чистым и простым.

В основном я сталкивался со следующими ситуациями:

  • написание задач «вслепую» и последующее их применение к хостам; итерация, пока все не пройдет без ошибок
  • делать небольшие изменения в плейбуках или ролях, затем применять их к хостам, а затем забывать зафиксировать их в git
  • тестирование ваших ролей Ansible на существующих, настроенных хостах и ​​забвение зависимостей, необходимых для только что установленного хоста
  • создавать и запускать плейбуки со многими ролями, но никогда не тестировать роли независимо друг от друга и повторно использовать переменные в ролях или глобальные переменные, что затрудняет или почти делает невозможным запуск отдельных ролей, а затем решает эту проблему с помощью тегов для каждой роли.
  • запуск playbooks вручную и по запросу. Вызывает дрейф конфигурации на хостах, например, из-за отсутствия коммитов git.

Как избежать хаоса

Гибкость — это здорово, а способность быстро реагировать — ключевой элемент успеха в наши дни. Однако без некоторого базового разделения и руководств репозиторий Ansible может быстро стать монолитом технического отдела. Я был здесь.

Одна из самых важных вещей — написать отдельные повторно используемые роли. Даже если вы не собираетесь делиться ими в своей компании, это помогает сосредоточиться на цели этой конкретной роли. Как и в мире микросервисов, вы не хотите, чтобы одна роль отвечала за несколько вещей. Отдельный репозиторий для роли также позволяет разрабатывать и тестировать ее отдельно, чтобы обеспечить высокий стандарт качества.

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

Прежде чем изобретать велосипед, ознакомьтесь с ansible-galaxy общедоступными ролями с открытым исходным кодом, которые соответствуют вашим потребностям.

В ваших репозиториях playbook вы можете легко ссылаться на роли с помощью файла requirements.yml, а также на роли, извлеченные из git:

# ansible-galaxy install -r requirements.yml
roles:
  - name: geerlingguy.docker
    version: 4.2.4
  - name: https://github.com/MyOrganization/repo_name.git
    type: git
    version: master

Как обеспечить качество

Точно так же, как разработчики обеспечивают качество своих программных проектов с помощью git с конвейерами, которые анализируют, запускают тесты и создают артефакты, DevOps — или GitOps — может использовать те же принципы для обеспечения высококачественных, воспроизводимых и автоматизированных механизмов развертывания.

Основная философия здесь заключается в проверке результатов вашей работы, обычно «кода», в определенных воспроизводимых средах, чтобы убедиться, что он также работает для ваших коллег, а результаты надежны и воспроизводимы. После проверки воспроизводимых результатов вы готовы автоматизировать развертывание, чтобы обеспечить согласованное состояние всех ваших серверных парков или обнаружить отклонение конфигурации.

Представляем `DrPsychick/ansible-testing`

Molecule позволяет протестировать вашу роль Ansible на нескольких экземплярах, настроенных для теста. Хотя Molecule может запускать для вас контейнеры Docker, она фокусируется на запуске и тестировании ролей Ansible, а не на подготовке экземпляров для запуска тестов. Чтобы максимально упростить интеграцию в Molecule, я недавно опубликовал роль Ansible, которую вы можете использовать с Molecule для простого определения и предоставления экземпляров, необходимых для тестов, будь то Linux (Fedora, Ubuntu и т. д.) или Windows ( через libvirt).

Вот что вам нужно для следующих примеров:

  • Хост Linux с установленным Docker
  • sudo привилегии
  • Библиотеки Python molecule molecule-docker

Эта роль DrPsychick/ansible-testing отлично подходит для моих случаев использования, и я надеюсь, что она может сослужить вам хорошую службу. Если ваш вариант использования отличается или требует корректировок, внесите свой вклад в роль, создав задачи и открыв запросы на включение.



Начните тестирование за пять шагов

Выполнение этого практического «учебника» занимает всего пять минут. Когда вы закончите, у вас будет первая роль Linux Ansible, протестированная с помощью Molecule. Полный molecule test запуск с пустой ролью на двух экземплярах занимает около 30 секунд.

1. Создайте роль

Создайте новую пустую роль с помощью molecule.

molecule init role demo.testrole
cd testrole

Ограничения роли и пространства имен:

Пространство имен: https://galaxy.ansible.com/docs/contributing/namespaces.html#galaxy-namespace-limitations
Роль: https://galaxy.ansible.com/docs/contributing/creating_role. html#имя ролей

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

# creates and populates ./molecule/default/
molecule init scenario default

2. Получите пример молекулы с GitHub

Загрузите файлы примеров (https://github.com/DrPsychick/ansible-testing/tree/master/docs/molecule/default) с DrPsychick/ansible-testing для вашей роли:

for f in create destroy molecule requirements vars; do 
  curl -o molecule/default/$f.yml "https://raw.githubusercontent.com/DrPsychick/ansible-testing/master/docs/molecule/default/$f.yml"; 
done

Прежде чем запустить его, вы можете настроить molecule/default/vars.yml и molecule/default/molecule.yml в соответствии со своими потребностями, что позволит вам настроить роль DrPsychick/ansible-testing и определить экземпляры контейнера, на которых вы хотите протестировать.

# vars.yml
# a temporary directory that will be deleted with 'destroy'
work_dir: "/tmp/ansible-demo.testrole-default"
containers:
  - name: ubuntu2204
    os: ubuntu
    dockerfile: Dockerfile_Ubuntu
    files:
      - "entrypoint.sh"
    args:
      VERSION: 22.04

Убедитесь, что имена контейнеров соответствуют platforms в molecule.yml:

[...]
platforms:
  - name: ubuntu2204
[...]

3. Запустите молекулу на своей роли

Поскольку вы, вероятно, вошли в систему как пользователь, при первом запуске Molecule вы можете получить эту ошибку:

fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

Это связано с тем, что роль ansible-testing обеспечивает установку всех предварительных требований. Решите это, запустив sudo echo, а затем снова запустите Molecule.

# create instances (with DrPsychick/ansible-testing)
# this will take a while the first time, as it builds 
# the docker images.
# Once built, creating instances takes only seconds.
molecule create
# list instances or check systemd status
docker ps
docker exec -it ubuntu2204 systemctl status
# run your role on the instances
molecule converge
molecule idempotence

4. Развивайте свою роль

Теперь вы можете взломать и реализовать свою роль. Для одной или нескольких операционных систем или разновидностей. Запускайте molecule converge столько раз, сколько необходимо, чтобы убедиться, что ваши задачи выполняют то, что должны. Прежде чем закончить, убедитесь, что molecule test также работает без проблем, так как это гарантирует, что ваша роль будет работать на только что установленных экземплярах.

Также важно убедиться, что ваша роль является идемпотентной — это означает, что при повторном запуске она не сообщает о каких-либо изменениях. Почему это так важно? Когда вы позже автоматизируете выполнение Ansible, вы захотите определить целевое состояние для системы и хотите, чтобы все системы имели одинаковое состояние конфигурации.

Например, чтобы обнаружить дрейф конфигурации (конфигурация хоста отличается от желаемого состояния), вы можете запустить плейбук Ansible в режиме --check, чтобы посмотреть, будут ли внесены какие-либо изменения. Это возможно только в том случае, если ваша роль написана идемпотентным (и --check безопасным) способом.

Вы можете использовать molecule/default/prepare.yml для подготовки ваших экземпляров к вашей роли, если вам нужны определенные предварительные условия, такие как другие установленные роли. И вы можете использовать molecule/default/verify.yml для запуска задач в конце, чтобы убедиться, что конфигурация или установка вашей роли работает должным образом.

5. Запустите молекулу в своем пайплайне

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

Поскольку существует множество различных решений CI/CD, я кратко упомяну только требования для запуска Molecule (которые уже упоминались выше).

  • Python3 ansible ansible-lint docker molecule molecule-docker
  • Возможность запуска привилегированных контейнеров Docker в конвейере (возможно, с Docker-in-Docker, docker:dind)

Обновление от марта 2023 г. обязательно ознакомьтесь с моими ansible-runner изображениями, чтобы использовать Ansible в пайплайнах:



Внести вклад в `DrPsychick/ansible-testing`

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

Настроить роль в соответствии с вашими потребностями и использовать локальную версию очень просто:

  1. Форкнуть проект на GitHub
  2. Проверьте форк на вашем Linux-боксе
  3. Симлинк форка в вашем сценарии Molecule ролей (например, molecule/default )
  4. Закомментируйте роль в requirements.yml и удалите локальную копию

Теперь все molecule команд в вашем каталоге ролей будут использовать вашу локальную вилку.

Вот подробное описание: https://github.com/DrPsychick/ansible-testing#contributing.

Рекомендации









DrPsychick в Интернете
Простая «целевая страница
всех сайтов, на которых я нахожусь.drpsychick.org»



Спасибо за ваше время и интерес!

Want to Connect?
If you want to support me, sign up for Medium through my membership link: https://drpsychick.org/membership or visit me on GitHub.