Ansible для начинающих: установка и примеры playbook

Содержание
- Что такое Ansible простыми словами
- Как работает Ansible: Архитектура
- Компоненты:
- Основные принципы:
- Установка Ansible на разных системах
- Ubuntu / Debian
- ALT Linux
- CentOS
- Инвентарь в Ansible: что это такое?
- Первый playbook — установка Nginx
- Переменные и шаблоны в Ansible: как работают и зачем нужны
- Что такое переменные (vars_files)
- Что такое шаблоны (template)
- Что такое handler (обработчик)
- Полный playbook с шаблоном, переменной и handler-ом
- Что такое роли в Ansible
- Полезные модули Ansible
- Условные задачи и теги в Ansible
- when: выполнение задач при условии
- tags: выбор задач для выполнения
- Когда это особенно полезно:
- Отладка и лучшие практики
- Отладка
- Best Practices
- Примеры автоматизации
- Обновление всех пакетов
- Добавление пользователя
- Заключение
Что такое Ansible простыми словами
Ansible — мощный инструмент для автоматизации и управления конфигурацией серверов. В этом руководстве вы узнаете, как установить Ansible, написать первый playbook, использовать переменные и шаблоны, а также научитесь работать с ролями и условными задачами.
Преимущества Ansible:
- Не требует установки агентов на серверах — достаточно SSH-доступа
- Использует простой формат файлов — YAML
- Подходит даже для новичков в системном администрировании
- Отлично масштабируется от одного до сотен серверов
Как работает Ansible: Архитектура
Компоненты:
- Контроллер — основной компьютер, где установлен Ansible. С него выполняются команды.
- Управляемые узлы — это сервера, на которые Ansible подключается по SSH и выполняет задачи. На них не нужно ничего устанавливать.
Основные принципы:
- Управление осуществляется через SSH.
- Задачи описываются в playbook-файлах (
*.yml
) на языке YAML. - Ansible работает идемпотентно — не повторяет действия, если они уже выполнены.
Установка Ansible на разных системах
Ubuntu / Debian
sudo apt update -y
sudo apt install -y ansible
ALT Linux
sudo apt-get update -y
sudo apt-get install -y ansible
CentOS
sudo dnf update -y
sudo dnf install -y python3 python3-pip
sudo pip3 install ansible
echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.bashrc
source ~/.bashrc
RedOS
sudo dnf update -y
sudo dnf install -y ansible
Проверка версии:
ansible --version
Инвентарь в Ansible: что это такое?
Inventory-файл — это список серверов, с которыми будет работать Ansible.
Пример hosts
:
[webservers]
192.168.1.165
192.168.1.244
[dbservers]
192.168.1.52
Каждая секция ([webservers]
, [dbservers]
) — это группа серверов, к которой можно обращаться из playbook.
Проверка подключения:
sudo ansible all -m ping -i hosts
Если видите pong
, значит подключение по SSH работает.
Важно: должен быть настроен доступ по SSH-ключу. Подробнее об этом в статье: SSH: настройка, безопасность и продвинутые техники — полный гайд
Первый playbook — установка Nginx
Что такое playbook?
Playbook — это основной способ описания действий в Ansible. Он представляет собой YAML-файл, в котором пошагово указываются задачи, выполняемые на серверах.
Рассмотрим пример простого playbook-а, устанавливающего и запускающего Nginx на серверах из группы webservers
.
Создаём nginx.yml
:
---
- name: Установка Nginx на веб-серверах
hosts: webservers
become: yes
tasks:
- name: Установить nginx
apt:
name: nginx
state: present
- name: Убедиться, что nginx запущен
service:
name: nginx
state: started
enabled: yes
Разбор компонентов playbook-а
- name:
— название блока задач. Не влияет на выполнение, но улучшает читаемость вывода.hosts:
— определяет, на каких группах или хостах из файлаhosts
выполнять задачи.become: yes
— включает выполнение команд с повышенными правами (аналогsudo
).tasks:
— список задач, которые будут выполнены последовательно.apt:
— модуль для работы с пакетами в Debian-подобных системах.name: nginx
— имя пакета, который нужно установить.state: present
— пакет должен быть установлен.
service:
— модуль управления сервисами.name: nginx
— имя сервиса.state: started
— сервис должен быть запущен.enabled: yes
— запускать сервис автоматически при старте системы.
Запуск
sudo ansible-playbook -i hosts nginx.yml
Переменные и шаблоны в Ansible: как работают и зачем нужны
При работе с Ansible часто возникает необходимость подставлять значения в конфиги, не копируя одинаковые playbook-и с разными цифрами и строками. Для этого используются:
- переменные (хранят данные)
- шаблоны (файлы с подстановками)
- handlers (обработчики событий, которые реагируют на изменения)
Что такое переменные (vars_files)
Переменные в Ansible — это способ вынести значения в отдельные YAML-файлы. Это делает код чище и позволяет использовать одни и те же playbook-и в разных окружениях (dev/stage/prod и т.д.).
Создаём файл vars.yml
:
nginx_port: 8080
Здесь мы определили переменную
nginx_port
со значением8080
. Мы позже подставим её в конфиг nginx через шаблон.
Что такое шаблоны (template)
Ansible поддерживает шаблонизацию через Jinja2 — это простой шаблонный движок. В шаблоне ты можешь писать обычный текст и вставлять переменные вот так: {{ nginx_port }}
.
Пример шаблона nginx.conf.j2
:
server {
listen {{ nginx_port }};
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
}
Что такое handler (обработчик)
Handler — это блок, который срабатывает только если его вызвали через notify
.
Например, мы копируем новый конфиг nginx — и только если файл изменился, мы хотим перезапустить nginx. Для этого и нужны handler-ы.
Полный playbook с шаблоном, переменной и handler-ом
---
- name: Настройка Nginx с шаблоном
hosts: webservers
become: yes
vars_files:
- vars.yml
tasks:
- name: Копировать шаблон nginx.conf
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: Перезапустить nginx
handlers:
- name: Перезапустить nginx
service:
name: nginx
state: restarted
Что здесь происходит:
vars_files
подключает файл с переменными (vars.yml
).- Модуль
template
копирует файл-шаблон, подставляя значения переменных. - Если файл конфигурации поменялся, вызывается handler через
notify
. - Handler перезапускает nginx.
Почему это удобно:
- Не нужно вручную редактировать конфиги под каждый сервер.
- Ansible сам решит, перезапускать сервис или нет (если конфиг не поменялся — ничего не делает).
- Повышается читаемость и гибкость — переменные можно менять, не трогая основной playbook.
Что такое роли в Ansible
Когда проект становится большим, разделяйте playbook-и на роли. Это повышает читаемость и повторное использование кода.
Создание роли:
ansible-galaxy init nginx
Структура:
roles/
└── nginx/
├── tasks/
├── handlers/
├── templates/
├── files/
├── vars/
├── defaults/
├── meta/
└── README.md
Пример tasks/main.yml
:
- name: Установить nginx
apt:
name: nginx
state: present
Основной playbook с ролью:
- hosts: webservers
become: yes
roles:
- nginx
Обязательна только папка
tasks
с файломmain.yml
.
Полезные модули Ansible
Модуль | Назначение |
---|---|
apt / yum |
Установка пакетов |
copy |
Копирование файлов |
template |
Копирование шаблонов с переменными |
service |
Управление сервисами |
file |
Управление правами, владельцами, файлами |
command |
Выполнение команды (без оболочки) |
shell |
Выполнение команд через оболочку (bash, sh и т.д.) |
Используйте
command
, если не нужны оболочные возможности (&&
, переменные и т.д.)
Условные задачи и теги в Ansible
when: выполнение задач при условии
Иногда задачу нужно выполнить только если выполнено определённое условие — например, если система Ubuntu
, или если переменная имеет значение. Для этого используется директива when
.
Пример:
- name: Установить Nginx только на Ubuntu
apt:
name: nginx
state: present
when: ansible_facts['os_family'] == "Debian"
Пример с переменной:
- name: Включить фаервол, если он нужен
ufw:
state: enabled
when: enable_firewall == true
Значение переменной
enable_firewall
может храниться вvars.yml
или быть передано из командной строки.
tags: выбор задач для выполнения
Иногда нужно запускать не весь playbook, а только отдельные задачи — например, только установку, или только копирование конфигов. Для этого применяются теги (tags
).
Пример:
- name: Установить nginx
apt:
name: nginx
state: present
tags: установка
- name: Скопировать конфиг
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/default
tags: конфиг
- name: Перезапустить nginx
service:
name: nginx
state: restarted
tags: рестарт
Теперь можно запустить playbook только с нужным тегом:
sudo ansible-playbook -i hosts nginx.yml --tags "установка"
Можно указывать несколько тегов:
--tags "установка,конфиг"
Чтобы исключить задачи:--skip-tags "рестарт"
Когда это особенно полезно:
- Разделение установки, настройки и рестарта.
- Повторный запуск только одной части (например, только шаблоны).
- Условные проверки и перезапуски без лишнего.
Отладка и лучшие практики
Отладка
-v
,-vv
,-vvv
— увеличивает подробность вывода--check
— режим "тестового запуска" (ничего не меняется)
Best Practices
- Используйте
become: yes
, а неsudo
в shell-командах - Подписывайте каждую задачу через
name:
- Используйте роли для организации большого кода
- Шаблоны (
template
) и переменные — делают ваш код гибким
Примеры автоматизации
Обновление всех пакетов
- name: Обновление пакетов
apt:
upgrade: yes
update_cache: yes
Добавление пользователя
- name: Добавить пользователя dev
user:
name: dev
shell: /bin/bash
state: present
Заключение
Ansible — это мощный, простой и гибкий инструмент для автоматизации инфраструктуры. Даже начинающий может с лёгкостью настроить установку ПО, запуск сервисов, добавление пользователей и многое другое.
Если вы системный администратор, DevOps-инженер или просто учитесь — начните использовать Ansible уже сегодня, и вы сэкономите десятки часов на рутинных задачах.
Хочешь больше гайдов? Подписывайся на Telegram-канал SecureFlow!