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

25/07/2019

moleucle img

Времена меняются, системные администраторы постепенно становятся DevOps-ами. И соответственно в работу администратора постепенно проникают элементы программирования и QA тестирования. Так при написании Ansible ролей, можно самому проверять их с использованием виртуальных машин или используя автоматизацию на Vagrant. Однако, программный продукт Molecule позволяет еще более комплексно автоматизировать процесс тестирования. А кроме того добавляет возможность по созданию собственных функциональных тестов с помощью модулей testinfra и pytest. То есть мало того, что Molecule автоматически проверит работоспособность действий из Ansible роли, но и запустит специфичные тесты, которые придется написать нам самим, по проверке состояния тех или иных частей системы, после отработки роли. Таким образом, часть нашей работы превращается в настоящее QA тестирование. И что самое интересно, это необходимая работа, без которой не обойтись в современных реалиях. Ansible роли могут применяться на сотнях и тысячах серверах, их полноценное тестирование просто необходимо для дальнейшей спокойной работы.

TDD – Test Driven Development, подход к работе при котором происходит постоянное тестирование для проверки работоспособности программного кода. В нашем случае использование Molecule для Ansible ролей позволяет вести профессиональную их разработку по методике TDD. Это обеспечивает постоянную целостность и корректность создаваемого кода.

Программное обеспечение Molecule представляют собой модуль, написанный на языке программирования Python. Он устанавливается через менеджер python модулей – pip. Molecule для своей работы требует также такие модули как testinfra, pytest, docker и ряд других. По умолчанию тестирование проводится на контейнерах docker. То есть на машине, где установливается Molecule, также должен присутствовать рабочий Docker. Также декларируются возможности проведения тестов и на других платформах, например, через тот же Vagrant. Для простоты и удобства сейчас посмотрим как все это работает с контейнерами Docker.

Установка и использование

Сама по себе установка Molecule не сложна и производится через менеджер модулей Python – PIP. При этом подразумевается, что уже на этом хосте установлен Ansible и Docker. Docker используется Molecule по умолчанию для проведения тестов. Библиотека Python – docker обеспечивает взаимосвязь Molecule с докером соответственно.

# python -m pip install molecule docker

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

Теперь создадим необходимую структуру файлов в директории существующей Ansible роли для Molecule. Это делается следующей командной.

# molecule init scenario -r ansible-role

Мы получим следующую структуру добавленных файлов в роли

# tree ./molecule/
./molecule/
`-- default
    |-- Dockerfile.j2
    |-- INSTALL.rst
    |-- molecule.yml
    |-- playbook.yml
    `-- tests
        |-- __pycache__
        `-- test_default.py                 

Нам необходимо немного подредактировать файл molecule.yml. В этом файле содержатся основные настройки Molecule, которые используются при проведении тестов для роли. Пример файла привожу ниже.

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: centos7
    image: milcom/centos7-systemd
    privileged: true
provisioner:
  name: ansible
  lint:
    name: ansible-lint
verifier:
  name: testinfra
  lint:
    name: flake8         

В файле можно видеть, что в качестве платформы для тестов мы будем использоваться docker, а также задействовать конкретный образ контейнера milcom/centos7-systemd, для имитации работы Centos 7. Теперь можно проверить базовую работу роли с помощью следующей команды.

# molecule test

Все команды, мы конечно же запускаем из директории нашей Ansible роли. Результатом должна стать првоерка коректности работы роли, ее идемпотентности и прочих свойств.

Тесты с помощью testinfra

Изюминкой в Molecule является создание собственных тестов для проверки конкретных вещей после отработки роли Ansible. Это может быть проверка наличие определенного файла, корректность конвертации формата данных, или доступность нужного сервиса. Для этого используется модули testinfra и pytest. Пример файла ./molecule/default/tests/test_default.py с конкретными тестами приведен ниже.

import os
import pytest

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')


@pytest.mark.parametrize('pkg', [
  'somepkg'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

    assert package.is_installed


@pytest.mark.parametrize('svc', [
  'someservice'
])
def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled


@pytest.mark.parametrize('cfg', [
  '/etc/someservice/someservice.start',
  '/etc/someservice/someservice.stop'
])
def test_config_file(host, cfg):
    f = host.file(cfg)
    assert f.exists
    assert f.is_file         

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

Заключение

Подход к работе как DevOps заключается в объединении в своей деятельности навыков администрирования, программирования и тестирования. Molecule в данном случае выступает в виде инструмента QA тестирования, и является составной частью работы DevOps инженера. Таким образом, вопросы тестирования становятся неотъемлимой частью работы IT инженера.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *