Ansible修改嵌套字典列表内addressType时字段丢失问题咨询
问题原因
Ansible的combine过滤器仅对字典类型执行递归合并,遇到列表类型会直接整体覆盖而非合并列表内的元素。你原有写法中直接传入{'interfaces': [{ 'addressType': ['static'] }]},相当于把整个interfaces列表替换为仅含一个只有addressType字段的字典的新列表,自然会丢失接口下的其他原有字段。
修复方案
场景1:interfaces列表仅包含1个元素(和你给出的示例一致)
直接取出列表内的原有接口字典,合并新的addressType字段后再放回列表即可:
- name: 修改顶层addressType和resourceRecordFlag字段 set_fact: IPcontrol_static_dns: "{{ check_domain_name.json | combine({'addressType' : 'static' }, { 'resourceRecordFlag': 'true' }, recursive=True) }}" - name: 修改嵌套在interfaces内的addressType字段 set_fact: IPcontrol_static_dns: "{{ IPcontrol_static_dns | combine( { 'interfaces': [ IPcontrol_static_dns.interfaces[0] | combine({'addressType': ['static']}, recursive=True) ] }, recursive=True ) }}"
场景2:interfaces列表包含多个元素,需批量修改所有接口的addressType字段
使用map过滤器遍历列表所有元素,逐一合并字段:
- name: 修改顶层addressType和resourceRecordFlag字段 set_fact: IPcontrol_static_dns: "{{ check_domain_name.json | combine({'addressType' : 'static' }, { 'resourceRecordFlag': 'true' }, recursive=True) }}" - name: 批量修改所有接口的addressType字段 set_fact: IPcontrol_static_dns: "{{ IPcontrol_static_dns | combine( { 'interfaces': IPcontrol_static_dns.interfaces | map('combine', {'addressType': ['static']}, recursive=True) | list }, recursive=True ) }}"
修改后interfaces下的excludeFromDiscovery、id、ipAddress等原有字段都会完整保留,仅addressType字段值会被更新为你指定的["static"]。
内容的提问来源于stack exchange,提问作者sundrys1
相关产品推荐
相关产品推荐

