我的数据结构如下例所示。
我的目标是获取属于组 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"
}
]
如何实现?
答案 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 }}