Ansible循环读取Keycloak Realm模板数组时条件失效报错求助
解决方案
你的任务失败的核心原因是:subelements过滤器在when条件判断之前就执行了。原任务中,loop会先尝试对demo-app下的所有角色(包括Developer、Operator)应用subelements,但这两个角色没有composites.client.realm-management路径,直接触发错误,导致when条件根本没机会生效。
下面提供两种可行的解决思路:
方法1:用json_query直接提取目标数组
通过json_query一次性筛选出Administrator角色下的realm-management数组,直接遍历数组元素:
- name: 'Ensure realm-management roles are added to demo-app "Administrator" role' debug: msg: "{{ item }}" loop: >- {{ lookup('template', 'realm/DemoRealm-realm.json.j2') | from_json | json_query('roles.client."demo-app"[?name==`Administrator` && composite==true].composites.client."realm-management"[]') }}
关键说明:
from_json:将模板渲染后的字符串转换为JSON对象,否则无法进行后续的JSON查询。json_query表达式:roles.client."demo-app"定位到目标角色列表[?name==Administrator&& composite==true]筛选出符合条件的角色.composites.client."realm-management"[]提取该角色下的realm-management数组元素([]用于展开数组)
方法2:分步处理(更直观)
先提取Administrator角色对象,再遍历其realm-management数组:
- name: Load realm template and get Administrator role set_fact: admin_role: >- {{ lookup('template', 'realm/DemoRealm-realm.json.j2') | from_json | json_query('roles.client."demo-app"[?name==`Administrator` && composite==true]') | first }} - name: Print realm-management roles debug: msg: "{{ item }}" loop: "{{ admin_role.composites.client['realm-management'] }}" when: admin_role.composites is defined
关键说明:
first:因为json_query返回的是数组(即使只有一个元素),用first取出单个角色对象。- 第二步的
when条件可以确保只有当composites存在时才执行遍历,避免潜在的空值错误。
内容的提问来源于stack exchange,提问作者Varun Kancharla
相关产品推荐
相关产品推荐

