Ansible 搜索和查询

Ansible search and query

根据 larsks 的建议进行了更新。 具有以下结构

    "intf_output_ios": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python3"
        },
        "changed": false,
        "failed": false,
        "gathered": [
            {
                "name": "GigabitEthernet0/0"
            },
            {
                "mode": "trunk",
                "name": "GigabitEthernet0/1",
                "trunk": {
                    "allowed_vlans": [
                        "10",
                        "20",
                        "30",
                        "99",
                        "100"
                    ],
                    "encapsulation": "dot1q"
                }
            },
            {
                "mode": "trunk",
                "name": "GigabitEthernet0/2",
                "trunk": {
                    "allowed_vlans": [
                        "10",
                        "20",
                        "30",
                        "99",
                        "100"
                    ],
                    "encapsulation": "dot1q"
                }
            },
            {
                "access": {
                    "vlan": 30
                },
                "mode": "access",
                "name": "GigabitEthernet0/3"
            },
            {
                "name": "GigabitEthernet1/0"
            },
            {
                "name": "GigabitEthernet1/1"
            },
            {
                "name": "GigabitEthernet1/2"
            },
            {
                "name": "GigabitEthernet1/3"
            },
            {
                "name": "GigabitEthernet2/0"
            },
            {
                "name": "GigabitEthernet2/1"
            },
            {
                "name": "GigabitEthernet2/2"
            },
            {
                "name": "GigabitEthernet2/3"
            },
            {
                "name": "GigabitEthernet3/0"
            },
            {
                "name": "GigabitEthernet3/1"
            },
            {
                "name": "GigabitEthernet3/2"
            },
            {
                "access": {
                    "vlan": 99
                },
                "mode": "access",
                "name": "GigabitEthernet3/3"
            }
        ]
    }

要仅打印 VLAN 30 中的端口,请使用以下命令?

- name: "P901T6: Set fact to include only access ports - IOS"
  set_fact:
    access_ports_ios_2: "{{ intf_output_ios | json_query(query) }}"
  vars:
    query: >-
      gathered[?access.vlan==`30`]

- name: "P901T7: Dump list of access ports - IOS"
  debug:
    var=access_ports_ios_2

注意:重要的是使用 30(带反引号)而不是 '30'

我已经经历了 https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#managing-list-variables 但还没有真正理解如何解决这个问题。如果有人有一些好的 link 那将非常有用

结构类似于

ok: [access01] => {
    "access_ports_ios": [
        {
            "access": {
                "vlan": 30
            },
            "mode": "access",
            "name": "GigabitEthernet0/3"
        },
        {
            "access": {
                "vlan": 99
            },
            "mode": "access",
            "name": "GigabitEthernet3/3"
        }
    ]
}

要获取 vlan 30 中的端口,请使用:

- debug:
    var: access_ports_ios|json_query(query)
  vars:
    query: >-
      [?access.vlan==`30`]

注意: 如果您想为 vlan 使用变量而不是对其进行硬编码。我必须做如下:

- name: Debug 4
  debug:
    var: access_ports_ios|json_query('[?access.vlan==`{{ src_vlan | int}}`]')

您要的是 gathered.access,但 gathered 是一个列表,没有 access 属性。您想要“gatheredaccess.vlan30 的所有项目(并注意 access.vlan 的值是一个 整数 ,不是字符串):

- debug:
    var: intf_output_ios|json_query(query)
  vars:
    query: >-
      gathered[?access.vlan==`30`]

给你的例子输入产生:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "intf_output_ios|json_query(query)": [
        {
            "access": {
                "vlan": 30
            },
            "mode": "access",
            "name": "GigabitEthernet0/3"
        }
    ]
}

我要重申我经常为 json_query 问题提供的建议:使用 jpterm or the JMESPath website 之类的东西根据您的实际数据测试 JMESPath 表达式。这使得找出表达式可能出错的位置变得更加容易。