0

在我的 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。

我只需要一种方法来设置和访问可以从多个角色和角色中访问的“全局”事实/变量。做这个的最好方式是什么?

4

1 回答 1

0

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

答案当然是将site_name定义移至group_vars/all/all.yaml.

于 2017-09-05T21:49:19.550 回答