Как перебирать вложенные списки различной длины в цикле Ansible?

При попытке перебрать эти данные из вывода отладки 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.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что использование конфигурации вложенного цикла — лучший подход к решению этой ситуации.

Я реализовал следующее решение:

Внешний цикл: я использую 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

Другие вопросы по теме