Архитектура 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, который легко читается даже без знания программирования. Это позволяет разработчикам и админам говорить на одном языке.
Сравнение с аналогами
| Инструмент | Тип | Агент | Язык | Назначение |
|---|---|---|---|---|
| Ansible | Config Mgmt | Нет (SSH) | YAML | Настройка серверов, деплой приложений, оркестрация |
| Terraform | Provisioning | Нет (API) | HCL | Создание инфраструктуры (AWS, VM, сети) |
| Chef/Puppet | Config Mgmt | Да | Ruby/DSL | Enterprise среды со строгим контролем состояния |
Правило: Используйте 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 │ │ │
└──────────────┘ └──────────────┘
- Парсинг: Ansible читает YAML-конфигурацию и инвентарь.
- Подключение: Устанавливает SSH-соединение с каждым хостом.
- Gather Facts: Собирает информацию о системе (OS, IP, CPU, RAM) в переменные
ansible_facts. - 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 |