Как организовать работу с ролями в Ansible?

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

Ответ

Моя работа с ролями строится на принципах модульности, идемпотентности и тестируемости.

Организация кода: Я строго следую стандартной структуре роли, создавая её через ansible-galaxy init my-role. Ключевое внимание уделяю:

  • tasks/main.yml: Основная логика, разбитая на включаемые файлы для читаемости.
  • defaults/main.yml: Значения переменных по умолчанию, которые должны быть переопределены.
  • vars/main.yml: Фактические переменные роли, изменяемые редко.
  • handlers/main.yml: Обработчики для перезапуска служб.
  • templates/ и files/: Для конфигурационных файлов.
  • meta/main.yml: Зависимости, информация о роли и поддерживаемых ОС.

Практики разработки:

  1. Идемпотентность: Все модули в задачах (yum, systemd, copy) по умолчанию идемпотентны. Для собственных скриптов использую creates или changed_when.
  2. Теги (Tags): Размечаю задачи тегами для гибкого выполнения.
    
    - name: Install Nginx
    yum:
    name: nginx
    state: present
    tags:
    - install
    - nginx
  • name: Deploy config template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf tags:
    • config
    • nginx notify: restart nginx
      
      Запуск: `ansible-playbook site.yml --tags "install,nginx"`
  1. Тестирование: Использую Molecule для тестирования ролей в изоляции (Docker, Vagrant). Это позволяет проверить конвергенцию (многократный запуск), идемпотентность и проверить состояние после применения роли.

    molecule test  # Запускает полный цикл: create, converge, idempotence, verify, destroy
  2. Интеграция в CI/CD: Каждая роль имеет свой .gitlab-ci.yml или Jenkinsfile, который запускает molecule test на каждый коммит, обеспечивая качество перед слиянием в основную ветку.

  3. Использование в Playbook: В playbook'ах применяю роли с условиями и переменными.

    - hosts: webservers
    roles:
    - role: common
    - role: nginx
      vars:
        nginx_worker_processes: 4
      when: ansible_os_family == "RedHat"

    Такой подход делает роли надежными, самодокументированными и готовыми к использованию в автоматизированных пайплайнах.