Ansible - 从列表中删除具有特定键值的字典

时间:2021-01-14 14:10:13

标签: ansible jinja2

我的数据结构如下例所示。

我的目标是获取属于组 group_1 的用户列表。这就是我能做的(如示例中所示)。
但另外,我想去掉 group_2 中的 User_1。而我做不到。

下面是 ansible playbook 及其结果:

- hosts: localhost

  vars:
    search_name: "group_1"
    users:
      - user_name: "User_1" 
        email: "user1@mail.com" 
        login: "user.1"
        groups:
          - name: group_1
            servers:
              - server: 
                  name: 'SERVER-01'
                  ip: '192.168.x.x'
                  port: 5656
              - server: 
                  name: 'SERVER-02'
                  ip: '192.168.x.x'
                  port: 5656
          - name: group_2
            servers:
              - server: 
                  name: 'SERVER-03'
                  ip: '192.168.x.x'
                  port: 5656
              - server:   
                  name: 'SERVER-01'
                  ip: '192.168.x.x'
                  port: 5656
              - server:   
                  name: 'SERVER-02'
                  ip: '192.168.x.x'
                  port: 5656
      - user_name: "User_2" 
        email: "user2@mail.com" 
        login: "user.2"
        groups:
          - name: group_1
            servers:
              - server: 
                  name: 'SERVER-01'
                  ip: '192.168.x.x'
                  port: 5656
              - server:   
                  name: 'SERVER-02'
                  ip: '192.168.x.x'
                  port: 5656
      - user_name: "User_3" 
        email: "user3@mail.com" 
        login: "user.3"
        groups:
          - name: group_3
            servers:
              - server: 
                  name: 'SERVER-03'
                  ip: '192.168.x.x'
                  port: 5656
  
  tasks:
    - name: Initialize an empty list for servers
      set_fact:
        filtered_users: []

    - name: Filter users by group name
      set_fact:
        filtered_users: "{{ users | json_query(query) }}"
      vars:
        query: "[? groups[? name==`group_1`]] | []"        

    - name: Display users
      debug:
        msg: "{{ filtered_users }}"

结果

        {
            "email": "user1@mail.com", 
            "groups": [
                {
                    "name": "group_1", 
                    "servers": [
                        {
                            "server": {
                                "ip": "192.168.x.x", 
                                "name": "SERVER-01", 
                                "port": 5656
                            }
                        }, 
                        {
                            "server": {
                                "ip": "192.168.x.x", 
                                "name": "SERVER-02", 
                                "port": 5656
                            }
                        }
                    ]
                }, 
                {
                    "name": "group_2", 
                    "servers": [
                        {
                            "server": {
                                "ip": "192.168.x.x", 
                                "name": "SERVER-03", 
                                "port": 5656
                            }
                        }, 
                        {
                            "server": {
                                "ip": "192.168.x.x", 
                                "name": "SERVER-01", 
                                "port": 5656
                            }
                        }, 
                        {
                            "server": {
                                "ip": "192.168.x.x", 
                                "name": "SERVER-02", 
                                "port": 5656
                            }
                        }
                    ]
                }
            ], 
            "login": "user.1", 
            "user_name": "User_1"
        }, 
        {
            "email": "user2@mail.com", 
            "groups": [
                {
                    "name": "group_1", 
                    "servers": [
                        {
                            "server": {
                                "ip": "192.168.x.x", 
                                "name": "SERVER-01", 
                                "port": 5656
                            }
                        }, 
                        {
                            "server": {
                                "ip": "192.168.x.x", 
                                "name": "SERVER-02", 
                                "port": 5656
                            }
                        }
                    ]
                }
            ], 
            "login": "user.2", 
            "user_name": "User_2"
        }
    ]

如何实现?

1 个答案:

答案 0 :(得分:1)

JMESPath 适用于简单的问题,但很难解决复杂的问题,尤其是因为您的最终问题涉及选择性地构建一个新的“用户”字典(或改变 var,很难判断您的结果是什么) d 想要)。如果您希望原始数据发生变异,只需删除克隆用户字典的 | combine({})

    - name: Filter users by group name
      set_fact:
        filtered_users: >-
          {%- set results = [] -%}
          {%- for ur in users -%}
          {%-  set u = ur | combine({}) -%}
          {%-  set g1 = u.groups | selectattr("name", "eq", search_name) -%}
          {%-  if g1 | length > 0 -%}
          {%-    set _ = u.update({"groups": g1}) -%}
          {%-    set _ = results.append(u) -%}
          {%-   endif -%}
          {%- endfor -%}
          {{ results }}