Я пытаюсь использовать условное выражение внутри задачи с вложенным циклом. В частности, прежде всего я хочу прочитать разные состояния для каждого пользователя, зарегистрировать переменную после этого и перебрать эту переменную в другой задаче.
Зарегистрируйте переменную:
- 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']) }}"
Теперь я хочу установить состояние каждой из этих 4 конфигураций (wvous-bl-corner, wvous-br-corner, wvous-tl-corner, wvous-tr-corner) равным 1, но только если фактическое состояние равно 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
Я пробовал несколько способов получить доступ result_CornerConfiguration
как массив или как хеш, но на самом деле ничего не работает. Отладка переменной выглядит так:
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 ... ] } }
Я был бы очень благодарен, если у кого-нибудь есть идея для моей проблемы, может быть, также с более прямым решением, если мое решение не имеет смысла в Ansible. :)
С наилучшими пожеланиями.
Редактировать:
Благодаря @Vladimir Botka я получил правильное значение, теперь я пытаюсь перебрать его в этой задаче:
- 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
Но он всегда менял значение на 1 и также кажется не очень элегантным из-за третьего списка ([0, 1, 2, 3]).
Это то выражение, которое вы ищете?
tasks:
- debug:
msg: "{{ result_CornerConfiguration.results[0]['stdout'] }}"
Цикл с json_query для итерации:
tasks:
- debug:
msg: "{{ item }}"
loop: "{{ result_CornerConfiguration | json_query('results[*][stdout]') }}"