Ansible

Материал из llmdocs — справочник разработчика
Портал: Git, CI/CD, DevOps
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.

Как работает

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

См. также

Источники

  1. Ansible Documentation
  2. Ansible Docs — Getting started
  3. Ansible Docs — Intro to playbooks
  4. Ansible Docs — How to build your inventory
  5. Ansible Docs — Protecting sensitive data with Ansible Vault
  6. Red Hat — Red Hat to acquire IT automation leader Ansible (2015)