![Ansible 获取具有动态编译的键名的字典项](https://linux22.com/image/739242/Ansible%20%E8%8E%B7%E5%8F%96%E5%85%B7%E6%9C%89%E5%8A%A8%E6%80%81%E7%BC%96%E8%AF%91%E7%9A%84%E9%94%AE%E5%90%8D%E7%9A%84%E5%AD%97%E5%85%B8%E9%A1%B9.png)
在一个 Ansible 剧本中,我包含一个变量文件,其中包含一个如下变量:
dictionaries:
- host1:
- key1:
- name: "Foo"
params:
- bar: "Baz"
- host2:
- key1:
- name: "Foo2"
params:
- bar: "Baz2"
- host3:
- key1:
- name: "Foo3"
params:
- bar: "Baz3"
我只想获取列表中的元素,其键名是 Ansible 正在执行剧本的主机的 Ansible {{ inventory_hostname }}。
例如,如果我执行剧本主机2我想要得到这本字典:
- key1:
- name: "Foo2"
params:
- bar: "Baz2"
我正在尝试使用查找插件,但我不确定在这种情况下如何使用它。
答案1
在我上面的评论之后,让我们尝试用我认为正确的数据结构来回答。这就是我要改变它的方式:
dictionaries:
host1:
key1:
name: "Foo"
params:
bar: "Baz"
host2:
key1:
name: "Foo2"
params:
bar: "Baz2"
host3:
key1:
name: "Foo3"
params:
bar: "Baz3"
key2:
name: "toto"
params:
titi: "tata"
现在假设你想要访问key2
for的名称host3
,你的 jinja2 模板字符串将是
"{{ dictionnaries.host3.key2.name }}"
您也可以使用括号表示法,即
"{{ dictionnaries['host3']['key2']['name'] }}"
... 或组合(这些都是等效的、非详尽的示例列表)
"{{ dictionnaries['host3'].key2.name }}"
"{{ dictionnaries['host3']['key2'].name }}"
"{{ dictionnaries.host3.key2['name'] }}"
回到你的问题:你现在想要在运行剧本时访问特定主机的键的哈希图。我理所当然地认为变量中的键dictionnaries
是以清单中的主机命名的。所以我使用inventory_hostname
魔法变量在特定主机上运行时包含该名称
---
- name: debug vars from my dict
hosts: whatever_group
vars:
dictionaries:
host1:
key1:
name: "Foo"
params:
bar: "Baz"
host2:
key1:
name: "Foo2"
params:
bar: "Baz2"
host3:
key1:
name: "Foo3"
params:
bar: "Baz3"
key2:
name: "toto"
params:
titi: "tata"
tasks:
- name: debug hashmap per host
debug:
msg: "{{ dictionaries[inventory_hostname] }}"
话虽如此,但这有点像重新发明轮子,因为 ansible 已经有一种机制来声明清单中每个主机的变量。您只需在文件中host_vars/<hostname>.yml
为每个主机声明哈希图即可。然后,您要做的就是按原样使用这些变量。
看一下有关库存的 ansible 文档更具体地说是组织主机和组变量