Как вести разработку Ansible Role?

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

Ответ

При разработке Ansible-ролей я придерживаюсь подхода Infrastructure as Code с акцентом на идемпотентность, тестируемость и переиспользуемость.

Стандартный workflow:

  1. Инициализация структуры:

    ansible-galaxy init my_role --offline
    cd my_role

    Получается структура:

    my_role/
    ├── defaults/      # значения по умолчанию
    ├── tasks/         # основные задачи
    ├── handlers/      # обработчики
    ├── templates/     # Jinja2 шаблоны
    ├── files/         # статические файлы
    ├── vars/          # переменные с высоким приоритетом
    ├── meta/          # зависимости и метаданные
    └── tests/         # тестовые сценарии
  2. Создание идемпотентных задач:

    # tasks/main.yml
    - name: Ensure Nginx is installed
     package:
       name: nginx
       state: present
     register: nginx_install
    
    - name: Configure Nginx
     template:
       src: nginx.conf.j2
       dest: /etc/nginx/nginx.conf
       owner: root
       group: root
       mode: '0644'
     notify: restart nginx
     when: nginx_install.changed
  3. Параметризация через defaults:

    # defaults/main.yml
    nginx_version: "1.18"
    nginx_worker_processes: "auto"
    nginx_listen_port: 80
  4. Тестирование с Molecule:

    # molecule/default/molecule.yml
    dependency:
     name: galaxy
    driver:
     name: docker
    platforms:
     - name: ubuntu-2004
       image: ubuntu:20.04
    provisioner:
     name: ansible
    verifier:
     name: ansible

    Запуск тестов: molecule test

  5. Публикация в Ansible Galaxy:

    ansible-galaxy role import --token=<GALAXY_TOKEN> username my_role

Ключевые принципы:

  • Каждая роль должна выполнять одну конкретную задачу (установка сервиса, настройка конфигурации)
  • Использование ansible-lint для проверки качества кода
  • Интеграция тестов в CI/CD pipeline
  • Документация всех переменных и примеров использования в README.md