Сегодня мы рассмотрим Ansible, софт для удаленного управления конфигурацией сервера. Также обсудим его сильные стороны и ответим на вопрос: Стоит ли его использовать?
Что такое Ansible?
Ansible представляет собой ПО с открытым исходным кодом, которое предназначено для управления конфигурацией. Данный софт был создан в 2012 году Майклом Де Хааном. Фактически Ansible принимает на себя все задачи по приведению удаленных машин в желаемое состояние. Таким образом пользователю потребуется лишь указать, способ работы. Для этого используются сценарии. На практике упомянутое ПО позволяет просто и быстро переконфигурировать систему.
Почему Ansible?
Существует очень много аналогов Ansible, например, Chef, Salt и Puppet. Однако он выделяется на их фоне следующими преимуществами:
- Функционирует сразу в двух режимах (push и pull), а не в одном;
- Понятный язык написания сценариев;
- Не требует установки дополнительного софта на контролируемые узлы, так как все задачи выполняются с помощью SSH;
- Освоить ПО и начать работу с Ansible можно за очень короткое время;
- Позволяет последовательно обновлять состояния узлов;
- Имеет подробную и актуальную документацию;
- Реализована на базе Python, что упрощает написание дополнительных модулей.
Установка
Для установки Ansible потребуется Python версии 2.6 или же выше. Когда речь касается требований к узлам, то на них должен стоять Python 2.4. Также в список рекомендованных модулей для Python входит jinja2, paramiko и PyYAML. Чтобы установить Ansible на Ubuntu нужно использовать добавить репозиторий и установить пакет. Это выглядит следующим образом:
sudo add-apt-repository -y ppa:rquillo/ansible
sudo apt-get update
sudo apt-get install ansible -y
Группы серверов
Чтобы передать Ansible список групп серверов для управления потребуется использовать один из двух методов:
- Текстовый файл, который мы опишем ниже;
- Сторонним скриптом, который возвращает необходимую для нас группу серверов. Готовые скрипты есть для многих известных облачных провайдеров и приложений можно найти в интернете.
Файл hosts
По умолчанию файл hosts расположен тут – /etc/ansible/hosts. Однако его расположение можно поменять с помощью параметра окружения $ANSIBLE_HOSTS. Документ может иметь такой вид:
[group_name1]
one.node.com
two.node.com
three.node.com
[group_name2]
rs1.node.com ansible_ssh_port=5555 ansible_ssh_host=192.168.1.24
rs2.node.com
ns[01:24].node.com
Также в файл hosts можно прописать имена пользователей, номера портов для подключения через SSH и прочее. Если ваш рабочий процесс осуществляется с сложными и крупными конфигурациями, то подобные характеристики рекомендуется переносить в отдельные документы и каталоги.
Переменные
Мы уже обсуждали раньше, что вносить много информации в файл hosts не рационально, так что создатели Ansible решили эту проблему и предложили хранить файлы с определенным типом переменных в разных директориях:
- для ролей: “role_name/vars/task_name.yml”;
- для групп: “group_vars/group_name”;
- для хостов: “hosts_vars/host_name”
Модули Ansible
Под развертывание, управление и контроль за компонентами в Ansible предусмотрено большое количество модулей. Все модули можно разделить на следующие группы:
- Взаимодействие с утилитами;
- Контроль пакетов;
- Сетевая инфраструктура;
- Виртуализация и облачный софт;
- Файлы;
- Базы данных;
- Система;
- Мониторинг.
Примеры простых задач
Благодаря Ansible открывается возможность одновременного выполнения одного процесса на сразу нескольких хостах одновременно. В качестве примера мы отправим запрос ping
на группу серверов:
$ ansible dnsservers -m ping
dns1.node.com | success >> {
"changed": false,
"ping": "pong"
}
dns2.node.com | success >> {
"changed": false,
"ping": "pong"
}
А теперь создадим логический том под названием “volume” в группе “group”:
$ ansible dnsservers -m lvol -a "vg=group lv=volume size=1024 state=present"
dns1.node.com | success >> {
"changed": true,
"msg": ""
}
dns2.node.com | success >> {
"changed": false,
"msg": ""
}
Cценарии (playbooks)
Для создания собственного сценария в данной утилите вам понадобятся знания YAML. Он выделяется простотой в сравнении с JSON и XML. В открытом доступе можно найти сценарии практически под любые задачи.
Для запуска сценария используйте команду ansible-playbook
по следующему правилу:
ansible-playbook <file_name.yml> ... [дополнительные аргументы]
Каждый сценарий начинается с трех дефисов «---», что в формате YAML указывает начало документа. Для обозначения нового элемента списка ставьте дефис:
---
- hosts: webservers
Основные элементы базового сценария включают:
- hosts — определяет узлы или группы узлов, к которым применяются задачи;
- tasks — описывает желаемое состояние узла. Вместо узлов можно использовать роли.
Шаблонизация
За шаблонизацию в Ansbile отвечает Jinja2. Ниже примеры легких шаблонов:
# IPv4-адрес для просмотра powerdns
local-address={{ ansible_default_ipv4.address }}
# IPv6-адрес для просмотра powerdns
local-ipv6={{ ansible_default_ipv6.address }}
Контроль выполнения
Достаточно важный элемент. Давайте представим, что при работе со сценарием вам потребовалось мониторить переменные или состояния и относительно результата выполнять или пропускать действия. В таком случае нам потребуется оператор “when”:
tasks:
# сохраняем файл шаблона и результат задачи в переменную last_result
- template: src=/templates/foo.j2 dest=/etc/foo.conf
register: last_result
# проверяем переменную last_result.changed, true - выполняем, иначе - пропускаем
- command: echo 'the file has changed'
when: last_result.changed
Делегирование задачи другому хосту
Есть моменты, когда задачу, предназначенную для одного узла, нужно выполнить от имени другого. К примеру, при обновлении сервера может понадобиться приостановить его мониторинг, который настроен на другом сервере. В таких ситуациях пригодится директива delegate_to
. Рассмотрим пример:
- name: disable nagios alerts for this host webserver service
nagios: action=disable_alerts host={{inventory_hostname}} services=dnsserver
delegate_to: mon_host.node.com
В результате сообщения для dnsserver будут отключены.
Роли
Роль — это стандартный набор переменных и задач, который можно присвоить одному или нескольким серверам. Если требуется применить к серверу или группе серверов стандартные операции, просто присвойте им соответствующую роль. Однако убедитесь, что в каталоге вашего проекта создана нужная структура для этой роли.
Ansible AWX
Если вам нужна панель управления Ansible, то просто установите Ansibleworks AWX с официального сайта. Она удобна и проста в использовании. Но полное управление Ansible возможно и через командную строку, как это и было сделано в нашем обзоре.
Заключение
По большей части ПО Ansible очень простое в использовании, однако это не мешает быть ему эффективным инструментом для удаленного контроля конфигураций.