Доступ к фактам из другой роли в Ansible
Я установил некоторые факты во время моей игры, используя pre_tasks:
- name: set site name variables
set_fact:
site_name: '{{ ansible_hostname | regex_replace("^([a-z]{3}[0-9]).*", "\1") }}'
site_name_upper: '{{ ansible_hostname | regex_replace("^([a-z]{3}[0-9]).*", "\1") | upper }}'
и теперь я хотел бы получить доступ к ним из роли, которую я разрабатываю. Когда я пытаюсь получить доступ к ним напрямую, я получаю сообщение об ошибке, что переменная не определена:
TASK [monitoring-server : debug] ****************************************************************************************************************************************************************************************************
fatal: [hostname]: FAILED! => {"msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined.The error was: 'site_name' is undefined\n\nThe error appears to have been in '/opt/ansible/dv-ansible/roles/linux-monitoring-server/tasks/smokeping.yaml': line 55, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: debug\n ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'site_name' is undefined"}
to retry, use: --limit @/opt/ansible/.ansible-retry/linux_monitoring_server.retry
Согласно некоторым статьям, которые я прочитал, мне нужно использовать hostvars
искать факты, установленные в другой пьесе, например:
{{ hostvars[{{ansible_hostname}}]['site_name'] }}
Тем не менее, есть очевидные проблемы с этим (переменная внутри переменной). Я знаю, что могу просто определить свои факты в каждой роли, которой нужен доступ к ним, но это кажется грязным и определенно не СУХОЙ.
Мне просто нужен способ установить и получить доступ к "глобальным" фактам / переменным, которые могут быть доступны из нескольких пьес и ролей. Каков наилучший способ сделать это?
1 ответ
Вау, теперь я чувствую себя глупо. Просто понял, что вы можете поместить динамически исполняемого Джинджу в group_vars
а также host_vars
файлы.
Ответ, конечно, заключается в том, чтобы просто переместить site_name
определения к group_vars/all/all.yaml
,