动态生成变量名并使用Ansible访问其内容

动态生成变量名并使用Ansible访问其内容,ansible,devops,Ansible,Devops,我有一个ansible playbook,我需要将任务返回的值与从元数据文件加载的变量进行比较 这个元数据可以是任何格式,我决定使用YAML 我试图实现的是从另一个变量+额外的内容构建一个变量名,然后查找这个值。 我在网上搜索过答案,但没有找到。这里也有一些类似的问题,但它们并没有完全解决我的问题 代码如下: temp_task.yml --- - name: Temp task hosts: xenservers gather_facts: no vars_file

我有一个ansible playbook,我需要将任务返回的值与从元数据文件加载的变量进行比较

这个元数据可以是任何格式,我决定使用YAML

我试图实现的是从另一个变量+额外的内容构建一个变量名,然后查找这个值。

我在网上搜索过答案,但没有找到。这里也有一些类似的问题,但它们并没有完全解决我的问题

代码如下:

temp_task.yml

---
  - name: Temp task
    hosts: xenservers
    gather_facts: no
    vars_files:
      - vars/xenservers_metadata.yml

    tasks:
      - command: ls /home  # just a dummy task..
        ignore_errors: yes

      - set_fact: nic={{ inventory_hostname }}.network
      - debug: msg={{ nic }}
      - debug: msg={{ xen_perf.network }}
xenservers_metadata.yml

---
  - xen:
      network:
        - xenbr0: "9b8be49c-....-....-...-..."
我试图让两条调试消息打印相同的内容。一个是由
{{inventory\u hostname}}.network
动态构造的,另一个是显式变量I loaded

TASK [debug] ********************************************************************************************************************************************************
ok: [xen_perf] => {
    "msg": "xen.network"
}

TASK [debug] ********************************************************************************************************************************************************
ok: [xen] => {
    "msg": [
        {
            "xenbr0": "9b8be49c-....-....-...-..."
        }
    ]
}

第一次调试只是打印字符串。第二个打印我需要的实际数据。如何通过动态构造变量/属性来实现第二个数据输出?

在示例中,变量名不是动态生成的

所有变量(非事实)都存储在
vars
结构中,您可以通过以下方式访问它们:

- debug:
    msg: "{{ vars[inventory_hostname].network }}"

在示例中,您不会动态生成变量名

所有变量(非事实)都存储在
vars
结构中,您可以通过以下方式访问它们:

- debug:
    msg: "{{ vars[inventory_hostname].network }}"

这适用于网络,但如果我尝试基于键“xenbr0”获取值,操作将失败。知道如何访问
vars[inventory\u hostname].network.xenbr0
吗?就像你写的一样。我的YAML变量文件是错误的,这就是它失败的原因。我在xenbr0值之前添加了一个
-
。显然它不应该在那里。感谢这对网络有效,但如果我尝试基于键“xenbr0”获取值,操作将失败。知道如何访问
vars[inventory\u hostname].network.xenbr0
吗?就像你写的一样。我的YAML变量文件是错误的,这就是它失败的原因。我在xenbr0值之前添加了一个
-
。显然它不应该在那里。谢谢