Ansible 2.10.8:合并不同长度字典列表(不新增条目)
解决方案
要实现用第二个字典列表补充第一个列表的缺失字段、且不新增条目(同时保留第一个列表的字段优先级)的需求,需要先将模板列表转换为键值对结构以快速匹配,再逐个合并对应条目。
具体实现步骤
- 将模板列表转为键值对字典:把
user_users_skel转换为以username为键的字典,方便通过用户名快速定位到对应的模板条目。 - 遍历合并用户条目:对
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
相关产品推荐
相关产品推荐

