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
相关产品推荐
相关产品推荐

