25/07/2019
Времена меняются, системные администраторы постепенно становятся 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 инженера.