Ansible: конфигурация и деплой
(Раздел: Технологии и Инфраструктура)
Краткое резюме
Ansible — декларативный инструмент конфигураций и оркестрации, идеально подходящий для повторяемой настройки VM/хостов, сервисов и приложений, когда инфраструктура уже создана (Terraform/IaC) и нужно «оживить» окружение: установить пакеты, выкатить релиз, прокатить шаблоны, перезапустить сервисы без даунтайма, применить политики безопасности. Ключ к успеху: модульная структура (роли/коллекции), строгая идемпотентность, аккуратная работа с секретами (Vault), динамические инвентари, тестирование и GitOps-дисциплина.
Когда уместен Ansible (и как он сочетается с Terraform)
Terraform — создает ресурсы (VPC, кластеры, БД).
Ansible — конфигурирует ОС/ПО, выкатывает версии, гоняет миграции, правит файлы и сервисы.
Связка: Terraform выводит `inventory`/IP/секреты в артефакты, Ansible читает их в CD-шаге.
Структура репозитория (рекомендуемый шаблон)
ansible/
inventories/
prod/
inventory. ini # or inventory. yaml group_vars/
all. yml web. yml db. yml host_vars/
web-01. yml stage/
...
roles/
webapp/
defaults/main. yml vars/main. yml tasks/main. yml handlers/main. yml templates/.j2 files/
meta/main. yml hardening/
...
playbooks/
site. yml deploy_webapp. yml hardening. yml collections/requirements. yml ansible. cfg
ansible.cfg (минимум):
ini
[defaults]
inventory = inventories/stage/inventory. ini stdout_callback = yaml callbacks_enabled = timer, profile_tasks interpreter_python = auto retry_files_enabled = False forks = 25 host_key_checking = True
Инвентари: статические и динамические
Статический (ini):ini
[web]
web-01 ansible_host=10. 0. 1. 10 web-02 ansible_host=10. 0. 1. 11
[db]
db-01 ansible_host=10. 0. 2. 10
[all:vars]
ansible_user=ansible ansible_ssh_common_args='-o ProxyJump=bastion@1. 2. 3. 4'
Динамический
Используйте плагины облака (или собственный скрипт), чтобы подтягивать хосты по тегам. Переменные окружений/тегов → `group_vars`.
Роли и коллекции
Роль = независимый модуль повторного использования (задачи, файлы, шаблоны, хэндлеры).
Коллекции — набор ролей/плагинов/модулей. Пины версий фиксируйте в `collections/requirements.yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks: идемпотентные сценарии
Пример общего плейбука:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
Роль `webapp` (фрагменты):
yaml roles/webapp/tasks/main. yml
- name: Install packages:
name: ["nginx", "python3-venv"]
state: present
- name: Template configuration template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: "0644"
notify: Restart nginx
- name: unarchive artifact deploy:
src: "{{ webapp_package_url }}" # артефакт из CI dest: /opt/webapp remote_src: true creates: /opt/webapp/current
- name: Link to the current version of file:
src: "/opt/webapp/releases/{{ release_id }}"
dest: /opt/webapp/current state: link notify: Reload webapp
Хэндлеры:
yaml roles/webapp/handlers/main. yml
- name: Restart nginx service: { name: nginx, state: restarted }
- name: Reload webapp systemd: { name: webapp, state: reloaded, daemon_reload: true }
Шаблоны Jinja2 и переменные
Храните дефолтные переменные в `defaults/main.yml`, чувствительные — в Vault.
Используйте фильтры (`| to_nice_yaml`, `| b64encode`, `| default`) и условия `when`.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Секреты: Ansible Vault и менеджеры секретов
Vault для шифрования файлов переменных (`group_vars/all.vault.yml`).
Лучше читать секреты из внешних менеджеров (KMS/Secrets Manager/SSM) через соответствующие модули и хранить в Vault только ссылки/ARN.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Рекомендации:
- Разделите доступ: разработчики видят dev/stage, прод — только CI.
- Включите ротацию секретов и аудит доступа.
Идемпотентность и корректные изменения
Используйте модули (`package`, `user`, `lineinfile`, `template`, `systemd`) вместо `shell/command`.
Помечайте «шумные» задачи `changed_when: false`, если они ничего не меняют.
Поддерживайте check mode (`--check`) и diff для ролей.
Для нестабильных задач: `retries`, `delay`, `until`.
yaml
- name: Wait for HTTP uri availability:
url: "http://localhost/health"
status_code: 200 register: health retries: 10 delay: 5 until: health. status == 200
Производительность: большие фермы и пики
forks: поднимите параллелизм (с осторожностью: не перегрузите цель).
strategy = free — выполняйте задачи без ожидания соседей.
pipelining = True в `ansible.cfg` уменьшает RTT.
gather_facts: false там, где факты не нужны.
async/poll для длительных операций; throttle/serial для волн деплоя.
delegate_to и run_once для единичных действий (например, миграция БД).
Паттерны нулевого даунтайма
Rolling-деплой (по 20%)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
Запустите плейбук с `--limit web-canary` (подмножество группы), проверьте метрики, затем раскатите на всю группу.
Blue-Green
Две группы хостов `web_blue` и `web_green`; плейбуком готовите новую волну, далее переключаете трафик (DNS/LB) задачей `community.general.affiliate_lb`/API вашего балансировщика.
Безопасность и hardening
Роль hardening: SSH-политики, баннеры, `sudo` без NOPASSWD, файервол, auditd/rsyslog, время-NTP, `fail2ban`.
Включайте SELinux/AppArmor, управляйте политиками через модули.
Бастион: ограничьте SSH к целям только через jump-host (см. `ProxyJump`).
Минимизируйте `become: true`; оформляйте RBAC на уровне инвентарей (кто может запускать какие плейбуки).
Windows и сетевое оборудование
Windows: модули `win_`, подключение по WinRM, PowerShell-скрипты — как последний аргумент.
Network: `network_cli`/`httpapi`, модули для Cisco/Juniper/F5; атомарность через `save_when: changed`.
Тестирование и качество
ansible-lint + yamllint в CI.
Molecule: локальные/контейнерные тесты ролей, проверка идемпотентности (двойной прогон без изменений).
Песочница: отдельные временные инвентари/образы VM.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
Интеграция с CI/CD и GitOps
Типовой пайплайн:1. Lint → Syntax check → Molecule.
2. Построение артефактов приложения.
3. Deploy: `ansible-playbook -i inventories/prod site.yml --limit web --tags deploy`.
4. Репорт по измененным хостам, артефакт логов.
Пример шага (концепт):bash ansible-galaxy collection install -r collections/requirements. yml ansible-lint ansible-playbook playbooks/deploy_webapp. yml \
-i inventories/prod/inventory. ini \
-e release_id=${GIT_SHA} --diff
Наблюдаемость и аудит
Подключите callback-плагины (json/yaml/timer/profile_tasks) — отчеты по времени и изменениям.
Сохраняйте логи плейбуков в централизованное хранилище.
Маркируйте задачи `tags:` для выборочных запусков и ускорения расследований.
Частые рецепты для iGaming
Web/API нода: Nginx + systemd-юнит, health-checks, secrets из менеджера, roll-restart.
Game-сервисы: шаблоны конфигов по регионам/тенантам через `group_vars`.
Платежные коннекторы: строгие пермишены на ключи, перезапуск по notify, пост-проверка эндпоинтов.
ETL-джобы: развертывание CronJob-скриптов c `cron` модулем, idempotent lock-файл.
Мониторинг: установка агентов (node_exporter/otelcol), авто-регистрация в мониторинге.
Антипаттерны
Использование `shell/command` там, где есть модуль.
Плейбуки без `handlers` → лишние рестарты и дрожание сервисов.
Хранение секретов в открытых `group_vars`.
Отсутствие `serial`/`max_fail_percentage` при деплое прод-волн.
Глобальное `gather_facts: true` и `become: true` без необходимости.
Роли без тестов Molecule и без поддержки `--check`.
Долгие команды без `async/poll`, блокирующие всю волну.
Чек-лист внедрения
1. Согласуйте каркас репозитория и naming-конвенции.
2. Настройте динамический инвентарь и bastion.
3. Завести роли (webapp/hardening/monitoring) и пин версии коллекций.
4. Включить Vault и/или интеграцию с менеджером секретов.
5. Обеспечить идемпотентность, `--check/--diff`, handlers и теги.
6. Подключить ansible-lint, yamllint, Molecule в CI.
7. Описать паттерн деплоя (rolling/canary/blue-green) и лимиты `serial`.
8. Добавить callback-плагины, сбор логов, отчет об изменениях.
9. Документировать runbook-и отката и действия при инцидентах.
10. Регулярно проводить game-day: обрыв SSH, падение ноды, откат версии.
Итоги
Ansible закрывает «последнюю милю» между созданной инфраструктурой и работающим продом: быстрые, безопасные и предсказуемые изменения конфигураций и релизов. С ролью как минимальной единицей повторного использования, динамическими инвентарями, корректной работой с секретами и выверенными паттернами нулевого даунтайма Ansible помогает iGaming-командам сократить Time-to-Deploy, уменьшить количество ночных инцидентов и держать p99 на уровне SLO.