При попытке перебрать эти данные из вывода отладки ansible я могу перебирать только первый элемент индекса, который равен нулю 0. Я хотел бы перебрать все элементы. Ниже приведен образец вывода Ansible, а под ним — задачи Ansible, над которыми я работаю.
{
"ansible_loop_var": "item",
"item": {
"key": "SwitchName",
"value": [
{
"key": "1",
"value": {
"cdp": {
"address": "192.168.16.225",
"deviceId": "482ef8200",
"portId": "Port C9300",
"sourcePort": "1"
},
"lldp": {
"managementAddress": "192.168.16.225",
"portId": "2",
"sourcePort": "1",
"systemName": "**LAB-Remote-1**"
}
}
},
{
"key": "4",
"value": {
"cdp": {
"address": "10.22.89.16",
"deviceId": "12efa487400",
"portId": "Port 1",
"sourcePort": "4"
},
"lldp": {
"managementAddress": "10.22.89.16",
"portId": "1",
"sourcePort": "4",
"systemName": "C9300"
}
}
},
{
"key": "5",
"value": {
"cdp": {
"address": "172.16.254.56",
"deviceId": "f43fc84af710",
"portId": "Port 1",
"sourcePort": "5"
},
"lldp": {
"managementAddress": "172.16.254.56",
"portId": "1",
"sourcePort": "5"
}
}
},
{
"key": "6",
"value": {
"cdp": {
"address": "10.254.255.216",
"deviceId": "4835187cff00",
"portId": "Port 50",
"sourcePort": "6"
},
"lldp": {
"managementAddress": "10.254.255.216",
"portId": "50",
"sourcePort": "6"
}
}
}
]
}
}
Вот код, который я использую, выглядит так, и в моем примере задачи я печатаю индекс 0 списка, и он возвращает данные нормально, но я хочу напечатать все элементы списка, и размер списка будет отличаться.
- name: print out lldp port data
debug:
var: item.value.0.value.lldp.systemName
loop: "{{cdp_lldp_by_switch | dict2items}}"
Эта задача распечатает LAB-Remote-1, поскольку в списке он равен 0.
Я обнаружил, что использование конфигурации вложенного цикла — лучший подход к решению этой ситуации.
Я реализовал следующее решение:
Внешний цикл: я использую include_tasks для вызова другого файла задачи и циклического перебора каждого переключателя.
Внутренний цикл: во внутреннем цикле я вычисляю длину списка, а затем перебираю элементы списка.
Этот подход был вдохновлен видео на YouTube [Использование вложенных циклов в Ansible], которое очень помогло в решении проблемы.
https://thewikihow.com/video_89Yhc4P_Ggc&lc=Ugx48QKBqkZWx1zWN9B4AaABAg.A7_XCM8LlODA7a3V9_r4_L
outer loop task:
- name: Include task for nested loop
include_tasks: ./inner_loop.yml
loop: "{{ cdp_lldp_by_switch | dict2items }}"
loop_control:
loop_var: current_switch
inner loop task:
- name: Set port list length
set_fact:
port_len: "{{ current_switch.value | length | default(0) }}"
- name: Print out inner loop
debug:
msg: "{{ current_switch.value[item].value.lldp.systemName | default('none') }}:{{ current_switch.value[item].value.lldp.sourcePort | default('none') }}"
loop: "{{ range(0, port_len | int) }}"
loop_control:
loop_var: item