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

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

Постер статьи

Содержание

Что такое 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!