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

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合并结果。


错误原因说明

  1. 你之前的参数传递逻辑完全错误:把combine的recursive=true参数和selectattr过滤器用管道符串联,相当于把布尔值true传给selectattr做迭代,自然会抛出'bool' object is not iterable错误。
  2. 即使正确配置recursive=true也达不到你的预期:combine的递归合并仅针对嵌套字典结构,对于值为列表的字段,默认还是会直接用第二个字典的列表覆盖第一个,所以需要单独对subjects列表做拼接处理。
  3. selectattr返回的是列表,你之前直接把列表传给combine也不符合参数要求,需要用first取第一个匹配的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:45:00