Найти в Дзене
Infra as Code по-русски

Ansible: задачи, модули, шаблоны и хендлеры — примеры

Аннотация. Ansible — это простой способ автоматизировать администрирование: от установки пакетов до раскатки конфигов. В статье разберём, что такое Ansible, какой протокол она использует, альтернативы, из чего состоит экосистема (инвентарь, плейбуки, задачи, роли и т. д.) и как поставить Ansible на Ubuntu 24.04. В конце — что будет в следующих материалах серии. 📦 Исходники: весь код и примеры из этой и следующих статей — в репозитории — 🐙 GitHub: https://github.com/IaC-in-Russian/infra-as-code-ru Ansible — инструмент конфигурационного управления и оркестрации, который позволяет описывать состояние инфраструктуры в виде кода (YAML).
Протоколы: Мини-аналогия: вы отправляете «рецепт» по SSH, целевая машина готовит блюдо ровно по инструкции и ничего лишнего. Список хостов и групп. Поддерживает INI/YAML и динамические инвентари. inventory/hosts.ini: ### App example ### [app_dev_example] app-1.dev.example app-2.dev.example app-3.dev.example ### App dev ### [app_dev:children] app_dev_examp
Оглавление

Аннотация. Ansible — это простой способ автоматизировать администрирование: от установки пакетов до раскатки конфигов. В статье разберём, что такое Ansible, какой протокол она использует, альтернативы, из чего состоит экосистема (инвентарь, плейбуки, задачи, роли и т. д.) и как поставить Ansible на Ubuntu 24.04. В конце — что будет в следующих материалах серии.

📦 Исходники: весь код и примеры из этой и следующих статей — в репозитории — 🐙 GitHub: https://github.com/IaC-in-Russian/infra-as-code-ru

Зачем Ansible и как он общается с серверами

Ansible — инструмент конфигурационного управления и оркестрации, который позволяет описывать состояние инфраструктуры в виде кода (YAML).

Протоколы:

  • по умолчанию — SSH (Linux/Unix), агенты на целевых хостах не нужны;
  • для Windows — WinRM (HTTP/HTTPS);
  • для сетевых устройств — надстройки (например, network_cli, httpapi).
Мини-аналогия: вы отправляете «рецепт» по SSH, целевая машина готовит блюдо ровно по инструкции и ничего лишнего.

Чем Ansible похож и чем отличается от альтернатив

  • SaltStack — также агент/безагент-режим, быстрые «шины» событий; чуть сложнее порог входа.
  • Puppet/Chef — классические CM-системы с агентами и сервером; сильные политики соответствия, но выше сложность.
  • Terraform — не замена, а «сосед»: управляет облачными ресурсами (IaC), а Ansible отлично дополняет его пост-конфигурацией виртуалок/сервисов.

Из чего состоит Ansible (с примерами)

Инвентарь (inventory)

Список хостов и групп. Поддерживает INI/YAML и динамические инвентари.

inventory/hosts.ini:

### App example ###
[app_dev_example]
app-1.dev.example
app-2.dev.example
app-3.dev.example
### App dev ###
[app_dev:children]
app_dev_example
### App all ###
[app:children]
app_dev

Плейбуки (playbooks)

Плейбук — файл сценария. Он состоит из разделов (play): в каждом разделе указаны целевые хосты и список задач, которые Ansible выполнит на них.

site.yml:

- name: Базовая настройка серверов
hosts: all
become: true
tasks:
- name: Установить htop
ansible.builtin.apt:
name: htop
state: present
update_cache: true

Задачи (tasks)

Одна операция = один модуль с параметрами.

- name: Создать каталог для логов
ansible.builtin.file:
path: /var/log/myapp
state: directory
owner: root
group: root
mode: '0755'

Роли (roles)

Переиспользуемые блоки: структура каталога + логика.

roles/
common/
tasks/main.yml
handlers/main.yml
templates/motd.j2
vars/main.yml

roles/common/tasks/main.yml:

- name: Обновить кеш и установить полезные пакеты
ansible.builtin.apt:
name: [htop, curl]
state: present
update_cache: true
notify: Перезапустить rsyslog

roles/common/handlers/main.yml:

- name: Перезапустить rsyslog
ansible.builtin.service:
name: rsyslog
state: restarted

Подключаем роль в плейбуке:

- hosts: all
become: true
roles:
- role: common

Обработчики (handlers)

Запускаются по notify только когда что-то изменилось (экономят перезапуски).

См. пример выше: notify: Перезапустить rsyslog → handler выполнится, если apt реально что-то установил/обновил.

Шаблоны (templates)

Файлы Jinja2 с подстановкой переменных.

roles/common/templates/motd.j2:

Welcome to {{ inventory_hostname }}
Env: {{ group_names | join(', ') }}

Применение:

- name: MOTD из шаблона
ansible.builtin.template:
src: motd.j2
dest: /etc/motd
mode: '0644'

Переменные (vars)

Можно хранить в group_vars, host_vars, внутри ролей, передавать через -e.

group_vars/prod.yml:

timezone: "Europe/Berlin"
packages_common: [htop, curl]

Использование:

- name: Установить общие пакеты
ansible.builtin.apt:
name: "{{ packages_common }}"
state: present

Модули (modules)

«Стандартная библиотека» действий: apt, yum, service, copy, user, uri, git, lineinfile и сотни других.

Установка Ansible на Ubuntu 24.04 и проверка

ℹ️ Небольшое примечание. В этой статье и далее в новых статьях все команды будут приведены для Ubuntu 24.04

Шаг 1. Установить из репозитория Ubuntu

sudo apt update
sudo apt install -y ansible

Шаг 2. Проверить версию

ansible --version

Ожидаем увидеть путь к ansible.cfg, версию ansible/ansible-core и интерпретатор Python.

Шаг 3. Быстрый «ping» по localhost (без инвентаря)

ansible all -i 'localhost,' -c local -m ping

Должно вернуть SUCCESS с pong.

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

  • Нужен доступ по SSH к целевым хостам (ключи, ~/.ssh/config, sudo).
  • На целевых Linux-хостах должен быть Python (обычно уже есть в Ubuntu).
  • Если видите ошибки прав — добавьте --become (и настройте sudoers).

Почему это работает

Ansible отправляет на хост минимальные Python-скрипты модулей по SSH, исполняет их с заданными параметрами и возвращает результат.

Идемпотентность модулей обеспечивает повторяемость: если состояние уже достигнуто, изменений не будет (зелёные «ok» вместо «changed»). Описывая что должно быть, а не как пошагово сделать, мы получаем декларативный стиль и предсказуемость.

Итог и чеклист

Что сделали:

  • Разобрали, что такое Ansible и как она общается (SSH/WinRM).
  • Посмотрели компоненты: инвентарь, плейбуки, задачи, роли, handlers, шаблоны, переменные, модули — с мини-примерами.
  • Поставили Ansible на Ubuntu 24.04 и проверили запуском ping.

Сделать прямо сейчас:

  1. sudo apt install -y ansible
  2. Создать inventory/hosts.yml с группами prod/dev.
  3. Выполнить ansible all -i inventory/hosts.yml -m ping.
  4. Создать site.yml с одной-двумя задачами (apt, file).
  5. Вынести логику в роль roles/common.

CTA: Подписывайтесь на серию — дальше настроим ansible.cfg, оформим hosts.yml и сделаем первый осознанный ansible all -m ping с разбором вывода и типичных ошибок. А пока открой репозиторий с примерами — https://github.com/IaC-in-Russian/infra-as-code-ru