The Inside Playbook

by moiseevrus

Разработка и тестирование ролей Ansible с помощью Molecule и Podman — часть 1

Одним из достоинств Red Hat Ansible Automation Platform является то, что язык описания автоматизации понятен не только нескольким профильным экспертам, но и практически всем участникам ИТ-экосистемы. Это означает, что все ИТ-специалисты могут принимать участие в автоматизации, обеспечивая совместную работу нескольких команд и реально продвигая автоматизацию как культуру внутри организации. Поскольку так много людей участвуют в автоматизации, крайне важно тщательно протестировать содержание автоматизации. Поэтому при разработке нового контента Ansible, например сборников сценариев, ролей и коллекций, рекомендуется протестировать контент в тестовой среде, прежде чем использовать его для автоматизации производственной инфраструктуры. Тестирование гарантирует, что автоматизация работает так, как задумано, и позволяет избежать неприятных сюрпризов в будущем.

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

Согласно официальной документации , Molecule — это проект:

 «предназначен для помощи в разработке и тестировании ролей Ansible. Это поощряет подход, который приводит к последовательно разработанным ролям, которые хорошо написаны, легко понятны и поддерживаются».

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

В этой серии из двух частей мы будем использовать Molecule для разработки и тестирования новой роли Ansible. Первая статья проведет вас через установку и настройку Molecule. Во второй части мы будем использовать Molecule для разработки роли.

Если эта роль является частью коллекции, используйте этот подход для разработки и «модульного» тестирования роли. В следующей статье мы увидим, как использовать Molecule для запуска интегрированных тестов в коллекции.

Molecule использует драйверы для предоставления тестовых экземпляров с использованием различных технологий, включая контейнеры Linux, виртуальные машины и облачных провайдеров. По умолчанию он поставляется с тремя предустановленными драйверами: драйверами Docker и Podman для управления контейнерами и Delegated, который позволяет настроить интеграцию. Драйверы для других поставщиков доступны через сообщество с открытым исходным кодом.

В этой статье мы будем использовать драйвер Podman для разработки и тестирования новой роли с использованием контейнеров Linux. Podman — это легкий контейнерный движок для Linux, который не требует запущенного демона и позволяет запускать контейнеры в режиме «без рута» для повышения безопасности.

Используя Molecule с драйвером Podman, мы разработаем и протестируем новую роль Ansible с нуля. Эта базовая роль развертывает веб-приложение, поддерживаемое веб-сервером Apache. Он должен работать в операционных системах Red Hat Enterprise Linux (RHEL) 8 или Ubuntu 20.04.

В этом примере показан распространенный сценарий, в котором ожидается, что роль будет работать в разных версиях операционных систем. Использование контейнеров Podman и Linux позволяет нам создавать множество экземпляров для тестирования роли с конкретными требуемыми версиями. Поскольку контейнеры легкие, они также позволяют нам быстро перебирать функциональные возможности роли при ее разработке. В этой ситуации применимо использование контейнеров для тестирования ролей, поскольку роль настраивает только работающие экземпляры Linux. Чтобы протестировать другие сценарии подготовки или облачную инфраструктуру, мы можем использовать делегированный драйвер или другой подходящий драйвер, предоставленный сообществом.

 

Что вам нужно?

Чтобы следовать этому руководству, используйте физическую или виртуальную машину под управлением Linux с установленными Python 3 и Podman. В этих примерах мы используем RHEL 8.2. Вам также необходимо настроить Podman для запуска контейнеров без рута. Установка Podman выходит за рамки этого блога, поэтому для получения дополнительной информации обратитесь к официальной документации . Чтобы установить Podman на RHEL 8, вы также можете ознакомиться с документацией по контейнеру RHEL 8 .

 

Начиная

Molecule доступен в виде пакета Python, поэтому его можно установить через pip. В качестве первого шага мы создаем выделенную среду Python для нашей установки Molecule и устанавливаем ее туда:

$ mkdir molecule-blog
$ cd molecule-blog
$ python3 -m venv molecule-venv
$ source molecule-venv/bin/activate
(molecule-venv) $ pip install "molecule[lint]"

Обратите внимание, что мы установили Molecule с опцией «lint». Используя эту опцию, pip также установил инструменты «yamllint» и «ansible-lint», которые позволяют вам использовать Molecule для выполнения статического анализа кода вашей роли, обеспечивая его соответствие стандартам кодирования Ansible.

При установке загружаются все зависимости из Интернета, включая Ansible. Проверьте установленную версию:

$ molecule --version
molecule 3.0.4
   ansible==2.9.10 python==3.6

Далее воспользуемся командой «молекула» для инициализации новой роли Ansible.

 

Инициализация новой роли Ansible

Вообще говоря, при разработке новой роли Ansible вы инициализируете ее, запустив команду «ansible-galaxy role init». В этом случае вместо этого используйте «молекулу» для инициализации новой роли. Сделав это, вы получите ту же структуру ролей, что и команда «ansible-galaxy», и базовый шаблонный код, необходимый для запуска тестов Molecule.

По умолчанию Molecule использует драйвер Docker для выполнения тестов. Поскольку мы хотим выполнять тесты с использованием «podman», нам нужно указать имя драйвера с помощью параметра «–driver-name=podman» при инициализации роли с «молекулой».

Вернитесь в каталог «molecule-blog» и инициализируйте новую роль «mywebapp» с помощью этой команды:

$ molecule init role mywebapp --driver-name=podman
--> Initializing new role mywebapp...
Initialized role in /home/ricardo/molecule-blog/mywebapp successfully.

Molecule создала структуру для вашей новой роли в каталоге с именем «mywebapp». Перейдите в этот каталог и проверьте содержимое, созданное Molecule:

$ cd mywebapp
$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── converge.yml
│       ├── INSTALL.rst
│       ├── molecule.yml
│       └── verify.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
 
10 directories, 12 files

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

Проверьте базовую конфигурацию в файле «molecule/default/molecule.yml»:

$ cat molecule/default/molecule.yml 
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: instance
    image: docker.io/pycontribs/centos:7
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible

Согласно нашим требованиям, этот файл указывает драйвер Podman для тестов. Он также определяет «экземпляр» платформы по умолчанию с использованием образа контейнера «docker.io/pycontribs/centos:7», который вы измените позже.

В отличие от Molecule v2, Molecule v3 по умолчанию не определяет линтер. Откройте файл конфигурации «molecule/default/molecule.yml» с помощью вашего любимого редактора, чтобы включить конфигурацию lint в конце:

$ vi molecule/default/molecule.yml
...
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .

Сохраните и закройте файл конфигурации. Запустите «molecule lint» из корня проекта, чтобы проверить весь проект:

$ molecule lint

Эта команда возвращает несколько ошибок, поскольку в файле «meta/main.yml» отсутствуют некоторые обязательные значения. Исправьте эти проблемы, отредактировав файл «meta/main.yml», добавив «автор», «компания», «лицензия», «платформы» и удалив пустую строку в конце. Без комментариев — для краткости — «meta/main.yaml» выглядит так:

$ vi meta/main.yml
galaxy_info:
  author: Ricardo Gerardi
  description: Mywebapp role deploys a sample web app 
  company: Red Hat 
 
  license: MIT 
 
  min_ansible_version: 2.9
 
  platforms:
  - name: rhel
    versions:
    - 8 
  - name: ubuntu
    versions:
    - 20.04
 
  galaxy_tags: []
 
dependencies: []

Теперь повторите проверку проекта и убедитесь, что на этот раз ошибок нет.

$ molecule lint
--> Test matrix
    
└── default
    ├── dependency
    └── lint
    
--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'lint'
--> Executing: set -e
yamllint .
ansible-lint . 

Роль инициализирована, и базовая конфигурация молекулы установлена. Далее давайте настроим тестовые экземпляры.

 

Настройка экземпляров

По умолчанию Molecule определяет один экземпляр с именем «экземпляр», используя образ «Centos: 7». Согласно нашим требованиям, мы хотим, чтобы наша роль работала с RHEL 8 и Ubuntu 20.04. Кроме того, поскольку эта роль запускает веб-сервер Apache как системную службу, нам необходимо использовать образы контейнеров, которые включают «systemd».

Red Hat предоставляет официальный универсальный базовый образ для RHEL 8, который включает «systemd»:

  • registry.access.redhat.com/ubi8/ubi-init

Для Ubuntu нет официальных образов с поддержкой «systemd», поэтому мы будем использовать образ, поддерживаемый Джеффом Герлингом из сообщества открытого исходного кода Ansible:

  • geerlingguy/docker-ubuntu2004-ansible

Чтобы включить экземпляры «systemd», измените файл конфигурации «molecule/default/molecule.yml», удалите экземпляр «centos: 7» и добавьте два новых экземпляра.

$ vi molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: rhel8
    image: registry.access.redhat.com/ubi8/ubi-init
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/usr/sbin/init"
    pre_build_image: true
  - name: ubuntu
    image: geerlingguy/docker-ubuntu2004-ansible
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/lib/systemd/systemd"
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .

С этими параметрами мы монтируем временную файловую систему «/run» и «/tmp», а также том «cgroup» для каждого экземпляра. Мы также включаем возможность «SYS_ADMIN», так как они необходимы для запуска контейнера с Systemd.

Кроме того, если вы следуете этому руководству на компьютере с RHEL 8 с включенным SELinux — как и должно быть — вам нужно установить логическое значение «container_manage_cgroup» в значение true, чтобы контейнеры могли запускать Systemd. Дополнительные сведения см. в документации RHEL 8 :

sudo setsebool -P container_manage_cgroup 1

Molecule использует Ansible Playbook для предоставления этих экземпляров. Измените и добавьте параметры для подготовки, изменив словарь «provisioner» в файле конфигурации «molecule/default/molecule.yml». Он принимает те же параметры конфигурации, что и в файле конфигурации Ansible «ansible.cfg». Например, обновите конфигурацию поставщика, добавив раздел «по умолчанию». Установите для интерпретатора Python значение «auto_silent», чтобы предотвратить появление предупреждений. Включите плагины обратного вызова «profile_tasks», «timer» и «yaml», чтобы выводить информацию о профилировании с выводом playbook. Затем добавьте раздел «ssh_connection» и отключите конвейерную обработку SSH, поскольку она не работает с Podman:

provisioner:
  name: ansible
  config_options:
    defaults:
      interpreter_python: auto_silent
      callback_whitelist: profile_tasks, timer, yaml
    ssh_connection:
      pipelining: false

Сохраните файл конфигурации и создайте экземпляры, запустив «Molecule Create» из корневого каталога роли:

$ molecule create

Molecule запускает сценарий подготовки и создает оба экземпляра. Вы можете проверить экземпляры, запустив «список молекул»:

$ molecule list
Instance Name    Driver Name    Provisioner Name    Scenario Name    Created    Converged
---------------  -------------  ------------------  ---------------  ---------  -----------
rhel8            podman         ansible             default          true       false
ubuntu           podman         ansible             default          true       false

Вы также можете убедиться, что оба контейнера работают в Podman:

$ podman ps
CONTAINER ID  IMAGE                                                   COMMAND               CREATED             STATUS                 PORTS  NAMES
2e2f14eaa37b  docker.io/geerlingguy/docker-ubuntu2004-ansible:latest  /lib/systemd/syst...  About a minute ago  Up About a minute ago         ubuntu
2ce0a0ea8692  registry.access.redhat.com/ubi8/ubi-init:latest         /usr/sbin/init        About a minute ago  Up About a minute ago         rhel8

При разработке роли Molecule использует запущенные экземпляры для ее тестирования. В случае сбоя теста или ошибки, вызывающей необратимое изменение, требующее повторного запуска, удалите эти экземпляры, запустив «Molecule destroy» и воссоздайте их с помощью «Molecule create» в любое время.

You may also like

Leave a Comment