Из каких основных элементов состоит Ansible playbook?

«Из каких основных элементов состоит Ansible playbook?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Playbook в Ansible — это YAML-файл, описывающий желаемое состояние инфраструктуры. Он состоит из одного или нескольких plays (плейов), каждый из которых содержит следующие ключевые элементы:

  1. hosts: Определяет целевую группу хостов или шаблон из инвентарного файла, к которому применяется плей. Например: webservers, db_servers:&europe, или all.
  2. vars / vars_files: Раздел для объявления переменных, специфичных для данного плейбука. Позволяет параметризировать конфигурацию.
  3. tasks: Сердце плейбука. Список действий (задач), которые будут выполнены последовательно на целевых хостах. Каждая задача вызывает модуль Ansible (например, apt, copy, template, service).
    • Каждая задача должна иметь уникальное имя (name), которое выводится при выполнении.
  4. handlers: Специальные задачи, которые выполняются только один раз в конце плейбука, и только если были уведомлены (notify) одной из обычных задач. Используются для перезапуска служб после изменения конфигурации.
  5. roles (на уровне плейбука): Позволяют импортировать переиспользуемые роли, которые инкапсулируют задачи, шаблоны, файлы и переменные для организации сложной конфигурации.
  6. become: Директива для повышения привилегий (например, become: yes для выполнения задач от root через sudo).

Пример практического плейбука для развёртывания веб-сервера Nginx:

---
- name: Configure and deploy Nginx on web servers
  hosts: webservers  # Целевая группа из инвентаря
  vars:
    http_port: 8080
    server_name: "{{ inventory_hostname }}"
  become: yes  # Выполнять задачи с правами root

  tasks:
    - name: Ensure Nginx package is installed
      apt:
        name: nginx
        state: latest
        update_cache: yes

    - name: Deploy custom Nginx configuration template
      template:
        src: templates/nginx.conf.j2  # Jinja2 шаблон
        dest: /etc/nginx/sites-available/default
        owner: root
        group: root
        mode: '0644'
      notify:  # Уведомление хендлера
        - Reload Nginx service

    - name: Ensure Nginx is enabled and started
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Reload Nginx service
      service:
        name: nginx
        state: reloaded  # Graceful reload для применения конфига без разрыва соединений

Почему такая структура эффективна для DevOps:

  • Идемпотентность: Модули Ansible гарантируют, что повторный запуск плейбука приведёт систему в то же состояние, не вызывая ошибок.
  • Декларативность: Описывается желаемое состояние ("пакет должен быть установлен", "сервис должен работать"), а не последовательность команд.
  • Масштабируемость: Один плейбук применяется ко всей группе хостов webservers.
  • Интеграция: Переменные (vars) и шаблоны Jinja2 (template) позволяют гибко адаптировать конфигурацию под разные окружения (dev, staging, prod).