【问题标题】:Exclude json object in list that does not contain a vale排除列表中不包含值的 json 对象
【发布时间】:2020-02-06 02:34:50
【问题描述】:

如何删除不包含特定值的 json 对象?在下面的json中你如何保持 包含“11.22.33.0/24”的对象块?

如何使用 jinja 或 Ansible 过滤来实现这一点?

json 内容

my_data:
  description: "for load balancer access"
  group_is: "sg-1234"
  group_name: "MY GroupName"
  ip_permissions:
    - from: 80
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 80
    - from: null
      ip_protocol: "-1"
      ip_ranges:
        - cidr_ip: "11.22.33.0/24"
          description: "MY site"
      to_port: null
    - from: 22
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 22
    - from: 3306
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 3306
    - from: 3000
      ip_protocol: "tcp"
      ip_ranges:
        - cidr_ip: "11.22.33.0/24"
          description: "MY site"
      to_port: 3000
    - from: 443
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 443

【问题讨论】:

  • 用文字替换图片。剪切和粘贴将使测试更容易。
  • 因为我输入文本的原因。Stackoverflow 用太多代码标记了它
  • 这很奇怪。我能够输入数据。

标签: json ansible jinja2 json-query


【解决方案1】:

问:“如何保留包含“11.22.33.0/24”的对象块?”

A:给定变量my_data中的JSON内容,使用json_query创建对象列表块my_ip_permissionscombine结果。例如,下面的任务完成了这项工作

   - set_fact:
        my_ip_permissions: "{{ my_data.ip_permissions|json_query(my_query) }}"
      vars:
        my_query: "[?ip_ranges[?cidr_ip == '11.22.33.0/24']]"
    - set_fact:
        my_data: "{{ my_data|combine({'ip_permissions': my_ip_permissions}) }}"


使用变量 my_data
my_data:
  description: "for load balancer access"
  group_is: "sg-1234"
  group_name: "MY GroupName"
  ip_permissions:
    - from: 80
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 80
    - from: null
      ip_protocol: "-1"
      ip_ranges:
        - cidr_ip: "11.22.33.0/24"
          description: "MY site"
      to_port: null
    - from: 22
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 22
    - from: 3306
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 3306
    - from: 3000
      ip_protocol: "tcp"
      ip_ranges:
        - cidr_ip: "11.22.33.0/24"
          description: "MY site"
      to_port: 3000
    - from: 443
      ip_protocol: "tcp"
      ip_ranges: []
      to_port: 443

输出是

    "my_data": {
        "description": "for load balancer access", 
        "group_is": "sg-1234", 
        "group_name": "MY GroupName", 
        "ip_permissions": [
            {
                "from": null, 
                "ip_protocol": "-1", 
                "ip_ranges": [
                    {
                        "cidr_ip": "11.22.33.0/24", 
                        "description": "MY site"
                    }
                ], 
                "to_port": null
            }, 
            {
                "from": 3000, 
                "ip_protocol": "tcp", 
                "ip_ranges": [
                    {
                        "cidr_ip": "11.22.33.0/24", 
                        "description": "MY site"
                    }
                ], 
                "to_port": 3000
            }
        ]
    }

【讨论】:

  • 我得到这个输出 code:{ "description": "for load balancer access", "group_id": "sg-12345", "group_name": "my-LoadBalancer", "ip_permissions": "" }code 如何添加 from_port、ip_protocol 和 to_port?
  • 我不知道。我已经输入了您的数据,结果符合要求。
  • 我将我的 Ansible 更新到了当前版本。谢谢! @弗拉基米尔·博克塔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2015-01-16
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多