如何用Ansible的subelements过滤器实现with_subelements迭代效果?
Ansible 2.14.8:用loop+subelements实现with_subelements的迭代效果
可以实现,核心是先将外层字典转换为键值对列表,再配合subelements过滤器完成嵌套迭代。以下是具体实现和说明:
示例变量
假设你的my_outer_dict结构如下:
my_outer_dict: web_servers: hosts: - web01.example.com - web02.example.com db_servers: hosts: - db01.example.com
正确的loop+subelements写法
- name: 迭代嵌套字典列表(loop+subelements) debug: msg: "服务器组: {{ item.0.key }}, 主机名: {{ item.1 }}" loop: "{{ my_outer_dict | dict2items | subelements('value.hosts') }}"
报错原因说明
subelements过滤器的输入要求是包含嵌套列表的字典组成的列表,而非直接的字典结构。你之前的错误大概率是未先通过dict2items将外层字典转换为[{key: ..., value: ...}, ...]格式的列表,导致subelements无法识别嵌套路径。
与with_subelements的等效性
这个写法和你之前正常运行的with_subelements逻辑完全一致:
- name: 迭代嵌套字典列表(with_subelements) debug: msg: "服务器组: {{ item.0.key }}, 主机名: {{ item.1 }}" with_subelements: - "{{ my_outer_dict | dict2items }}" - value.hosts
两者会输出完全相同的结果:
ok: [localhost] => (item=[{'key': 'web_servers', 'value': {'hosts': ['web01.example.com', 'web02.example.com']}}, 'web01.example.com']) => { "msg": "服务器组: web_servers, 主机名: web01.example.com" } ok: [localhost] => (item=[{'key': 'web_servers', 'value': {'hosts': ['web01.example.com', 'web02.example.com']}}, 'web02.example.com']) => { "msg": "服务器组: web_servers, 主机名: web02.example.com" } ok: [localhost] => (item=[{'key': 'db_servers', 'value': {'hosts': ['db01.example.com']}}, 'db01.example.com']) => { "msg": "服务器组: db_servers, 主机名: db01.example.com" }
在Ansible 2.14.8版本中,上述loop+subelements的写法完全可以实现和with_subelements相同的迭代行为。
内容的提问来源于stack exchange,提问作者Schrottfresse
相关产品推荐
相关产品推荐

