Ansible动态更新嵌套字典字段:如何避免覆盖原有内容?
解决Ansible中修改嵌套数组字典字段的问题
问题场景
从REST API获取JSON格式字典数据并存入output变量,需将host_switch_spec.host_switches数组内所有对象的"host_switch_mode": "STANDARD"修改为"host_switch_mode": "LEGACY",修改后的结果作为PUT请求Body发送至API。同时需要批量处理多个此类字典对象。
遇到的问题
尝试使用Ansible的combine过滤器时,会直接覆盖整个host_switch_spec.host_switches数组,导致host_switch_name等原有字段丢失,即使尝试所有list_merge选项也无法解决。
可行实现方案
通过map过滤器遍历数组内的每个字典对象,结合combine仅修改目标字段,保留其他原有属性,再递归合并回原结构。
单个字典对象处理示例
- name: 修改host_switch_mode字段 set_fact: modified_output: >- {{ output | combine( { 'host_switch_spec': { 'host_switches': output.host_switch_spec.host_switches | map('combine', {'host_switch_mode': 'LEGACY'}) | list } }, recursive=true ) }}
批量处理多个字典对象示例
- name: 初始化结果列表 set_fact: modified_output_list: [] - name: 批量修改多个字典对象 set_fact: modified_output_list: "{{ modified_output_list + [modified_item] }}" loop: "{{ original_output_list }}" vars: modified_item: >- {{ item | combine( { 'host_switch_spec': { 'host_switches': item.host_switch_spec.host_switches | map('combine', {'host_switch_mode': 'LEGACY'}) | list } }, recursive=true ) }}
方案说明
map('combine', {'host_switch_mode': 'LEGACY'}):遍历host_switches数组中的每个字典,仅将指定字段合并进去,保留其他原有字段(如host_switch_name)。recursive=true:确保combine过滤器递归处理嵌套的字典结构,不会丢失上层或其他同级字段。
内容的提问来源于stack exchange,提问作者zagpoint
相关产品推荐
相关产品推荐

