Какие минимальные изменения нужно внести в Ansible playbook, чтобы он работал для нескольких серверов?

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

Ответ

Основное изменение — указать целевые хосты в директиве hosts. Вместо одного хоста (localhost или конкретного имени) нужно указать группу из инвентаря, несколько групп или шаблон.

Пример минимального изменения:

# Было для одного хоста:
- hosts: webserver01
  tasks: ...

# Стало для группы 'webservers':
- hosts: webservers
  tasks: ...

Ключевые подходы для работы с несколькими серверами:

  1. Использование групп из инвентаря: Самый распространенный способ. Хосты объединяются в группы в файле инвентаря (inventory.ini или inventory.yml).

    # inventory.ini
    [webservers]
    web01.example.com
    web02.example.com
    
    [dbservers]
    db01.example.com
    
    [all_servers:children]
    webservers
    dbservers

    В плейбуке: - hosts: webservers или - hosts: all_servers.

  2. Шаблоны и перечисления: Можно использовать шаблоны для выбора хостов.

    - hosts: '*.example.com'          # Все хосты в домене
    - hosts: 'web0[1:5].example.com'  # Диапазон имен
    - hosts: webservers:dbservers      # Объединение групп
  3. Динамический инвентарь: Для облачных сред (AWS, GCP, Azure) инвентарь генерируется скриптом на лету, который возвращает JSON с группами хостов.

Важно: При работе с несколькими хостами часто требуется использовать become: true для привилегированных задач и учитывать, что задачи выполняются параллельно (по умолчанию — на 5 хостах одновременно, настраивается forks).