Есть ли способ ссылаться на групповые переменные при импорте в 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.

Другие вопросы по тегам