Ansible group_vars 变量优先级(group_vars 覆盖其他 group_vars)

tvl*_*tvl 10 ansible

在 Ansible 2.2 上,

我有一个 Ansible 主机文件:

[webserver]
aegir.dev

[hostmaster]
aegir.dev
Run Code Online (Sandbox Code Playgroud)

我有两个group_vars/文件:

# group_vars/webserver.yml
my_var:
  - vagrant
Run Code Online (Sandbox Code Playgroud)

# group_vars/hostmaster.yml
my_var:
  - vagrant
  - aegir
Run Code Online (Sandbox Code Playgroud)

和剧本:

- hosts: webserver
  tasks:
    - debug: var=my_var

- hosts: hostmaster
  tasks:
    - debug: var=my_var
Run Code Online (Sandbox Code Playgroud)

输出:

PLAY [webserver] ***************************************************************

TASK [setup] *******************************************************************
ok: [aegir.dev]

TASK [debug] *******************************************************************
ok: [aegir.dev] => {
    "my_var": [
        "vagrant",
        "aegir"
    ]
}

PLAY [hostmaster] **************************************************************

TASK [setup] *******************************************************************
ok: [aegir.dev]

TASK [debug] *******************************************************************
ok: [aegir.dev] => {
    "my_var": [
        "vagrant",
        "aegir"
    ]
}
Run Code Online (Sandbox Code Playgroud)

为什么同时使用webserver和 中hostmaster的变量hostmaster.yml

可能我没有group_vars正确使用,但我该如何解决?

编辑

真实的情况是我在两个组上运行相同的角色,一个是webserver实际上包含 4 个通用服务器的hostmaster组和作为 Web服务器的组 + 相同角色的额外配置(用户 aegir 仅存在于 aegir.dev 而不是在其他 3 个网络服务器上)

Kon*_*rov 5

这是预期的行为。请参阅文档

在任何部分中,重新定义 var 将覆盖先前的实例。如果多个组具有相同的变量,则最后加载的组获胜。如果您在剧集的 vars: 部分定义了两次变量,则第 2 个获胜。

  • 谢谢!这是真的,但我如何克服这个问题?我不想直接在剧本中(在每个任务之后)分配它们,因为它会弄得一团糟...... (2认同)

小智 4

这个问题有点老了,但提到的问题已经存在,所以我把我的答案写给需要答案的人。

\n

实际上,根据文档,Ansible 专注于主机和任务,因此组在库存和主机匹配之外确实无法生存。为了解决这个问题,我们需要为组的变量添加前缀(就像使用命名空间来避免冲突一样)。

\n
# inventory/hosts.yml\nwebservers:\n  hosts:\n    host1:\n    host2:\n  vars:\n    webserver_my_var: ...\n\nhostmaster:\n  hosts:\n    host1:\n  vars:\n    hostmaster_my_var: ...\n
Run Code Online (Sandbox Code Playgroud)\n

在剧本中,您可以安全地使用该变量。

\n
# playbooks/main.yml\n- hosts: webserver\n  tasks:\n    - debug: var=webserver_my_var | mandatory\n\n- hosts: hostmaster\n  tasks:\n    - debug: var=hostmaster_my_var | mandatory\n
Run Code Online (Sandbox Code Playgroud)\n

这样您就可以安全地消除问题。

\n

在多个组中使用相同的变量名还有另一个问题。仅通过查看库存很难猜测变量的值,您需要知道组之间的关系以及一组相对于另一组的顺序/优先级,这是一项艰苦的工作并且容易出错。

\n