我有一个定义在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