Включить переменные в задачи роли

#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