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
相关产品推荐
相关产品推荐

