Аннотация. 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.
Сделать прямо сейчас:
- sudo apt install -y ansible
- Создать inventory/hosts.yml с группами prod/dev.
- Выполнить ansible all -i inventory/hosts.yml -m ping.
- Создать site.yml с одной-двумя задачами (apt, file).
- Вынести логику в роль roles/common.
CTA: Подписывайтесь на серию — дальше настроим ansible.cfg, оформим hosts.yml и сделаем первый осознанный ansible all -m ping с разбором вывода и типичных ошибок. А пока открой репозиторий с примерами — https://github.com/IaC-in-Russian/infra-as-code-ru