Какие уровни (области видимости) переменных вы знаете в Ansible?

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

Ответ

В 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.