International conference of developers
and users of free / open source software

Test environment configuration with Ansible.

Викентий Лапа, Минск, Belarus

LVEE 2014

Integration testing assume frequent changes in test environment such as application installation, configuration for every software build, for defects verification and reproduction. This task is not very complicated but monotonous and it complexity increases with number of hosts in test environment. Manually it can be solved only on one small range of hosts less than ten, because configuration time increases with number of nodes and can't be parallel for only person. As solution for test environment deployment it is suggestion to use Ansible configuration management application. In this presentation we review pros and cons of this product and present basic application functionality with practical examples used in testing.

Сегодня существуют десятки различных систем для управления конфигурациями. Среди них есть как проекты, которые получили широкое распространение и хорошо известны (Chef, Puppet, Salt), так и относительно новые системы. О возможностях системы управления конфигурациями Ansible и пойдет речь в данном докладе.

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

Типичная конфигурация, с которой нам приходится иметь дело, представляет собой 6 компьютеров, а ее время жизни составляет 3-5 дней. Постоянно мы используем 5 систем т.е. всего 30 компьютеров. Поскольку процесс тестирования предполагает частую реконфигурацию систем, либо при выходе новых версий ПО, либо для верификации/воспроизведении дефектов, то необходимо этот процесс автоматизировать. Отметим, что при ручной установке сложность и время установки возрастает с ростом количества хостов, и при этом параллельно можно конфигурировать до 10 узлов. Естественным решением является применение автоматизации – либо разработкой собственного средства на каком-то языке программирования, либо с помощью готового приложения. Так нами было выбрано приложение Ansible. Ее главное отличие от аналогичных систем управления конфигурациями – это отсутствие единого сервера для управления и отсутствие специального агента на хостах. Минимально необходимые требования к хосту – сервер SSH и Python 2.6. Минусом такого подхода является то, что скорость выполнения задач зависит от скорости установления соединения с узлом; однако есть дополнительные режимы для ускорения.

Для описания конфигурации систем используются два типа файлов с описанием хостов (inventory) и файлы задач (playbooks).

Inventory-файл является простым INI-файлом, хранит информацию об одном узле, группе узлов, содержит переменные, объединения узлов и группы по заданному шаблону, параметры соединения (порт, имя пользователя, IP адрес). В нашем случае мы создали 5 групп, по группе на тестовое окружение, и эти группы в свою очередь разделили на группы серверов и клиентов. Например, такое разделение позволяет применить индивидуальные настройки на серверах и общие настройки на всю группу.

Второй важный файл – это сборник заданий (playbook). Это тестовый файл в формате YAML, где описаны действия, которые будут применяться к каждому хосту, а также указана группа хостов для конфигурации. Все действия описываются именем задачи и именем модуля с параметрами. Сборник заданий можно организовать в нескольких файлах, что позволяет использовать задания повторно. В заданиях поддерживаются дополнительные элементы – такие как циклы, условные выражения, переменные.

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

  • установка публичных ключей;
  • заполнение файлов конфигурации;
  • копирование вспомогательных скриптов для тестирования.

Иногда стандартных модулей недостаточно. Пример – конфигурация сетевых интерфейсов. По скольку в Ansible заложены возможности по дополнению функционала  системы с помощью интерфейса модулей, плагинов, либо скриптов, то можно использовать различные варианты для решения этой задачи. Так изначально использовался написанный ранее bash-скрипт. Позже по мере изучения возможностей приложения эта задача была реализована нами с использованием циклов, модуля templates и переменных узлов. Также эту задачу можно реализовать в виде дополнительного модуля на любом языке программирования. Но в нашем случае предпочтение отдается Python, т.к. это позволяет использовать стандартную библиотеку Ansible, которая содержит функции для написания модулей.

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

Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license

Back