Ansible - система управления конфигурацией, которая позволяет декларативно управлять состоянием различных процессов и использует язык программирования Python для своей работы.
Минимальными требованиями для работы Ansible являются доступ к машине по ssh и пакет Python в операционной системе, что является достаточным для работы с конфигурируемыми компонентами. Действия могут выполняться как локально на хосте где запускается Ansible так и на удаленном сервере.
Для описания сценариев конфигурации используется YAML, который позволяет просто и лаконично описывать необходимую конфигурацию сервисов. Кроме того Ansible содержит множество модулей, которые позволяют взаимодействовать с различными конфигурируемыми компонентами такими как базы данных, пакетные менеджеры, инструменты управления виртуализацией и так далее
Основными компонентами Ansible являются роли, плейбуки и инвентари.
├── defaults
│ ├── main.yml
├── meta
│ ├── main.yml
│ ├── argument_specs.yml
│ └── ...
├── tasks
│ ├── main.yml
│ ├── debian.yml
│ └── ...
├── README.MD
В папке defaults распологаются параметры переменных по умолчанию, которые выставляются в случае если они не были переданы при вызове роли.
В папке meta хранится метаинформация о роли, а также файл argument_specs, который выполняет валидацию аргументов, выставление их параметров по умолчанию в случае отстутствия и установке флага обязательной для переменной, в случае чего без передачи данной переменной в роль она выдаст ошибку.
В папке tasks хранится информация о задачах которые необходимо выполнить для настройки компонента, также можно настраивать
Плейбуки же представляют собой набор конечных идемпотентных действий, которые должны быть выполнены на одном или нескольких целевых устройствах.
Пример плейбука:
- name: Run one task
hosts: vms
tasks:
- name: Say hello to miem
ansible.builtin.debug:
msg: 'Hello MIEM!'
Данный плейбук выполняет команду echo на сервере с именем vms, которая выводит строку "Hello MIEM!".
Результат выглядит следующим образом
PLAY [Run one task] ************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [debian]
TASK [Say hello to miem] *******************************************************************************************
ok: [debian] => {
"msg": "Hello MIEM!"
}
PLAY RECAP *********************************************************************************************************
debian : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Для гибкой и удобной работы с широким набором хостов и передачи им параметров используются инвентари. Инвентарь представляет собой в самом простейшем виде списком хостов в заданной инфраструктуре используя их группирование, что позволяет запускать задачи на множестве хостов.
С помощью инвентаря можно гибко выбирать только те хосты которые относятся к нужной группе. Кроме того хосты в инвентаре могут быть записаны с помощью алиасов, а не ip адресов, что повышает их читаемость.
Не менее важной функциональностью инвентарей являются динамические инвентари, они позволяют формировать инвентарь автоматически из различных источников. Инвентари могут быть заданы в форматах INI либо YAML, но в нашем проекте мы отдали предпочтение YAML в связи с необходимостью в единообразии конфигурации.
Пример инвентаря
all:
children:
miem:
children:
servers:
hosts:
server1:
server2:
vms:
hosts:
vm1:
vm2: