Ответ
Моя работа с ролями строится на принципах модульности, идемпотентности и тестируемости.
Организация кода:
Я строго следую стандартной структуре роли, создавая её через ansible-galaxy init my-role. Ключевое внимание уделяю:
tasks/main.yml: Основная логика, разбитая на включаемые файлы для читаемости.defaults/main.yml: Значения переменных по умолчанию, которые должны быть переопределены.vars/main.yml: Фактические переменные роли, изменяемые редко.handlers/main.yml: Обработчики для перезапуска служб.templates/иfiles/: Для конфигурационных файлов.meta/main.yml: Зависимости, информация о роли и поддерживаемых ОС.
Практики разработки:
- Идемпотентность: Все модули в задачах (
yum,systemd,copy) по умолчанию идемпотентны. Для собственных скриптов используюcreatesилиchanged_when. - Теги (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"`
-
Тестирование: Использую Molecule для тестирования ролей в изоляции (Docker, Vagrant). Это позволяет проверить конвергенцию (многократный запуск), идемпотентность и проверить состояние после применения роли.
molecule test # Запускает полный цикл: create, converge, idempotence, verify, destroy -
Интеграция в CI/CD: Каждая роль имеет свой
.gitlab-ci.ymlилиJenkinsfile, который запускаетmolecule testна каждый коммит, обеспечивая качество перед слиянием в основную ветку. -
Использование в Playbook: В playbook'ах применяю роли с условиями и переменными.
- hosts: webservers roles: - role: common - role: nginx vars: nginx_worker_processes: 4 when: ansible_os_family == "RedHat"Такой подход делает роли надежными, самодокументированными и готовыми к использованию в автоматизированных пайплайнах.