Ansible如何以流式映射YAML输出字典列表?求非Jinja模板方案
在Ansible中实现字典列表的流式映射YAML输出
除了自定义Jinja模板,还有两种可行方法可以实现需求:
方法一:利用内置yaml过滤器结合循环
Ansible的yaml过滤器基于PyYAML实现,通过给单个字典设置default_flow_style=True参数,可将其转换为流式映射格式,再通过循环拼接成列表结构。
示例Playbook:
- name: 生成流式映射格式YAML hosts: localhost vars: my_servers: - hostname: myhostname1 id: 101 reverse: 'true' type: red - hostname: myhostname2 id: 102 reverse: 'false' type: white - hostname: myhostname3 id: 103 reverse: 'true' type: blue - hostname: myhostname4 id: 104 reverse: 'false' type: green tasks: # 输出到控制台 - name: 打印流式YAML debug: msg: | my_servers: {% for server in my_servers %} - {{ server | yaml(default_flow_style=True) | trim }} {% endfor %} # 写入到文件 - name: 写入流式YAML到文件 copy: content: | my_servers: {% for server in my_servers %} - {{ server | yaml(default_flow_style=True) | trim }} {% endfor %} dest: ./servers_output.yaml
方法二:使用ansible.utils.to_yaml过滤器(需额外安装集合)
ansible.utils集合提供的to_yaml过滤器支持更细粒度的格式控制,可通过flow_style参数指定列表用块式、列表内的字典用流式。
步骤1:安装集合
ansible-galaxy collection install ansible.utils
步骤2:Playbook示例
- name: 用ansible.utils生成目标格式YAML hosts: localhost collections: - ansible.utils vars: my_servers: - hostname: myhostname1 id: 101 reverse: 'true' type: red - hostname: myhostname2 id: 102 reverse: 'false' type: white - hostname: myhostname3 id: 103 reverse: 'true' type: blue - hostname: myhostname4 id: 104 reverse: 'false' type: green tasks: - name: 生成并输出流式YAML debug: msg: "{{ {'my_servers': my_servers} | to_yaml(flow_style={'my_servers': False, 'my_servers.*': True}) }}" - name: 写入到文件 copy: content: "{{ {'my_servers': my_servers} | to_yaml(flow_style={'my_servers': False, 'my_servers.*': True}) }}" dest: ./servers_output.yaml
说明
flow_style参数的字典配置中:
'my_servers': False指定顶层列表采用块式格式(每个元素单独一行)'my_servers.*': True指定列表内的所有字典元素采用流式映射格式
内容的提问来源于stack exchange,提问作者honeybeeham
相关产品推荐
相关产品推荐

