Ansible
| Тип | система управления конфигурацией |
|---|---|
| Автор | Майкл Деан (Michael DeHaan) |
| Первый выпуск | 2012 |
| Владелец | Red Hat (с октября 2015), часть IBM |
| Язык | Python |
| Лицензия | GPL 3.0 |
| Транспорт | SSH (Linux), WinRM/SSH (Windows), API сетевых устройств |
| Описание задач | YAML + шаблоны Jinja2 |
| Распространение | ansible-core + коллекции (Ansible Galaxy) |
Ansible — система автоматизации и управления конфигурацией серверов. Она подключается к машинам по SSH и выполняет на них задачи, описанные в YAML-файлах — плейбуках: установить пакеты, разложить конфигурационные файлы, создать пользователей, перезапустить службы, выкатить новую версию приложения.[1] Главные отличия от предшественников (Puppet, Chef) — отсутствие агентов на управляемых машинах и низкий порог входа: достаточно Python на серверах и доступа по SSH.
История
Ansible создал Майкл Деан, ранее работавший над Cobbler и Func в Red Hat; первый выпуск состоялся в 2012 году. Простота быстро принесла проекту популярность, и в октябре 2015 года Red Hat купила компанию Ansible Inc.[6] В 2020 году проект разделили на минимальное ядро ansible-core и коллекции — пакеты модулей и плагинов для отдельных платформ, распространяемые через Ansible Galaxy. Коммерческая версия с веб-интерфейсом и планировщиком — Red Hat Ansible Automation Platform, её открытый аналог — AWX.
Как работает
- На управляющей машине (ноутбук, сервер CI) запускается
ansible-playbook. - Ansible читает инвентарь — список хостов и групп.[4]
- Для каждой задачи он копирует на хост небольшой Python-модуль по SSH, выполняет его и удаляет; модуль возвращает JSON с результатом.
- Задачи идут по порядку, на всех хостах группы параллельно (по умолчанию по 5 одновременно, параметр
forks).
Ключевое свойство — идемпотентность: модуль сначала проверяет текущее состояние и вносит изменения только при необходимости. Повторный запуск плейбука на уже настроенном сервере ничего не меняет и отчитывается changed=0. Поэтому плейбук описывает желаемое состояние, а не последовательность команд (см. Infrastructure as Code).
Инвентарь и плейбук
# inventory.ini
[web]
web1.example.com
web2.example.com ansible_user=deploy
[db]
db1.example.com
# site.yml
- name: Настроить веб-серверы
hosts: web
become: true # sudo
vars:
app_port: 8000
tasks:
- name: Установить nginx
ansible.builtin.apt:
name: nginx
state: present
update_cache: true
- name: Разложить конфигурацию
ansible.builtin.template:
src: templates/site.conf.j2
dest: /etc/nginx/conf.d/site.conf
notify: Перезагрузить nginx
- name: Включить и запустить nginx
ansible.builtin.systemd:
name: nginx
enabled: true
state: started
handlers:
- name: Перезагрузить nginx
ansible.builtin.systemd:
name: nginx
state: reloaded
Обработчики (handlers) выполняются один раз в конце, и только если задача, вызвавшая их через notify, что-то изменила: nginx перезагрузится лишь при реальной смене конфигурации. Шаблоны пишутся на Jinja2 и получают переменные хоста, группы и факты — собранные Ansible сведения о системе (ОС, IP-адреса, память).[3]
Команды
ansible all -i inventory.ini -m ansible.builtin.ping # проверить доступность
ansible web -i inventory.ini -a "uptime" # разовая команда
ansible-playbook -i inventory.ini site.yml --check --diff # «сухой прогон» с показом изменений
ansible-playbook -i inventory.ini site.yml --limit web1.example.com --tags nginx
ansible-galaxy collection install community.postgresql
ansible-vault encrypt group_vars/prod/secrets.yml
Роли и переиспользование
Роль — стандартная структура каталогов (tasks/, handlers/, templates/, defaults/, vars/), упаковывающая настройку одного компонента: «nginx», «postgres», «пользователи». Роли и коллекции публикуются в Ansible Galaxy. Переменные можно задавать на многих уровнях — в инвентаре, group_vars/, host_vars/, в роли, в командной строке; порядок их приоритета — частый источник путаницы.
Секреты шифруют Ansible Vault: файлы с паролями хранятся в Git зашифрованными AES-256 и расшифровываются при запуске по паролю или ключу.[5]
Место среди инструментов
| Задача | Типичный инструмент |
|---|---|
| Создать облачные ресурсы | Terraform и OpenTofu |
| Настроить ОС и программы на серверах | Ansible, Puppet, Chef, Salt |
| Запустить приложения в контейнерах | Docker Compose, Kubernetes |
Ansible часто вызывают после Terraform: тот создаёт виртуальные машины, а Ansible их настраивает. Минусы — невысокая скорость на сотнях хостов (каждая задача — отдельное SSH-подключение, частично смягчается конвейеризацией и Mitogen), отсутствие хранимого состояния (удалённая из плейбука задача не отменяет уже сделанного) и сложность отладки больших YAML-проектов. Для проверки ролей используют ansible-lint и Molecule.