Ansible Jinja2如何获取嵌套字典的第n个值?
问题与解决方案
需求
当cluster_input.user_input的值为1时,将vcenter_cluster设置为cluster_info.clusters中K8S对应的集群数据。
当前Playbook代码
- set_fact: vcenter_cluster: "{{ cluster_info.clusters.values[cluster_input.user_input] }}" - debug: var: vcenter_cluster
目标数据结构(cluster_info.clusters)
{ "DMZ": { "datacenter": "dc" }, "K8S": { "datacenter": "dc" }, "Win": { "datacenter": "dc" } }
解决方案
直接用values[索引]取值的方式不够可控,更稳妥的做法是先提取字典的键为有序列表,通过索引拿到目标键后,再从字典中获取对应值:
分步写法(更清晰)
- set_fact: # 将字典的键转为列表,顺序为 ["DMZ", "K8S", "Win"] cluster_keys: "{{ cluster_info.clusters.keys() | list }}" - set_fact: # 把输入转为整数类型,通过索引取目标键,再获取对应集群数据 vcenter_cluster: "{{ cluster_info.clusters[cluster_keys[cluster_input.user_input | int]] }}" - debug: var: vcenter_cluster
合并写法(更简洁)
- set_fact: vcenter_cluster: "{{ cluster_info.clusters[(cluster_info.clusters.keys() | list)[cluster_input.user_input | int]] }}" - debug: var: vcenter_cluster
当cluster_input.user_input为1时,会通过索引取到K8S键,最终vcenter_cluster被设置为{"datacenter": "dc"}。
内容的提问来源于stack exchange,提问作者marcohald
相关产品推荐
相关产品推荐

