Какие основные этапы работы Ansible?

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

Ответ

Работа с Ansible следует четкому потоку, который я выстраиваю в каждом проекте:

  1. Определение инвентаря (Inventory). Я описываю целевые хосты, группируя их по ролям (например, [webservers], [databases]). Инвентарь может быть статическим YAML-файлом или динамическим, генерируемым скриптом (например, получающим список серверов из облачного провайдера).
  2. Создание плейбуков (Playbooks). Это YAML-файлы — "сценарии" автоматизации. В плейбуке я определяю:
    • На каких хостах (hosts: webservers) выполнять задачи.
    • Какие переменные (vars) использовать.
    • Последовательность задач (Tasks) — атомарных операций (модулей Ansible) вроде apt, copy, template.
  3. Использование шаблонов конфигурации (Templates). Я пишу конфиги (например, для Nginx или systemd) как шаблоны Jinja2 (.j2), в которые Ansible подставляет переменные из инвентаря или плейбука.
  4. Организация кода в роли (Roles). Для переиспользования логику группирую в роли (например, роль nginx). Роль имеет стандартную структуру: tasks/, handlers/, templates/, vars/. Это делает код модульным и чистым.
  5. Запуск и выполнение (Execution). Запускаю плейбук командой ansible-playbook. Ansible по SSH подключается к хостам (используя указанные в инвентаре данные), выполняет задачи и собирает результаты.

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

# site.yml
- name: Configure web servers
  hosts: webservers  # Этап 1: Группа из инвентаря
  become: yes        # Выполнять задачи с правами sudo
  vars:              # Этап 2: Переменные
    http_port: 80
    max_clients: 200

  tasks:             # Этап 2: Задачи
    - name: Ensure Nginx is installed
      apt:
        name: nginx
        state: latest
        update_cache: yes

    - name: Deploy Nginx configuration
      template:      # Этап 3: Шаблон
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify:        # Триггер для обработчика
        - Restart Nginx

  handlers:          # Обработчики (задачи по триггеру)
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted

Для сложных проектов задачи и обработчики из этого плейбука я бы вынес в отдельную роль (Этап 4).