Ansible 获取具有动态编译的键名的字典项

Ansible 获取具有动态编译的键名的字典项

在一个 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"

现在假设你想要访问key2for的名称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 文档更具体地说是组织主机和组变量

相关内容