В чем разница между playbook, role и collection в Ansible?

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

Ответ

Это три уровня абстракции для организации кода Ansible, от конкретного сценария до переиспользуемых библиотек.

1. Playbook (Плейбук)

  • Что это: Исполняемый YAML-файл, который описывает конкретный сценарий развертывания или конфигурации. Это точка входа для запуска ansible-playbook.
  • Содержимое: Список plays, которые определяют, на каких хостах (hosts) и в каком порядке выполняются tasks.
  • Пример (deploy_web.yml):
  • name: Deploy Nginx and configure firewall hosts: webservers become: yes vars: http_port: 80 tasks:
    • name: Ensure Nginx is installed apt: name: nginx state: latest
    • name: Allow HTTP traffic ufw: rule: allow port: "{{ http_port }}"

2. Role (Роль)

  • Что это: Набор переиспользуемых компонентов (задачи, обработчики, файлы, шаблоны, переменные), сгруппированных по стандартной структуре каталогов. Роль инкапсулирует логику настройки одного сервиса или компонента (например, nginx, postgresql, java).
  • Зачем: Чтобы избежать дублирования кода в плейбуках. Роль можно параметризовать через переменные.
  • Структура:
    roles/
    common/
    tasks/main.yml      # Основные задачи роли
    handlers/main.yml   # Обработчики (handlers)
    templates/nginx.conf.j2 # Jinja2 шаблоны
    files/script.sh     # Статические файлы
    vars/main.yml       # Переменные по умолчанию
    defaults/main.yml   # Переменные с низким приоритетом
    meta/main.yml       # Зависимости от других ролей
  • Использование в плейбуке:
  • hosts: webservers roles:
    • role: nginx vars: nginx_worker_processes: 4

3. Collection (Коллекция)

  • Что это: Пакет для распространения содержимого Ansible. Это формат упаковки, который может содержать роли, модули, плагины и документацию. Аналог пакета (gem, pip package) для экосистемы Ansible.
  • Зачем: Официальный способ делиться и устанавливать сторонние модули и роли. Позволяет иметь пространства имен (например, community.general, ansible.posix).
  • Установка и использование:
    
    # Установка коллекции из Ansible Galaxy
    ansible-galaxy collection install community.docker

Использование модуля из коллекции в задаче

  • name: Create a Docker container community.docker.docker_container: name: my_app image: nginx:latest

Итог: Playbook — это сценарий, который запускается. Role — это переиспользуемый строительный блок внутри плейбука. Collection — это способ установить и использовать сторонние роли и модули с гарантией совместимости.