在我的 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'] }}
但是,这存在明显的问题(变量内部的变量)。我知道我可以简单地在需要访问它们的每个角色中定义我的事实,但这看起来很混乱,而且绝对不是 DRY。
我只需要一种方法来设置和访问可以从多个角色和角色中访问的“全局”事实/变量。做这个的最好方式是什么?