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