Ansible嵌套变量正确指定求助:嵌套字典列表取值报错
解决Ansible中从嵌套列表字典提取值的问题
错误原因
datacenters是列表类型(由-开头的项组成),不是键值对结构的字典,因此无法通过datacenters[datacenter]这种字典索引方式直接获取对应项——这就是报错'list object' has no attribute 'TEST'的根本原因。
解决方案
方法一:使用selectattr+first过滤器(推荐,无需额外依赖)
通过Ansible内置过滤器筛选出匹配当前datacenter变量的列表项,再从中提取目标值:
# 第一步:筛选出当前数据中心的完整配置 - name: Get selected datacenter config set_fact: selected_dc: "{{ datacenters | selectattr('datacenter', 'equalto', datacenter) | first }}" Library: "{{ datacenter + '-Repository' }}" # 移除原代码中多余的单引号 # 第二步:从筛选结果中提取具体变量 - name: Extract target variables set_fact: vcenter_hostname: "{{ selected_dc.vars.vcenter_instance }}" ADController: "{{ selected_dc.vars.ADC }}"
说明:
selectattr('datacenter', 'equalto', datacenter):遍历datacenters列表,筛选出datacenter字段值与当前datacenter变量匹配的项first:取第一个匹配结果(你的数据中每个数据中心名称唯一,无需担心多匹配问题)- 原代码中
Library的单引号是冗余的,直接拼接字符串即可得到正确格式
方法二:使用json_query(需JMESPath支持)
如果熟悉JMESPath语法,可以用json_query直接定位并提取目标值:
- name: auto populate some variables based on which datacenter is selected set_fact: vcenter_hostname: "{{ datacenters | json_query(query_vcenter) }}" ADController: "{{ datacenters | json_query(query_adc) }}" Library: "{{ datacenter + '-Repository' }}" vars: query_vcenter: "[?datacenter=='{{ datacenter }}'].vars.vcenter_instance | [0]" query_adc: "[?datacenter=='{{ datacenter }}'].vars.ADC | [0]"
说明:
[?datacenter=='{{ datacenter }}']:筛选出datacenter字段匹配的列表项.vars.vcenter_instance:提取对应嵌套字段的值| [0]:将结果列表转为单个值(避免返回列表类型)
验证方法
添加debug任务确认提取结果是否正确:
- name: Verify extracted variables debug: msg: - "vcenter_hostname: {{ vcenter_hostname }}" - "ADController: {{ ADController }}" - "Library: {{ Library }}"
内容的提问来源于stack exchange,提问作者Danby
相关产品推荐
相关产品推荐

