【问题标题】:Multiple searches with with json_query/jmespath filter in Ansible在 Ansible 中使用 json_query/jmespath 过滤器进行多次搜索
【发布时间】:2018-02-13 12:47:07
【问题描述】:

我正在尝试解析以下 json 中的特定子网名称,同时在 json_query 中使用 contains_with 或 starts_with 过滤器。 它包含两个 vnet,每个 vnet 都有多个子网:

{
  "azure_virtualnetworks": [
    {
      "name": "test-vnet-172-17-0-0-19", 
      "properties": {
        "subnets": [
            {
              "name": "test-confluent-subnet-172-17-0-0-28", 
              "properties": {
                  "addressPrefix": "172.20.88.0/28", 
                  "networkSecurityGroup": {
                      "id": "/subscriptions/********/resourceGroups/test-confluent-rg/providers/Microsoft.Network/networkSecurityGroups/test-confluent-nsg"
                  }, 
                  "provisioningState": "Succeeded"
              }
            }, 
            {
              "name": "test-test-subnet-172-17-0-32-28", 
              "properties": {
                  "addressPrefix": "172.20.88.32/28", 
                  "networkSecurityGroup": {
                      "id": "/subscriptions/********/resourceGroups/test-test-rg/providers/Microsoft.Network/networkSecurityGroups/test-test-nsg"
                  }, 
                  "provisioningState": "Succeeded"
              }
            }
        ]
      } 
    },
    {
      "name": "test2-vnet-172-17-1-0-19", 
      "properties": {
        "subnets": [
            {
              "name": "test-confluent-subnet-172-17-1-0-28", 
              "properties": {
                  "addressPrefix": "172.20.88.0/28", 
                  "networkSecurityGroup": {
                      "id": "/subscriptions/********/resourceGroups/test-confluent-rg/providers/Microsoft.Network/networkSecurityGroups/test-confluent-nsg"
                  }, 
                  "provisioningState": "Succeeded"
              }
            }, 
            {
              "name": "test-qatesting-subnet-172-17-1-16-28", 
              "properties": {
                  "addressPrefix": "172.20.88.16/28", 
                  "networkSecurityGroup": {
                      "id": "/subscriptions/********/resourceGroups/test-qatesting-rg/providers/Microsoft.Network/networkSecurityGroups/test-qatesting-nsg"
                  }, 
                  "provisioningState": "Succeeded"
              }
            }
        ]
      }
    }
  ]
}

通过虚拟网络名称搜索后,我需要搜索子网名称。

我可以毫无问题地过滤到子网列表。例如

azure_virtualnetworks[?contains(name,`test2-vnet`)].properties.subnets[]

返回:

 [
   {
     "name": "test-confluent-subnet-172-17-1-0-28",
     "properties": {
       "addressPrefix": "172.20.88.0/28",
       "networkSecurityGroup": {
         "id": "/subscriptions/********/resourceGroups/test-confluent-rg/providers/Microsoft.Network/networkSecurityGroups/test-confluent-nsg"
       },
       "provisioningState": "Succeeded"
     }
   },
   {
     "name": "test-qatesting-subnet-172-17-1-16-28",
     "properties": {
       "addressPrefix": "172.20.88.16/28",
       "networkSecurityGroup": {
         "id": "/subscriptions/********/resourceGroups/test-qatesting-rg/providers/Microsoft.Network/networkSecurityGroups/test-qatesting-nsg"
       },
       "provisioningState": "Succeeded"
     }
   }
 ]

但是我在搜索子网时遇到了问题。我曾认为以下的一些变化可能会起作用,但没有任何成功:

azure_virtualnetworks[?contains(name,`test2-vnet`)].properties.subnets[?contains(name,`test-confluent`) ]

我正在努力弄清楚这里的更正语法是什么。

【问题讨论】:

    标签: ansible jmespath


    【解决方案1】:

    选择所需的子网,使用pipe 表达式停止投影,从子网列表中过滤所需的项目:

    azure_virtualnetworks[?contains(name,`test2-vnet`)].properties.subnets[] | [?contains(name,`test-confluent`)]
    

    【讨论】:

    • 我实际上已经尝试过了,但使用的是 subnets 而不是 subnets[]。为了完整起见,我的最终查询是:azure_virtualnetworks[?contains(name,test2-vnet)].properties.subnets[] | [?contains(name,test-confluent)].name
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2016-12-17
    • 2019-07-14
    相关资源
    最近更新 更多