Есть ли способ ссылаться на групповые переменные при импорте в Ansible?
В моих сценариях Ansible есть способ ссылки на переменную пути при импорте книги воспроизведения?
Я установил некоторые переменные с путем к разным файлам в моей файловой иерархии Ansible, на которые я хотел бы сослаться при импорте и включении playbook и переменных файлов. Переменные пути определены в файле в каталоге group_vars/all/, поэтому они загружаются автоматически.
Когда я пытаюсь импортировать playbook и ссылаться на одну из моих переменных пути, я получаю сообщение об ошибке, что переменная не определена.
Вот пример. Я создал простой файл playbook, который я называю include.yml:
---
- name: Include playbook
import_playbook: "{{ base_dir }}/foo.yml"
Playbook импортирует другой playbook с именем foo.yml в каталог, определенный в переменной base_dir.
Вот foo.yml:
---
- name:
hosts: localhost
gather_facts: no
tasks:
- name: Check that group_vars/all variable loaded
debug:
var: test_dir
В каталоге group_vars/all/ я определяю base_dir и test_dir в файле с именем dirs.yml:
base_dir: "{{ playbook_dir }}"
test_dir: "{{ base_dir }}/foo"
Когда я бегу:
ansible-playbook include.yml
Я ожидаю, что Ansible импортирует и запускает foo.yml, который печатает значение переменной test_dir, которая ссылается на base_dir.
Вместо этого я получаю ошибку:
ERROR! 'base_dir' is undefined
Если я бегу:
ansible-playbook include.yml --extra-vars base_dir="."
тогда он работает, как ожидалось.
Похоже, что импорт происходит до загрузки переменных group_vars.
Если это правда, это неудобно, потому что я хотел бы определить пути к моим файлам в глобальных переменных, на которые могут ссылаться несколько пьес, вместо того, чтобы жестко кодировать их во всех моих книгах. Есть ли способ обойти эту проблему?
1 ответ
Q: "Я хотел бы определить пути к моим файлам в глобальных переменных, на которые могут ссылаться несколько книг с книгами, вместо жесткого их кодирования во всех моих книгах. Есть ли способ обойти эту проблему?
A: Это рациональное ожидание, что group_vars/all мог быть загружен до импорта playbook. Но ни playbook, ни связанные с инвентарем group_vars / все не работают таким образом. Есть закрытые вопросы по этой теме (locked and limited conversation to collaborators on Apr 27
) например playbook_vars_root не работает для импорта playbook # 34239.
Обходного пути нет. Область действия таких переменных - игра. goup_vars не может быть загружен до того, как хосты станут известны из игры.
FWIW. Возможность запуска playbooks системным и гибким способом - ansible-runner. См. Иерархия входных данных Runner и Запуск Playbooks.