Ответ
В Ansible переменные имеют четкую иерархию приоритетов, что позволяет гибко управлять конфигурацией для разных сред (dev, staging, prod). Я использую следующие основные уровни (от низшего приоритета к высшему):
1. Defaults (Роли)
Переменные, определенные в roles/<role_name>/defaults/main.yml. Имеют самый низкий приоритет и предназначены для задания безопасных значений по умолчанию для роли.
2. Facts (Факты)
Автоматически собираемая информация об управляемом хосте (через модуль setup).
3. Inventory Variables (Переменные инвентаря)
- Файлы инвентаря (
inventory.iniилиinventory.yml). - Файлы в директориях
group_vars/(для групп хостов) иhost_vars/(для конкретных хостов). Это основной метод разделения конфигурации по окружениям.
4. Playbook Variables (Переменные плейбука)
Определенные в секции vars: плейбука.
5. Role Variables (Переменные роли)
Определенные в roles/<role_name>/vars/main.yml. Имеют более высокий приоритет, чем defaults.
6. Task Variables (Переменные задачи)
Определенные в секции vars: конкретной задачи внутри плейбука или роли.
7. Extra Variables (Дополнительные переменные)
Передаваемые через командную строку с ключом -e или --extra-vars. Имеют наивысший приоритет и переопределяют все остальные.
Практический пример иерархии: Представим настройку порта для веб-сервера Nginx.
# 1. DEFAULT (roles/nginx/defaults/main.yml) - Безопасное значение по умолчанию
nginx_port: 80
# 3. INVENTORY (group_vars/production.yml) - Значение для production-окружения
nginx_port: 443
# 4. PLAYBOOK (site.yml) - Значение, определенное в плейбуке
- hosts: webservers
vars:
nginx_port: 8080 # Это значение будет использовано, если не заданы более приоритетные
tasks:
- name: Print port from playbook vars
debug:
msg: "Playbook var - Port: {{ nginx_port }}"
# 6. TASK VARIABLE - Переопределяет все вышестоящие для этой задачи
- name: Print port from task vars
debug:
msg: "Task var - Port: {{ nginx_port }}"
vars:
nginx_port: 3000
Запуск с extra-vars (наивысший приоритет):
ansible-playbook site.yml -e "nginx_port=9443"
# В этом случае, несмотря на все определения в файлах,
# везде будет использовано значение 9443.
Понимание этой иерархии критично для создания поддерживаемых, гибких и безопасных плейбуков, где конфигурация для prod не «протекает» в dev.