#ansible #ansible-playbook
#ansible
Вопрос:
В роли я пытаюсь загрузить некоторые переменные из другой роли. (Если бы эта роль была включена в текущее воспроизведение, переменные были бы доступны, но это не значит, что их нет.)
Итак, я попробовал это:
- include_vars: ../../another_role/defaults/main.yml
Но это не работает, ошибки нет, но переменные по-прежнему не определены.
Итак, я попытался проявить смекалку и создать символическую ссылку на файл vars/another_role_defaults.yml
в роли, в которой я хочу использовать переменные, а затем включить его следующим образом:
- include_vars: another_role_defaults.yml
Тот же результат, ошибки нет (почему он не выдает ошибку, если файл не может быть найден??) но переменные все еще не определены. Я тоже пробовал это, для пущей убедительности, но все еще без сигары.
- include_vars: ../vars/another_role_defaults.yml
Что я делаю не так?
Ответ №1:
В конце концов, это была моя собственная ошибка… Я протестировал это с помощью debug
модуля и tags
вот так:
- include_vars: ../../another_role/defaults/main.yml
- debug: msg={{ variable }}
tags: foo
и затем выполнить playbook следующим образом:
ansible-playbook -vvvv playbook.yml --tags foo
Как только я опустил теги, это работает (конечно). Проблема заключалась в том, что я должен был добавить теги в include_vars
команду также следующим образом:
- include_vars: ../../another_role/defaults/main.yml
tags: foo
- debug: msg={{ variable }}
tags: foo
Комментарии:
1. Отличная «особенность». Только что потратил полчаса на это. Спасибо за публикацию ответа.
2. Полчаса, а не половина дня)
Ответ №2:
Принятое решение не сработало в моем случае, если файл импортирован из другой роли. Слегка измененный подход с помощью специальной переменной, который сработал для меня:
- include_vars: "{{ role_path }}/../another_role/defaults/main.yml"
tags: foo
role_path — путь к каталогу текущей роли
Ответ №3:
Начиная с ansible-core 2.11, вы можете сделать это:
- include_vars: ../../nrpe/vars/standard_nrpe_checks.yml
name: standard_nrpe_checks
- debug:
msg: "{{ standard_nrpe_checks }}"
Чтобы получить тот же результат, вы также можете использовать set_fact
с плагином поиска.
- debug:
msg: "{{ lookup('file', '../../nrpe/vars/standard_nrpe_checks.yml') }}"
Я хотел упомянуть, используете ли вы коллекции и распространяете ли вы сборник задач, который вы можете использовать
playbooks
|_vars/
|_standard_nrpe_checks.yml
В этом случае я теперь могу предоставлять общий доступ к переменным из коллекции, и поскольку это находится в пути поиска, мне не нужно указывать его относительно. Т.Е. вместо того, чтобы использовать список по умолчанию для роли nrpe, прочитайте его для обеих ролей и сохраните его в одном месте.
- include_vars: standard_nrpe_checks.yml
name: standard_nrpe_checks
- debug:
msg: "{{ standard_nrpe_checks }}"
TASK [namespace.my_collection.icinga : debug] *******************************************
ok: [hostname] =>
msg: |-
standard_nrpe_checks:
check_users:
script: check_users