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.