Ответ
При разработке Ansible-ролей я придерживаюсь подхода Infrastructure as Code с акцентом на идемпотентность, тестируемость и переиспользуемость.
Стандартный workflow:
-
Инициализация структуры:
ansible-galaxy init my_role --offline cd my_roleПолучается структура:
my_role/ ├── defaults/ # значения по умолчанию ├── tasks/ # основные задачи ├── handlers/ # обработчики ├── templates/ # Jinja2 шаблоны ├── files/ # статические файлы ├── vars/ # переменные с высоким приоритетом ├── meta/ # зависимости и метаданные └── tests/ # тестовые сценарии -
Создание идемпотентных задач:
# 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 -
Параметризация через defaults:
# defaults/main.yml nginx_version: "1.18" nginx_worker_processes: "auto" nginx_listen_port: 80 -
Тестирование с 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 -
Публикация в Ansible Galaxy:
ansible-galaxy role import --token=<GALAXY_TOKEN> username my_role
Ключевые принципы:
- Каждая роль должна выполнять одну конкретную задачу (установка сервиса, настройка конфигурации)
- Использование
ansible-lintдля проверки качества кода - Интеграция тестов в CI/CD pipeline
- Документация всех переменных и примеров использования в README.md