
Содержание
Введение
Ansible - система управления конфигурациями, написанная на Python, с использованием декларативного языка разметки для описания конфигураций. Используется для автоматизации настройки и развертывания программного обеспечения.
Ansible - берет на себя всю работу по приведению удаленных серверов в необходимое состояние. Администратору необходимо лишь описать, как достичь этого состояния с помощью так называемых сценариев (playbooks; это аналог рецептов Chef). Такая технология позволяет очень быстро осуществлять переконфигурирования системы: достаточно всего лишь добавить несколько новых строк в сценарий.
Основные задачи
Основные задачи, которые решает Ansible:
- Управление конфигурациями. Максимально быстрая и правильная настройка серверов до описанной конфигурации.
- Провижнинг. Управление процессом развертывания новых облачных серверов (например через API, с помощью Docker или LXC).
- Развертывание. Инсталляция и обновление ваших приложений без простоя наилучшим образом.
- Оркестрация. Координация компонентов вашей инфраструктуры для выполнения развертываний. Например проверка, что веб-сервер отключен от балансировщика нагрузки, до апгрейда ПО на сервере.
- Мониторинг и уведомления.
- Логгирование. Централизованный сбор логов.
Плюсы Ansible
Преимущества Ansible по сравнению с другими аналогичными решениями (Puppet, Chef и Salt) заключается в следующем:
- на управляемые узлы не нужно устанавливать никакого дополнительного ПО, всё работает через SSH (в случае необходимости дополнительные модули можно взять из официального репозитория);
- код программы, написанный на Python, очень прост; при необходимости написание дополнительных модулей не составляет особого труда;
- язык, на котором пишутся сценарии, также предельно прост;
- низкий порог вхождения: обучиться работе с Ansible можно за очень короткое время;
- документация к продукту написана очень подробно и вместе с тем — просто и понятно; она регулярно обновляется;
- Ansible работает не только в режиме push, но и pull, как это делают большинство систем управления (Puppet, Chef);
- имеется возможность последовательного обновления состояния узлов (rolling update).
Установка
Требования для установки Ansible минимальны. На машине с которой производится управления должен быть установлен Python 2.6 или выше. На управляемых узлах должен быть установлен только Python версии не ниже 2.4, но он, как правило, по умолчанию включен в состав большинства дистрибутивов linux-систем.
Так же могут потребоваться следующие модули Python, устанавливаемые через pip или пакетный менеджер вашей операционной системы:
- paramiko;
- PyYAML;
- jinja2.
Установка Ansible в Ubuntu:
sudo add-apt-repository -y ppa:rquillo/ansible sudo apt-get update sudo apt-get install ansible -y
Установка Ansible в CentOS 7:
sudo rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm sudo yum -y update sudo yum -y install ansible
Остальные варианты и способы установки описаны в документации.
Как работает Ansible
Основная идея - наличие одного или нескольких управляющих серверов, из которых можно отправлять команды или наборы последовательных инструкций (playbooks) на удаленные сервера, подключаясь к ним по SSH.

Файл Host inventory (инвентарный файл)содержит информацию об обсуживаемых серверах, где команды будут исполнены. Файл конфигурации Ansible может быть полезен для указания настроек вашего окружения.
Наборы инструкций (playbooks) состоят из одной или более задач, которые описываются с помощью функциональности модуля ядра Ansible или сторонних модулей, которые могут потребоваться в специфических ситуациях. Сами по себе наборы инструкций - последовательные наборы команды, в которых могут быть проверки условий: если условие не выполняется, определенные команды могут пропускаться.
Так же можно использовать Ansible API для запуска скриптов. Если скрипту-обертке (wrapper) может потребоваться запуск playbook, это можно сделать через API. Сами playbooks описываются декларативно в формате YAML. Ansible поддерживает сценарии развертывания новых облачных серверов и конфигурирования их на основании ролей. Часть работы может быть проведена в локальном режиме на управляющем сервере, а остальная - на созданном сервере после его первой загрузки.
Настройка Ansible
Файл конфигурации описывается в INI-формате. Можно переопределить часть или всю конфигурацию в параметрах playbook или переменные окружения. При исполнении команд Ansible проверяет наличие файла конфигурации в следующих расположениях:
- Проверяется переменная окружения ANSIBLE_CONFIG, которая может указывать на файл конфигурации.
- ./ansible.cfg - в текущей директории
- ~/.ansible.cfg - в домашней директории
- /etc/ansible/ansible.cfg
Настройка через переменные окружения
Большинство параметров конфигурации можно устанавливать через переменные окружения, используя префикс ANSIBLE_ перед названием параметра конфигурации (большими буквами).
Например, export ANSIBLE_SUDO_USER=root
После этого переменная ANSIBLE_SUDO_USER может использована в playbook.
Создание конфигурационного файла
Создаем директорию, для примера - ansible и переходим в неё:
mkdir ~/ansible cd ~/ansible
Также создаем папку для хранения модулей Ansible и папку для хранения логов:
mkdir ~/ansible/modules mkdir ~/ansible/logs
Создаем файл ansible.cfg со следующим содержимым:
[defaults] hostfile = ~/ansible/inventory sudo_user = root log_path = ~/ansible/logs/ansible.log
Настройка ansible.cfg
Параметров конфигурации Ansible множество.
Некоторые из них:
- hostfile: Параметр указывает на путь к inventory file, в котором содержится список адресов хостов, к которым Ansible может подключиться. Например: hostfile = /etc/ansible/hosts
- library: Путь к директории, где хранятся модули Ansible. Например: library = /usr/share/ansible
- forks: Количество процессов, которые может породить Ansible. По-умолчанию установлено 5 процессов. Например: forks = 5
- sudo_user: Пользователь по умолчанию, от которого Ansible запускает команды на удаленных серверах. Например: sudo_user = root
- remote_port: Порт для соединения по SSH (по умолчанию 22). Например: remote_port = 22
- host_key_checking: Параметр позволяет отключить проверку SSH–ключа на хосте. По-умолчанию проверка выполняется. Например: host_key_checking = False
- timeout: Значение таймаута попытки подключения по SSH. Например: timeout = 60
- log_path: Путь для хранения файлов логов. По-умолчанию Ansible не хранит их совсем, но указав этот параметр можно активировать запись логов. Например: log_path = /var/log/ansible.log
Файл host inventory
Дефолтное расположение файла - /etc/ansible/hosts, но оно может также быть задано параметром окружения $ANSIBLE_HOSTS или параметром -i при запуске ansible и ansible-playbook. Содержимое этого файла может выглядеть, например, так (в квадратных скобках указаны имена групп управляемых узлов, ниже перечисляются входящие в эти группы серверы):
[dbservers] one.example.com two.example.com three.example.com [dnsservers] rs1.example.com ansible_ssh_port=1234 ansible_ssh_host=192.168.1.10 rs2.example.com
Если у есть большое количество серверов, использование соглашений о наименовании (например web001, web002 ... web00N) позволит проще указывать их в inventory. Можно использовать регулярные выражения в inventory файле:
[web] web[001:200] [db] db[001:020] [balancer] 192.168.2.[1:3]
, где web[001:200] будет соответствовать web 001, web002, web003, web004, ..., web199, web200 для группы web; db[001:020] будет соответствовать db001, db002, db003 ..., db019, db020 для группы db; 192.168.2.[1:3] будет соответствовать 192.168.2.1, 192.168.2.2, 192.168.2.3 для группы balancer.
Помимо списка управляемых узлов, в файле hosts могут быть указаны и другие сведения, необходимые для работы: номера портов для подключения по SSH, способ подключения, пароль для подключения по SSH, имя пользователя, объединения групп и т.п.
По структуре инвентарного файла: Ansible считает группой все, чья строка в описании начинается с '[' и заканчивается ']'. Все что под этой строчкой и до начала следующей группы - хосты. У группы могут быть дети - другие группы, которые перечисляются после [название группы:children].
[WEB:children] dbservers dnsservers
Во время деплоя, как правило, требуется не только установить какое-либо приложение, но и настроить его в соответствии с определенными параметрами на основании принадлежности к группе серверов или индивидуально. Загромождать файл hosts будет не очень красиво, поэтому разработчики Ansible пошли следующим путём:
- файлы с переменными групп хранятся в директории group_vars/имя_группы;
- файлы с переменными хостов в директории hosts_vars/имя_хоста;
- файлы с переменными роли (о них речь пойдет ниже) в директории имя_роли/vars/имя_задачи.yml;
Переменные в inventory–файле
Иногда может потребоваться использование специфических переменных для конкретной группы хостов или конкретного хоста.
Установка переменных для конкретных хостов:
web001 db001 db_name=mysql 192.168.2.1 db_name=redis db_port=6380
Установка переменных для группы хостов (web):
[web] web[001:010] [db] db[001:002] [web:vars] web_port=443
Переменные в отдельном файле для inventory
Можно создавать файлы переменных для хостов и для групп. Папки с этими файлами должны быть в одной директории с файлом inventory. Файлы переменных, относящихся к конкретным хостам, нужно сохранять в папку host_vars, относящиеся к конкретным группам - в папку group_vars.
Пример файла переменных для хоста web001 (~/ansible/host_vars/web001):
web_port_ssl=443 web_port=80
Пример файла переменных для группы db (~/ansible/group_vars/db):
db_port=6380 db_name=redis
Переменные inventory следуют иерархии: переменные в глобальном файле перегружают любые хост-переменные, групповые переменные и переменные в файле inventory. Хост-переменные перегружают групповые переменные, а в свою очередь групповые переменные перегружают переменные файла inventory.
Помимо пользовательских переменных можно (и даже нужно) использовать факты, собранные Ansible перед выполнением сценариев и отдельных задач.
Факты
Перед внесением изменений Ansible подключается к управляемым узлам и собирает информацию о них: о сетевых интерфейсах и их состоянии, об установленной операционной системе и т.п. Он может делать это как с помощью собственного модуля, так и с помощью инструментов ohai и facter, если они установлены (такая возможность специально предусмотрена для пользователей, уже имеющих опыт работы с системами удаленного управления конфигурациями: ohai и facter являются библиотеками фактов для Chef и Puppet). Все эти данные потом можно использовать в сценариях и шаблонах. Например, ip-адрес по-умолчанию можно получить, обратившись к переменной ansible_default_ipv4.
tasks: - debug: msg={{ansible_default_ipv4}}
$ ansible-playbook web.yml PLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** ok: [111.111.111.111] TASK: [debug msg="{{ansible_default_ipv4}}"] ********************************** ok: [111.111.111.111] => { "msg": "{u'macaddress': u'06:a8:07:41:47:a5', u'network': u'172.31.0.0', u'mtu': 9001, u'alias': u'eth0', u'netmask': u'255.255.240.0', u'address': u'172.31.7.80', u'interface': u'eth0', u'type': u'ether', u'gateway': u'172.31.0.1'}" }
Примеры простых задач
Общая структура использования команд выглядит вот так:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
С помощью Ansible можно одновременно выполнить одну задачу на целой группе серверов. Отправим запрос на ping на серверы выбранной группы:
$ ansible dnsservers -m ping dns1.example.com | success >> { "changed": false, "ping": "pong" } dns2.example.com | success >> { "changed": false, "ping": "pong" }
Если модуль (ключ -m) не задан, то используется модуль command. Фактически, ansible можно использовать не только как систему управления конфигурацией, но и как фреймворк для распределенного выполнения команд.
$ ansible -i hosts -a "ls -lah" all localhost | success | rc=0 >> total 12K drwxr-xr-x 5 brun staff 170 Apr 1 11:50 . drwxr-xr-x 91 brun staff 3.1K Apr 1 11:37 .. -rw-r--r-- 1 brun staff 230 Apr 1 12:07 export.sh -rw-r--r-- 1 brun staff 42 Apr 3 14:48 hosts -rw-r--r-- 1 brun staff 376 Apr 1 12:49 playbook.yml
Ansible позволяет не только выполнять единичные задачи, но и писать сценарии, которые необходимо выполнить на управляемых узлах. Рассмотрим структуру и правила написания таких сценариев более подробно.
Список источников
- Официальная документация по Ansible
- Система управления Ansible
- Ansible - давайте попробуем
- Администрирование Ansible
- Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 1: Введение
- Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 3: Переменные и файл inventory