Ansible v2.9.25 合并main_roles与default_roles如何递归合并subjects列表
正确实现代码
直接替换你原来的Setting var roles_managed任务即可:
- name: "Setting var roles_managed" set_fact: roles_managed: "{{ roles_managed | default([]) + [ merged_item ] }}" vars: # 匹配当前main角色对应的default角色,没有匹配则返回空字典 matched_default_role: "{{ default_roles | selectattr('name', 'equalto', item.name) | first | default({}) }}" # 合并两个角色的subjects列表,没有匹配的default角色时就保留原main角色的subjects merged_subjects: "{{ item.subjects + (matched_default_role.subjects | default([])) }}" # 合并顶层字段后覆盖subjects为合并后的列表 merged_item: "{{ item | combine(matched_default_role) | combine({'subjects': merged_subjects}) }}" loop: "{{ main_roles }}"
执行后打印的edit角色就会得到你预期的subjects合并结果。
错误原因说明
- 你之前的参数传递逻辑完全错误:把
combine的recursive=true参数和selectattr过滤器用管道符串联,相当于把布尔值true传给selectattr做迭代,自然会抛出'bool' object is not iterable错误。 - 即使正确配置
recursive=true也达不到你的预期:combine的递归合并仅针对嵌套字典结构,对于值为列表的字段,默认还是会直接用第二个字典的列表覆盖第一个,所以需要单独对subjects列表做拼接处理。 selectattr返回的是列表,你之前直接把列表传给combine也不符合参数要求,需要用first取第一个匹配的元素。
内容的提问来源于stack exchange,提问作者BlueAtreides
相关产品推荐
相关产品推荐

