如何使用Ansible从YAML配置中提取Machine属性的自定义列表
问题场景
将WebLogic域的YAML配置存入yaml_domain_file变量,需要提取所有topology.Server子节点下的Machine属性值,最终生成独立的取值列表。
已验证可正常运行的操作
已通过如下代码实现所有Server节点名称列表的获取:
- set_fact: servers: "{{ yaml_domain_file.topology.Server | list }}"
执行后输出的Server名称列表和预期完全匹配。
未达预期的尝试
尝试用如下代码提取Machine属性列表,执行后无法输出正确结果:
- debug: msg: "{{ yaml_domain_file.topology.Server.*.Machine | list }}"
失败原因
解析YAML后,topology.Server是典型的键值对字典结构,.*通配符在Jinja2的字典遍历逻辑中,无法直接穿透字典层级、读取每个键对应值的内部属性,因此会输出为空或执行报错。
正确的实现方式
可选用以下任意一种经过验证的写法完成提取:
写法1:提取字典所有值做属性映射
直接调用字典原生的values()方法拿到所有Server配置的列表,再通过map过滤提取每个配置下的Machine属性:
- debug: msg: "{{ yaml_domain_file.topology.Server.values() | map(attribute='Machine') | list }}"
执行后直接返回目标Machine列表:
["wlm-pil-10-n0", "wlm-pil-10-n1", "wlm-pil-10-n2"]
写法2:字典转键值对结构后提取
通过dict2items过滤器把Server字典转换成统一的键值对列表,再提取对应属性:
- debug: msg: "{{ yaml_domain_file.topology.Server | dict2items | map(attribute='value.Machine') | list }}"
两种写法的执行结果完全一致,可根据自身代码习惯选择。
内容的提问来源于stack exchange,提问作者shamaN
相关产品推荐
相关产品推荐

