将 Ansible 中的变量与角色合并

将 Ansible 中的变量与角色合并

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

库存.yml

all:
  children:
    production:
      1.2.3.4
    staging:
      1.2.3.5

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

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

答案1

DEFAULT_HASH_BEHAVIOUR. 引用

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

例如,给定库存和组变量

shell> cat hosts
all:
  children:
    production:
      hosts:
        1.2.3.4
    staging:
      hosts:
        1.2.3.5
shell> cat group_vars/all.yml
users:
  admin:
    shell: /bin/bash
  ansible:
    shell: /bin/sh
shell> cat group_vars/production/users.yml 
users:
  dealer:
    shell: /usr/sbin/nologin
shell> cat group_vars/staging/users.yml 
users:
  tester:
    shell: /bin/bash

剧本

shell> cat pb.yml
- hosts: all
  tasks:
    - debug:
        var: users

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

shell> ansible-playbook pb.yml

TASK [debug] ****
ok: [1.2.3.4] => 
  users:
    dealer:
      shell: /usr/sbin/nologin
ok: [1.2.3.5] => 
  users:
    tester:
      shell: /bin/bash

什么时候ANSIBLE_HASH_BEHAVIOUR设置为合并剧本给出的字典(节选)

shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook pb.yml

TASK [debug] ****
ok: [1.2.3.4] => 
  users:
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    dealer:
      shell: /usr/sbin/nologin
ok: [1.2.3.5] => 
  users:
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    tester:
      shell: /bin/bash

此设置将已弃用在 2.13 中。

引用已弃用的详细信息

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

引用已弃用的替代方案

“明确组合过滤器”

例如,将普通用户的词典重命名为用户全部

shell> cat group_vars/all.yml
users_all:
  admin:
    shell: /bin/bash
  ansible:
    shell: /bin/sh

然后过滤器结合合并词典

shell> cat pb.yml
- hosts: all
  tasks:
    - debug:
        var: users_all|combine(users)

给出(节选)

shell> ansible-playbook pb.yml

TASK [debug] ****
ok: [1.2.3.4] => 
  users_all|combine(users):
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    dealer:
      shell: /usr/sbin/nologin
ok: [1.2.3.5] => 
  users_all|combine(users):
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    tester:
      shell: /bin/bash

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

相关内容