将 Ansible 中的变量与角色合并

Jus*_*tin 2 ansible

我通过以下方式配置我的环境:

库存.yml

all:
  children:
    production:
      1.2.3.4
    staging:
      1.2.3.5
Run Code Online (Sandbox Code Playgroud)

在 group_vars/all.yml 中,我设置了将添加到剧本中的用户哈希。我希望能够将用户专门添加到 group_vars/staging.yml 中,这些用户将与我的 group_vars/all.yml 中的相同设置合并。

在这种情况下,是否有正确的方法来合并哈希或声明继承?

Vla*_*tka 7

请参阅DEFAULT_HASH_BEHAVIOUR。引用

\n
\n

“此设置控制变量在 Ansible 中合并的方式。默认情况下,Ansible 将按照特定优先级顺序覆盖变量,如变量中所述。当优先级较高的变量获胜时,它将替换其他值。一些用户更喜欢哈希变量(在 Python 术语中又名 \xe2\x80\x98dictionaries\xe2\x80\x99)被合并。此设置称为 \xe2\x80\x98merge\xe2\x80\x99。...”

\n
\n

例如,给定 inventory 和group_vars

\n
shell> cat hosts\nall:\n  children:\n    production:\n      hosts:\n        1.2.3.4\n    staging:\n      hosts:\n        1.2.3.5\n
Run Code Online (Sandbox Code Playgroud)\n
shell> cat group_vars/all.yml\nusers:\n  admin:\n    shell: /bin/bash\n  ansible:\n    shell: /bin/sh\n
Run Code Online (Sandbox Code Playgroud)\n
shell> cat group_vars/production/users.yml \nusers:\n  dealer:\n    shell: /usr/sbin/nologin\n
Run Code Online (Sandbox Code Playgroud)\n
shell> cat group_vars/staging/users.yml \nusers:\n  tester:\n    shell: /bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n

剧本

\n
shell> cat pb.yml\n- hosts: all\n  tasks:\n    - debug:\n        var: users\n
Run Code Online (Sandbox Code Playgroud)\n

默认情况下覆盖字典。给出(删节)

\n
shell> ansible-playbook pb.yml\n\nTASK [debug] ****\nok: [1.2.3.4] => \n  users:\n    dealer:\n      shell: /usr/sbin/nologin\nok: [1.2.3.5] => \n  users:\n    tester:\n      shell: /bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n

ANSIBLE_HASH_BEHAVIOUR设置为合并剧本给出的字典时(删节)

\n
shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook pb.yml\n\nTASK [debug] ****\nok: [1.2.3.4] => \n  users:\n    admin:\n      shell: /bin/bash\n    ansible:\n      shell: /bin/sh\n    dealer:\n      shell: /usr/sbin/nologin\nok: [1.2.3.5] => \n  users:\n    admin:\n      shell: /bin/bash\n    ansible:\n      shell: /bin/sh\n    tester:\n      shell: /bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n

此设置将在 2.13 中弃用。

\n

引用已弃用的详细信息

\n
\n

“这个功能很脆弱且不可移植,导致持续的混乱和误用”

\n
\n

引用已弃用的替代方案

\n
\n

“明确地组合过滤器”

\n
\n

例如,将普通用户字典重命名为users_all

\n
shell> cat group_vars/all.yml\nusers_all:\n  admin:\n    shell: /bin/bash\n  ansible:\n    shell: /bin/sh\n
Run Code Online (Sandbox Code Playgroud)\n

然后过滤器组合合并字典

\n
shell> cat pb.yml\n- hosts: all\n  tasks:\n    - debug:\n        var: users_all|combine(users)\n
Run Code Online (Sandbox Code Playgroud)\n

给出(删节)

\n
shell> ansible-playbook pb.yml\n\nTASK [debug] ****\nok: [1.2.3.4] => \n  users_all|combine(users):\n    admin:\n      shell: /bin/bash\n    ansible:\n      shell: /bin/sh\n    dealer:\n      shell: /usr/sbin/nologin\nok: [1.2.3.5] => \n  users_all|combine(users):\n    admin:\n      shell: /bin/bash\n    ansible:\n      shell: /bin/sh\n    tester:\n      shell: /bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n

注意:要合并列表,请参阅解决方案

\n