来自Ansible的另一个角色的事实访问

时间:2017-09-05 21:38:49

标签: ansible ansible-facts

我在使用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;可以从多个剧本和角色访问的事实/变量。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

哇,现在我觉得很傻。刚刚意识到你可以将动态执行的Jinja放在host_varssite_name文件中。

答案当然是将group_vars/all/all.yaml定义移至obj.strftime("%e %b %Y %H:%M:%S")