我在使用pre_tasks的ansible play中设置了一些事实:
- 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'] }}
然而,这有明显的问题(变量内部的变量)。我知道我可以简单地在需要访问它们的每个角色中定义我的事实,但这看起来很混乱,绝对不是干的。
我只需要一种方法来设置和访问&#34; global&#34;可以从多个剧本和角色访问的事实/变量。这样做的最佳方式是什么?
答案 0 :(得分:0)
host_vars
和site_name
文件中。
答案当然是将group_vars/all/all.yaml
定义移至obj.strftime("%e %b %Y %H:%M:%S")
。