1

I try to use a conditional when inside a task with a nested loop. Specifically first of all I want to read different states per user, register the variable after that and want to iterate over this variable in another task.

Register the variable:

- name: "Desktop & Screen Saver - Get values for corner configuration"
  shell: "defaults read /Users/{{ item[0] }}/Library/Preferences/com.apple.dock {{ item[1] }}"
  register: result_CornerConfiguration
  loop: "{{ query('nested', ['{{ result_GetUsers.stdout_lines }}'], ['wvous-bl-corner', 'wvous-br-corner', 'wvous-tl-corner', 'wvous-tr-corner']) }}"

Now I want to set the state of each of those 4 configurations (wvous-bl-corner, wvous-br-corner, wvous-tl-corner, wvous-tr-corner) to 1, but only if the actual state is 6:

 - name:  "Desktop & Screen Saver - Secure screen saver corners"
   osx_defaults:
       domain: "/Users/{{ item[0] }}/Library/Preferences/com.apple.dock"
       key: "{{ item[1] }}"
       type: int
       value: 1
   loop: "{{ query('nested', ['{{ result_GetUsers.stdout_lines }}'], ['wvous-bl-corner', 'wvous-br-corner', 'wvous-tl-corner', 'wvous-tr-corner']) }}"
   when:
     - result_CornerConfiguration[item[0]][item[1]].stdout|int == 6

I tried multiple ways to access result_CornerConfiguration as an array or as an hash but nothing really works. Debug of the variable looks like this:

ok: [localhost] => {
    "result_CornerConfiguration": {
        "changed": true,
        "msg": "All items completed",
        "results": [
            {
                "_ansible_ignore_errors": null,
                "_ansible_item_label": [
                    "user",
                    "wvous-bl-corner"
                ],
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "_ansible_parsed": true,
                "changed": true,
                "cmd": "defaults read /Users/user/Library/Preferences/com.apple.dock wvous-bl-corner",
                "delta": "0:00:00.024526",
                "end": "2018-08-08 14:12:46.834554",
                "failed": false,
                "invocation": {
                    "module_args": {
                        "_raw_params": "defaults read /Users/user/Library/Preferences/com.apple.dock wvous-bl-corner",
                        "_uses_shell": true,
                        "argv": null,
                        "chdir": null,
                        "creates": null,
                        "executable": null,
                        "removes": null,
                        "stdin": null,
                        "warn": true
                    }
                },
                "item": [
                    "user",
                    "wvous-bl-corner"
                ],
                "rc": 0,
                "start": "2018-08-08 14:12:46.810028",
                "stderr": "",
                "stderr_lines": [],
                "stdout": "1",
                "stdout_lines": [
                    "1"
                ]
            },
            so on and so on ...
        ]
    }
}

I would be really thankful if anyone has an idea for my problem, maybe also with a more straight forward solution if my one doesn't make sense in an Ansible way. :)

Best wishes.

Edit:

Thanks to @Vladimir Botka I got the correct value, now I try to iterate over it in this task:

 - name:  "Desktop & Screen Saver - Secure screen saver corners"
   osx_defaults:
       domain: "/Users/{{ item[0] }}/Library/Preferences/com.apple.dock"
       key: "{{ item[1] }}"
       type: int
       value: 1
   loop: "{{ query('nested', ['{{ result_GetUsers.stdout_lines }}'], ['wvous-bl-corner', 'wvous-br-corner', 'wvous-tl-corner', 'wvous-tr-corner'], [0, 1, 2, 3]) }}"
   when:
     - result_CornerConfiguration.results[item[2]].stdout|int == 6

But it always changed the value to 1 and also seems not very elegant because of the third list ([0, 1, 2, 3]).

0

Is this the expression that you're looking for?

tasks:                                                                                     
  - debug:
      msg: "{{ result_CornerConfiguration.results[0]['stdout'] }}"

Loop with json_query to iterate:

  tasks:                                                                                     
    - debug:                                                                                 
        msg: "{{ item }}"                                                                    
      loop: "{{ result_CornerConfiguration | json_query('results[*][stdout]') }}"           
  • Yes thats exactly the value I want to read. Is it possible to iterate over this array? – biotecs Aug 12 '18 at 16:21
  • Yes. It's possible to iterate with the help of json_query. I've added example to the answer. – Vladimir Botka Sep 2 '18 at 6:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.