Блог "Дети ОИТа"
/поиск

01. Приоритет переменных

В Ansible переменные могут определяться в разных местах: в инвентаре, в файлах `group_vars`/`host_vars`, в подключаемых файлах (`vars_files`), прямо в плейбуке (секция `vars`), в ролях, через `--extra

В Ansible переменные могут определяться в разных местах: в инвентаре, в файлах group_vars/host_vars, в подключаемых файлах (vars_files), прямо в плейбуке (секция vars), в ролях, через --extra-vars и т.д.

Да, переменные из vars_files подставляются – они загружаются и становятся доступны для всех задач плейбука после того, как файл указан. Но важно понимать приоритет (порядок переопределения) переменных.

Приоритет переменных (от низшего к высшему)

  1. Инвентарь (переменные для групп и хостов)
  2. Facts (собранные факты о системе)
  3. vars_files (подключенные файлы переменных)
  4. Секция vars в плейбуке
  5. include_vars (динамически подгруженные переменные)
  6. Переменные ролей (определённые в defaults/main.yml – самые низкие, в vars/main.yml – выше)
  7. Блоки и задачи (переменные, определённые внутри задачи)
  8. --extra-vars из командной строки (самый высокий приоритет)

Пример взаимодействия vars_files и vars

Допустим, у вас есть файл secrets.yml:

db_user: admin
db_password: pass123

И плейбук site.yml:

- hosts: all
  vars_files:
    - secrets.yml
  vars:
    db_user: root          # переопределит значение из secrets.yml
  tasks:
    - debug:
        var: db_user       # выведет "root"
    - debug:
        var: db_password   # выведет "pass123" (не переопределено)

Переменная db_user из секции vars имеет более высокий приоритет, чем та же переменная из vars_files, поэтому итоговое значение – root. А db_password не переопределена, поэтому берётся из vars_files.

Важные нюансы

  • Порядок подключения vars_files влияет на переопределение между ними: если файлы указаны списком, переменные из последующих файлов перепишут предыдущие (при одинаковых именах).
  • Секция vars обрабатывается после vars_files, поэтому она переопределяет значения из файлов.
  • Переменные из командной строки (--extra-vars) имеют наивысший приоритет и переопределят всё, включая vars.

Рекомендации

  • Для чувствительных данных используйте vars_files с зашифрованными vault-файлами.
  • Для переопределения значений под конкретный запуск плейбука используйте --extra-vars или секцию vars.
  • Для постоянных переопределений на уровне окружений удобно применять group_vars и host_vars (они имеют более низкий приоритет, чем vars_files, если явно не подключать их через vars_files).

Таким образом, вы можете гибко управлять значениями переменных, комбинируя vars_files и другие источники, зная их приоритет.