You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible中嵌套字典数组的新增与按name字段更新实现方法

解决方案

你之前用union达不到预期是因为union过滤器只会对数组内完全一致的元素做去重,不会识别name作为业务主键匹配更新;combine过滤器是用于字典合并的,直接作用于数组不会生效。

你可以通过「数组拼接 → 按name字段转字典自动覆盖 → 转回数组」的过滤器链实现两个场景的需求,不需要区分新增和修改类的更新项,写法如下:

{{ 
  (process_names + update1 + update2)
  | items2dict(key_name='name', value_name='.')
  | dict2items
  | map(attribute='value')
  | list
}}

实现逻辑说明:

  • 拼接时旧数据在前,更新数据在后,转字典时同name的条目会自动用后面的新值覆盖旧值,正好满足场景2的修改需求
  • 不存在的name会作为新键保留在字典中,正好满足场景1的新增需求

运行后得到的process_names最终值为:

- name: myprocess
  exe:
    - /usr/myexe
- name: myprocess1
  exe:
    - /opt/myexe1
- name: myprocess2
  exe:
    - /usr/myexe2

如果使用的Ansible版本低于2.10,不支持items2dict的value_name='.'参数,可以用下面的兼容写法:

{% set ns = namespace(result = process_names | items2dict(key_name='name')) %}
{% for item in update1 + update2 %}
  {% set ns.result[item.name] = item %}
{% endfor %}
{{ ns.result.values() | list }}

内容的提问来源于stack exchange,提问作者Vimalraj Selvam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:42:01