You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible 2.8动态获取YAML文件嵌套列表的实现方法问询

Ansible 2.8动态获取YAML文件嵌套属性的实现方法

我有如下YAML文件:

---
mock_key:
  mock_sub_key:
   - my-value-1
   - my-value-2
  random_other_key:
   - random-value-1
   - random-value-2
  more_sub_key:
   - value-1

我希望通过传入的dynamic_key和dynamic_sub_key参数,动态查找mock_sub_key或random_other_key对应的嵌套列表。尝试了以下写法均失败:

# 带引号,无效
loop:  "{{ (lookup('file', 'my_file.yaml') | from_yaml) | map(attribute='{{dynamic_key}}.{{dynamic_sub_key}}') }}"

# 不带引号,无效
loop: "{{ (lookup('file', 'my_file.yaml') | from_yaml) | map(attribute={{dynamic_key}}.{{dynamic_sub_key}}) }}"

但硬编码属性的写法可以正常工作:

loop: "{{ (lookup('file', 'my_file.yaml') | from_yaml) |map(attribute='mock_key.mock_sub_key') }}"
 
loop:  "{{ (lookup('file', 'my_file.yaml') | from_yaml) map(attribute='mock_key.random_other_key') }}"

请问在Ansible 2.8中是否可以实现动态获取文件中的属性?若可以,具体该如何操作?


可以实现,问题出在Jinja2变量插值的用法错误,以下是两种可行的解决方法:

方法一:字符串拼接属性路径

用Jinja2的字符串拼接符~将两个参数拼成完整的属性路径字符串,直接传给map的attribute参数:

loop: "{{ (lookup('file', 'my_file.yaml') | from_yaml) | map(attribute=dynamic_key ~ '.' ~ dynamic_sub_key) }}"

方法二:直接字典嵌套访问

跳过map过滤器,直接通过字典嵌套键访问获取目标列表,写法更简洁:

loop: "{{ (lookup('file', 'my_file.yaml') | from_yaml)[dynamic_key][dynamic_sub_key] }}"

原写法失败原因

  • 带引号的写法:'{{dynamic_key}}.{{dynamic_sub_key}}'会被解析成固定字面量字符串,而非动态拼接的属性路径,自然无法匹配目标值。
  • 不带引号的写法:attribute={{dynamic_key}}.{{dynamic_sub_key}}会被解析为dynamic_key变量的dynamic_sub_key属性,而非字符串拼接,不符合需求。

内容的提问来源于stack exchange,提问作者Vikki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:50:05