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

Ansible 2.10.8:合并不同长度字典列表(不新增条目)

解决方案

要实现用第二个字典列表补充第一个列表的缺失字段、且不新增条目(同时保留第一个列表的字段优先级)的需求,需要先将模板列表转换为键值对结构以快速匹配,再逐个合并对应条目。

具体实现步骤

  1. 将模板列表转为键值对字典:把user_users_skel转换为以username为键的字典,方便通过用户名快速定位到对应的模板条目。
  2. 遍历合并用户条目:对user_users中的每个用户,匹配模板字典中对应条目,用combine过滤器合并时,让原用户的字段覆盖模板中的同名字段。

完整Ansible Tasks

- name: 把用户模板列表转换为键值对字典
  set_fact:
    skel_users_dict: "{{ dict(user_users_skel | items2dict(key_name='username')) }}"

- name: 合并用户列表(保留原列表字段优先级)
  set_fact:
    eff_users: "{{ eff_users | default([]) + [ skel_users_dict[item.username] | combine(item) ] }}"
  loop: "{{ user_users }}"

- name: 输出合并后的结果
  debug:
    var: eff_users

变量定义(可放在Playbook或Inventory中)

user_users:
  - username: 'foo'
    primarygid: 42
  - username: 'bar'

user_users_skel:
  - username: foo
    uid: 600
    primarygid: 600
    shell: '/bin/bash'
    ssh_login: false
  - username: bar
    uid: 602
    primarygid: 602
    shell: '/bin/bash'
    ssh_login: true
  - username: blupp
    uid: 1000
    primarygid: 1000
    shell: '/bin/bash'
    ssh_login: true
    default_groups: 'admin'
    initial_password_hash: '$2349887rhfewklrjn'

结果说明

执行后eff_users的输出完全符合预期:

  • foo的primarygid保留原列表的42,同时补充了模板中的uid、shell等字段
  • bar的所有字段完成合并,原列表未定义的字段从模板中获取
  • 模板中的blupp条目不会被加入结果,因为原列表中不存在该用户

原方法无效的原因

你直接使用user_users | ansible.builtin.combine(user_users_skel)的方式错误,因为combine过滤器的作用是合并单个字典,无法处理列表中按用户名匹配的条目合并逻辑,因此得不到预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:05:14