Search code examples
ansiblekeycloakansible-template

Loop with conditional in ansible


I have a keycloak realm template in ansible and want to load array of values from that template.

My template file looks something like this:

 {
 // Some json here
  "roles": {
     "client": {
         "demo-app": [
         {
           "name": "Administrator",
           "composite": true,
           "composites": {
             "client": {
               "realm-management": [
                 "view-users",
                 "manage-identity-providers",
                 "query-clients",
                 "query-users",
               ]
             }
           },
           "clientRole": true,
         },
         {   
           "name": "Developer",
           "composite": false,
           "clientRole": true,
         },
         {
           "name": "Operator",
           "composite": false,
           "clientRole": true,
         }
      ],
     }
  }
}

Now I want to read realm-management array values from the template. For that, I have written task in ansible. It goes as below:

- name: 'Ensure realm-management roles are added to demo-app "Administrator" role'
   debug:
     msg: "{{ item }}"
   loop: "{{ lookup('template', 'realm/DemoRealm-realm.json.j2').roles.client['demo-app'] }} | subelements('composites.client.realm-management') }}"
   when:
     - item.name == 'Administrator'
     - item.composite == true
     - item.composites is defined

My expectation is to print values from realm-management array. But the task I have added is also looping through Developer and Operator objects ignoring conditional and as they don't have composites key in them, task is failing. I have tried numerous approaches but none worked. Please suggest me what to do.


Solution

  • You can use json_query to validate object properties like so:

     loop: "{{ lookup('template', 'realm/DemoRealm-realm.json.j2').roles.client['demo-app'] | json_query('[?name==`Administrator` && composite==`true` && composites]') }}"
    

    when: item.composites is defined"