问:“在我的剧本中如何获取所有变量?”
A:引用 Ansible 配置设置DEFAULT_HASH_BEHAVIOUR:
默认情况下,Ansible 将按照特定优先顺序覆盖变量,如Variable precedence: Where should I put a variable? 中所述...一些用户更喜欢将散列变量(在 Python 术语中称为“字典”)合并。此设置称为“合并”。这不是默认行为,它不会影响值为标量(整数、字符串)或数组的变量。我们通常建议不要使用此设置...
问题中的变量不是字典,不能合并。
相反,让我们创建可用于挂载文件系统的字典。例如
shell> cat group_vars/devgroup.yml
mounts:
a:
dev: sda1
mnt: /a
b:
dev: sda2
mnt: /b
shell> cat host_vars/server001.yml
mounts:
d:
dev: sda3
mnt: /d
e:
dev: sda4
mnt: /e
shell> cat host_vars/server002.yml
mounts:
s:
dev: sda5
mnt: /s
t:
dev: sda6
mnt: /t
剧本
shell> cat pb.yml
- hosts: devgroup
tasks:
- debug:
var: mounts
默认情况下,host_vars 会覆盖 group_vars 并给出
shell> ansible-playbook pb.yml
[...]
ok: [server001] => {
"mounts": {
"d": {
"dev": "sda3",
"mnt": "/d"
},
"e": {
"dev": "sda4",
"mnt": "/e"
}
}
}
ok: [server002] => {
"mounts": {
"s": {
"dev": "sda5",
"mnt": "/s"
},
"t": {
"dev": "sda6",
"mnt": "/t"
}
}
}
但是对于ANSIBLE_HASH_BEHAVIOUR=merge,相同的剧本将字典合并
shell> export ANSIBLE_HASH_BEHAVIOUR=merge
shell> ansible-playbook pb.yml
[...]
ok: [server001] => {
"mounts": {
"a": {
"dev": "sda1",
"mnt": "/a"
},
"b": {
"dev": "sda2",
"mnt": "/b"
},
"d": {
"dev": "sda3",
"mnt": "/d"
},
"e": {
"dev": "sda4",
"mnt": "/e"
}
}
}
ok: [server002] => {
"mounts": {
"a": {
"dev": "sda1",
"mnt": "/a"
},
"b": {
"dev": "sda2",
"mnt": "/b"
},
"s": {
"dev": "sda5",
"mnt": "/s"
},
"t": {
"dev": "sda6",
"mnt": "/t"
}
}
}