# Ansible

> Безагентная система управления конфигурацией и автоматизации — по SSH выполняет на серверах идемпотентные задачи, описанные в YAML-плейбуках.

Источник: https://llmdocs.ru/wiki/ansible/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: система управления конфигурацией
- **Автор**: Майкл Деан (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](https://llmdocs.ru/wiki/ssh.md) и выполняет на них задачи, описанные в 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.

## Как работает

1. На **управляющей машине** (ноутбук, сервер CI) запускается `ansible-playbook`.
2. Ansible читает **инвентарь** — список хостов и групп.[4]
3. Для каждой задачи он копирует на хост небольшой Python-модуль по SSH, выполняет его и удаляет; модуль возвращает JSON с результатом.
4. Задачи идут по порядку, на всех хостах группы параллельно (по умолчанию по 5 одновременно, параметр `forks`).

Ключевое свойство — **идемпотентность**: модуль сначала проверяет текущее состояние и вносит изменения только при необходимости. Повторный запуск плейбука на уже настроенном сервере ничего не меняет и отчитывается `changed=0`. Поэтому плейбук описывает желаемое состояние, а не последовательность команд (см. [Infrastructure as Code](https://llmdocs.ru/wiki/infrastructure-as-code.md)).

## Инвентарь и плейбук

```ini
# inventory.ini
[web]
web1.example.com
web2.example.com ansible_user=deploy

[db]
db1.example.com
```

```yaml
# 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](https://llmdocs.ru/wiki/nginx.md) перезагрузится лишь при реальной смене конфигурации. Шаблоны пишутся на Jinja2 и получают переменные хоста, группы и **факты** — собранные Ansible сведения о системе (ОС, IP-адреса, память).[3]

## Команды

```bash
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](https://llmdocs.ru/wiki/terraform-opentofu.md) |
| Настроить ОС и программы на серверах | Ansible, Puppet, Chef, Salt |
| Запустить приложения в контейнерах | [Docker Compose](https://llmdocs.ru/wiki/docker-compose.md), [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md) |

Ansible часто вызывают после Terraform: тот создаёт виртуальные машины, а Ansible их настраивает. Минусы — невысокая скорость на сотнях хостов (каждая задача — отдельное SSH-подключение, частично смягчается конвейеризацией и Mitogen), отсутствие хранимого состояния (удалённая из плейбука задача не отменяет уже сделанного) и сложность отладки больших YAML-проектов. Для проверки ролей используют ansible-lint и Molecule.

## См. также

- [Infrastructure as Code](https://llmdocs.ru/wiki/infrastructure-as-code.md)
- [Terraform и OpenTofu](https://llmdocs.ru/wiki/terraform-opentofu.md)
- [systemd](https://llmdocs.ru/wiki/systemd.md)
- [Управление секретами](https://llmdocs.ru/wiki/secrets-management.md)

## Источники

1. [Ansible Documentation](https://docs.ansible.com/)
2. [Ansible Docs — Getting started](https://docs.ansible.com/ansible/latest/getting_started/)
3. [Ansible Docs — Intro to playbooks](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_intro.html)
4. [Ansible Docs — How to build your inventory](https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html)
5. [Ansible Docs — Protecting sensitive data with Ansible Vault](https://docs.ansible.com/ansible/latest/vault_guide/index.html)
6. [Red Hat — Red Hat to acquire IT automation leader Ansible (2015)](https://www.redhat.com/en/about/press-releases/red-hat-acquire-it-automation-and-devops-leader-ansible)
