覆盖 host_vars 中字典的特定键

覆盖 host_vars 中字典的特定键

我有一个定义在groups_vars/all.yml

users:
  johndoe:
    name: John Doe
    username: john
  janedoe:
    name: Jane Doe
    username: jane

对于特定主机,我喜欢在以下内容中覆盖它hosts_vars

users.johndoe.username: johnd

这不起作用,如果我尝试这样的组合过滤器:

users: "{{ users | combine({'johndoe': users.johndoe | combine({'username': 'johnd'}) })}}"

我在 Ansible 中得到了一个递归循环。

看来我没有以 Ansible 的方式这样做。我可以“展平”变量结构,并轻松地以这种方式覆盖它,但这使我无法轻松地循环任务中的变量结构。解决这个问题的推荐方法是什么?

答案1

DEFAULT_HASH_BEHAVIOUR合并。例如,给定库存

shell> cat hosts
test_11
test_12
test_13

剧本

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

组变量

shell> cat group_vars/all.yml 
users:
  johndoe:
    name: John Doe
    username: john
  janedoe:
    name: Jane Doe
    username: jane

将特定于主机的更新用户主机变量

shell> cat host_vars/test_12.yml
users:
  johndoe:
    username: johnd

然后,下面的命令将合并字典

shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook -i hosts pb.yml

PLAY [all] *********************************************************

TASK [debug] *******************************************************
ok: [test_11] => 
  users:
    janedoe:
      name: Jane Doe
      username: jane
    johndoe:
      name: John Doe
      username: john
ok: [test_12] => 
  users:
    janedoe:
      name: Jane Doe
      username: jane
    johndoe:
      name: John Doe
      username: johnd
ok: [test_13] => 
  users:
    janedoe:
      name: Jane Doe
      username: jane
    johndoe:
      name: John Doe
      username: john

相关内容