доступ к элементам ansible из регистровой переменной

#json #list #variables #ansible

#json #Список #переменные #ansible

Вопрос:

Я запускаю задачу, которая фиксирует состояние интерфейса для нескольких устройств, а в некоторых случаях и для более чем одного интерфейса, но я могу одновременно извлекать только одну stdout_lines, но мне нужно получить все stdout_lines для хостов, на которых выполняется команда. У меня есть код задачи для доступа к соответствующим stdout_lines списка, но не ко всем из них.

     - name: Execute IOS command to check port state up/down before configuration
      ios_command:
        commands:
          - "show ip int brief | in {{item}}"
      loop: "{{ports}}"
      register: PortUpDown

    - name: print port state up/down
      debug:
        #msg: "{{item.0 | to_nice_yaml}}"
        #msg: "{{item.1 | to_nice_yaml}}"
        msg: "{{item}}"
      loop:
        #- "{{PortUpDown.results.0.stdout_lines}}"
        #- "{{PortUpDown.results.1.stdout_lines}}"
         - "{{PortUpDown.results}}"
      register: PortUpDown

    - name: print var that capture port state up/down
      debug:
        var: PortUpDown
  

Как вы можете видеть, я прокомментировал элементы, к которым я обращался во время тестирования. Что я в конечном счете хочу, так это иметь возможность доступа к 0,1,2,3 и т.д. без необходимости объявлять это, потому что в начале скрипта я не буду знать, будет ли это просто один интерфейс или несколько интерфейсов в списке, которые я собираюсь получить состояние порта.

Результат таков.

     ok: [hub1] => {
    "PortUpDown": {
        "changed": false, 
        "msg": "All items completed", 
        "results": [
            {
                "ansible_loop_var": "item", 
                "changed": false, 
                "failed": false, 
                "item": [
                    {
                        "ansible_facts": {
                            "discovered_interpreter_python": "/usr/bin/python"
                        }, 
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet1/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet1/1", 
                        "stdout": [
                            "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                            ]
                        ]
                    }, 
                    {
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet2/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet2/1", 
                        "stdout": [
                            "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                            ]
                        ]
                    }
                ], 
                "msg": [
                    {
                        "ansible_facts": {
                            "discovered_interpreter_python": "/usr/bin/python"
                        }, 
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet1/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet1/1", 
                        "stdout": [
                            "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                            ]
                        ]
                    }, 
                    {
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet2/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet2/1", 
                        "stdout": [
                            "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                            ]
                        ]
                    }
                ]
            }
        ]
    }
}
ok: [hub2] => {
    "PortUpDown": {
        "changed": false, 
        "msg": "All items completed", 
        "results": [
            {
                "ansible_loop_var": "item", 
                "changed": false, 
                "failed": false, 
                "item": [
                    {
                        "ansible_facts": {
                            "discovered_interpreter_python": "/usr/bin/python"
                        }, 
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet1/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet1/1", 
                        "stdout": [
                            "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                            ]
                        ]
                    }, 
                    {
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet2/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet2/1", 
                        "stdout": [
                            "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                            ]
                        ]
                    }
                ], 
                "msg": [
                    {
                        "ansible_facts": {
                            "discovered_interpreter_python": "/usr/bin/python"
                        }, 
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet1/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet1/1", 
                        "stdout": [
                            "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet1/1                unassigned      YES NVRAM  up                    up"
                            ]
                        ]
                    }, 
                    {
                        "ansible_loop_var": "item", 
                        "changed": false, 
                        "failed": false, 
                        "invocation": {
                            "module_args": {
                                "auth_pass": null, 
                                "authorize": null, 
                                "commands": [
                                    "show ip int brief | in Ethernet2/1"
                                ], 
                                "host": null, 
                                "interval": 1, 
                                "match": "all", 
                                "password": null, 
                                "port": null, 
                                "provider": null, 
                                "retries": 10, 
                                "ssh_keyfile": null, 
                                "timeout": null, 
                                "username": null, 
                                "wait_for": null
                            }
                        }, 
                        "item": "Ethernet2/1", 
                        "stdout": [
                            "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                        ], 
                        "stdout_lines": [
                            [
                                "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
                            ]
                        ]
                    }
                ]
            }
        ]
    }
}
  

Ответ №1:

Для этого вы можете использовать комбинацию фильтра map для извлечения stdout_lines всех элементов вашего списка, а затем flatten результирующего списка list.

Учитывая учебник:

 - hosts: all
  gather_facts: no
      
  tasks:
    - command: "echo {{ item }}"
      loop: 
        - "Ethernet2/1                unassigned      YES NVRAM  administratively down down"
        - "Ethernet1/1                unassigned      YES NVRAM  up                    up"
      register: PortUpDown

    - debug: 
        msg: "{{ item }}"
      loop: "{{ PortUpDown.results | map(attribute='stdout_lines') | list | flatten }}"  
  

Это приводит к повторению:

 PLAY [all] *********************************************************************************************************

TASK [command] *****************************************************************************************************
changed: [localhost] => (item=Ethernet2/1                unassigned      YES NVRAM  administratively down down)
changed: [localhost] => (item=Ethernet1/1                unassigned      YES NVRAM  up                    up)

TASK [debug] *******************************************************************************************************
ok: [localhost] => (item=Ethernet2/1 unassigned YES NVRAM administratively down down) => {
    "msg": "Ethernet2/1 unassigned YES NVRAM administratively down down"
}
ok: [localhost] => (item=Ethernet1/1 unassigned YES NVRAM up up) => {
    "msg": "Ethernet1/1 unassigned YES NVRAM up up"
}

PLAY RECAP *********************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    
  

Комментарии:

1. быстрый вопрос по этому поводу. В каком разделе документа ansible я могу подробнее прочитать об этом, чтобы я мог полностью понять, что происходит?

2. Извините, я не совсем понял ваш вопрос? Что вы подразумеваете под тем, что происходит ?

3. О, я хотел сказать, есть ли какая-либо документация, которую я могу прочитать, которая касается обработки переменных с помощью maps и передачи фильтров.

4. Возможно, вам захочется сначала прочитать документацию Jinja , поскольку Jinja — это система шаблонов, используемая Ansible. На первый взгляд страница может показаться длинной, но на самом деле она не такая длинная, особенно если вы знаете, что у вас есть вся документация на этой странице. В Jinja добавлен набор дополнительных фильтров, и все они также сгруппированы на одной странице документации Ansible .

5. При всем этом у вас должен быть достаточно четкий обзор, насколько это касается шаблонов в Ansible.