Итак, мы хотим распространить список авторизованных пользователей на наши хосты. У нас есть пакетный скрипт, который делает это за нас и преобразует его в формат JSON.
- name: Process win_shell output
set_fact:
qusers: "{{ qusers_ps.stdout | from_json }}"
- debug:
var: qusers
verbosity: 2
Эта отладка выводит следующее:
{
"qusers": {
"Server1": []
},
"_ansible_verbose_always": true,
"_ansible_no_log": false,
"changed": false
}
{
"qusers": {
"Server2": [
{
"USERNAME": "user102",
"SESSIONNAME": "rdp-tcp#0",
"ID": "6",
"STATE": "Active",
"IDLE TIME": "32",
"LOGON TIME": "5/29/2020 9:13 AM"
}
]
},
"_ansible_verbose_always": true,
"_ansible_no_log": false,
"changed": false
}
{
"qusers": {
"Server3": [
{
"USERNAME": "user183",
"SESSIONNAME": "",
"ID": "49",
"STATE": "Disc",
"IDLE TIME": "14:34",
"LOGON TIME": "5/28/2020 7:58 AM"
},
{
"USERNAME": "user103",
"SESSIONNAME": "",
"ID": "51",
"STATE": "Disc",
"IDLE TIME": "18:26",
"LOGON TIME": "5/28/2020 8:18 AM"
},
{
"USERNAME": "user148",
"SESSIONNAME": "",
"ID": "52",
"STATE": "Disc",
"IDLE TIME": "17:10",
"LOGON TIME": "5/28/2020 9:08 AM"
}
]
},
"_ansible_verbose_always": true,
"_ansible_no_log": false,
"changed": false
}
Итак, вы можете видеть, что отладка возвращает JSON с именем сервера в качестве элемента root, а затем массивом объекты со значениями ключ / пара. Нам необходимо иметь возможность запрашивать значения в этих объектах массива, такие как «USERNAME» и «IDLE TIME» для каждого сервера. Мне удалось сделать это статически (показано ниже), чтобы захватить пользователя первого объекта массива, но я не могу понять, как это сделать динамически.
- name: Test selecting JSON output and register as array
debug:
msg: "{{ item.value }}"
loop: "{{ q('dict', qusers) }}"
register: user_op
- name: Set array variable
set_fact:
user_array: "{{ user_op.results }}"
- name: Print item value # Prints array object as is
debug:
msg: "{{ item.item.value }} "
with_items: "{{ user_array }}"
- name: Test pulling JSON from array with conditional # This one works, but only grabs the first user
debug:
msg: "{{ item.item.value[0]['USERNAME'] }} is logged into {{item.item.key }}"
with_items: "{{ user_array }}"
when: item.item.value != []
Последняя игра - это единственный раз, когда мне удавалось достичь определенного c элемента ключа / пары. Как мне изменить это, чтобы динамически выполнять эту операцию для каждого объекта сеанса пользователя в массиве, а не только для первого, и без номеров жесткого кодирования ??