Архитектура Ansible

TL;DR: Ansible — безагентный инструмент автоматизации (SSH + Python). Push-модель: Control Node подключается к серверам, копирует Python-модуль, выполняет, удаляет. Идемпотентность: повторный запуск безопасен.

Ansible — инструмент автоматизации IT-инфраструктуры (Configuration Management). Он описывает состояние серверов в виде кода (Infrastructure as Code) и автоматически приводит их к этому состоянию.

Ключевые особенности

1. Agentless (Безагентный)

Ansible не требует установки агентов на управляемые серверы. Всё, что нужно — SSH и Python (который есть почти везде).

  • Плюс: Лёгкий старт, меньше нагрузки на серверы, меньше уязвимостей.
  • Минус: Медленнее на тысячах хостов по сравнению с агентскими системами (Chef/Puppet), но это решается через strategy: free, forks и масштабирование контроллеров.

2. Декларативный подход (Идемпотентность)

Вы описываете желаемое состояние, а не набор команд.

  • Пример: «Пакет nginx должен быть установлен».
  • Работа: Если пакета нет — Ansible его установит. Если пакет уже есть — ничего не сделает (статус ok).

Это свойство называется идемпотентностью: повторный запуск playbook безопасен и не сломает уже настроенный сервер.

3. Простота (YAML)

Конфигурации (Playbooks) пишутся на YAML, который легко читается даже без знания программирования. Это позволяет разработчикам и админам говорить на одном языке.

Сравнение с аналогами

ИнструментТипАгентЯзыкНазначение
AnsibleConfig MgmtНет (SSH)YAMLНастройка серверов, деплой приложений, оркестрация
TerraformProvisioningНет (API)HCLСоздание инфраструктуры (AWS, VM, сети)
Chef/PuppetConfig MgmtДаRuby/DSLEnterprise среды со строгим контролем состояния

Правило: Используйте Terraform для создания виртуальных машин (железа), Ansible — для их настройки и установки софта внутри.

Компоненты

1. Control Node (Управляющий узел)

Компьютер или сервер, где установлен Ansible и хранятся playbooks.

  • Требования: Linux/macOS (Windows не поддерживается нативно, используйте WSL2), Python 3.10+.
  • Отсюда запускаются команды ansible, ansible-playbook.

2. Managed Nodes (Управляемые узлы)

Серверы, которые вы настраиваете (Target Hosts).

  • Требования: SSH-сервер, Python 2.7+ или 3.5+ (для выполнения модулей).
  • Ansible не оставляет на них никаких демонов после завершения работы.

3. Inventory (Инвентарь)

База данных хостов. Может быть статическим файлом (hosts.yaml) или динамическим скриптом (плагин для AWS/GCP).

4. Modules (Модули)

Небольшие программы (обычно на Python), которые выполняют работу.

  • Ansible копирует модуль на удалённый сервер.
  • Запускает его.
  • Получает JSON-ответ.
  • Удаляет модуль.

Процесс выполнения Playbook

Control Node                      Managed Node
┌──────────────┐     SSH         ┌──────────────┐
│  ansible-    │ ──────────────→ │  sshd        │
│  playbook    │                 │              │
│              │  1. Gather Facts │              │
│  Парсинг     │ ──────────────→ │  setup.py    │
│  YAML +      │ ←── JSON ────── │  (факты)     │
│  Inventory   │                 │              │
│              │  2. Copy module  │              │
│              │ ──────────────→ │  apt.py      │
│              │  3. Execute     │  (задача)    │
│              │ ←── JSON ────── │              │
│              │  4. Cleanup     │              │
│  Результат:  │ ──────────────→ │  rm tmp/     │
│  ok/changed/ │                 │              │
│  failed      │                 │              │
└──────────────┘                 └──────────────┘
  1. Парсинг: Ansible читает YAML-конфигурацию и инвентарь.
  2. Подключение: Устанавливает SSH-соединение с каждым хостом.
  3. Gather Facts: Собирает информацию о системе (OS, IP, CPU, RAM) в переменные ansible_facts.
  4. Task Execution: Для каждой задачи:
    • Генерирует Python-скрипт с параметрами задачи.
    • Копирует на целевой сервер (в ~/.ansible/tmp).
    • Исполняет через Python-интерпретатор.
    • Получает JSON-ответ (ok/changed/failed).
    • Удаляет временный файл.

Подводные камни

ЗаблуждениеРеальность
«Ansible — замена Terraform»Ansible для настройки серверов, Terraform — для создания инфраструктуры. Используй оба
«Идемпотентность гарантирована»Модули shell и command не идемпотентны по умолчанию. Используй creates: / removes:
«SSH медленный на 100+ хостов»Увеличить forks (по умолчанию 5), использовать strategy: free, включить pipelining
«Ansible работает на Windows»Control Node — только Linux/macOS. Managed Nodes на Windows — через WinRM, не SSH