如何 select 列表中的值
how to select values from lists
我定义了 6 个主机,这些主机有多个 IPv4。我需要这些 IP 列表中的 IPv4 子集。
我就是这样运行
- hosts: gluster_mariadb
gather_facts: true
tasks:
- set_fact:
main_nodes_ips: "{{ groups.zicluster |
map('extract', hostvars, 'ansible_all_ipv4_addresses') |
list }}"
run_once: true
- debug:
var: main_nodes_ips
run_once: true
响应是:
ok: [zi04] => {
"main_nodes_ips": "[ ['172.18.0.1', '192.168.17.209', '172.17.0.1', '169.254.135.46', '169.254.74.141'], ['172.18.0.1', '192.168.17.208', '169.254.118.121', '169.254.53.186', '172.17.0.1'], ['172.18.0.1', '192.168.17.196', '172.17.0.1', '169.254.211.146', '169.254.1.199'], ['172.18.0.1', '192.168.17.159', '169.254.234.110', '169.254.150.56', '172.17.0.1'], ['172.18.0.1', '192.168.17.160', '172.17.0.1', '169.254.113.116', '169.254.97.143'], ['172.18.0.1', '192.168.17.161', '172.17.0.1', '169.254.240.6', '169.254.74.189']]"
}
我试着用这个做子选择:
- debug:
var:
main_nodes_ips | select('match', '^192') | list
这个returns没有数据,我想是因为它是一个列表列表。
所以我尝试更早地进行子选择。像这样:
- hosts: gluster_mariadb
gather_facts: true
tasks:
- set_fact:
main_nodes_ips: "{{ groups.zicluster |
map('extract', hostvars, 'ansible_all_ipv4_addresses') |
select('match', '^192') |
list }}"
run_once: true
- debug:
var: main_nodes_ips
run_once: true
这也returns没有数据。
ok: [zi04] => {
"main_nodes_ips": []
}
我要找的是这样的:
ok: [zi04] => {
"main_nodes_ips":
[
"192.168.17.100",
"192.168.17.101",
"192.168.17.102",
"192.168.17.103",
"192.168.17.104",
"192.168.17.105"
]
}
变量main_nodes_ips是一个列表的列表
main_nodes_ips:
- - 172.18.0.1
- 192.168.17.209
- 172.17.0.1
- 169.254.135.46
- 169.254.74.141
- - 172.18.0.1
- 192.168.17.208
- 169.254.118.121
- 169.254.53.186
- 172.17.0.1
- - 172.18.0.1
- 192.168.17.196
- 172.17.0.1
- 169.254.211.146
- 169.254.1.199
- - 172.18.0.1
- 192.168.17.159
- 169.254.234.110
- 169.254.150.56
- 172.17.0.1
- - 172.18.0.1
- 192.168.17.160
- 172.17.0.1
- 169.254.113.116
- 169.254.97.143
- - 172.18.0.1
- 192.168.17.161
- 172.17.0.1
- 169.254.240.6
- 169.254.74.189
您不能直接使用过滤器 select。您必须映射过滤器select到每个项目
main_nodes_192: "{{ main_nodes_ips|
map('select', 'match', '^192.*$')|
flatten }}"
给予
main_nodes_192:
- 192.168.17.209
- 192.168.17.208
- 192.168.17.196
- 192.168.17.159
- 192.168.17.160
- 192.168.17.161
我定义了 6 个主机,这些主机有多个 IPv4。我需要这些 IP 列表中的 IPv4 子集。
我就是这样运行
- hosts: gluster_mariadb
gather_facts: true
tasks:
- set_fact:
main_nodes_ips: "{{ groups.zicluster |
map('extract', hostvars, 'ansible_all_ipv4_addresses') |
list }}"
run_once: true
- debug:
var: main_nodes_ips
run_once: true
响应是:
ok: [zi04] => {
"main_nodes_ips": "[ ['172.18.0.1', '192.168.17.209', '172.17.0.1', '169.254.135.46', '169.254.74.141'], ['172.18.0.1', '192.168.17.208', '169.254.118.121', '169.254.53.186', '172.17.0.1'], ['172.18.0.1', '192.168.17.196', '172.17.0.1', '169.254.211.146', '169.254.1.199'], ['172.18.0.1', '192.168.17.159', '169.254.234.110', '169.254.150.56', '172.17.0.1'], ['172.18.0.1', '192.168.17.160', '172.17.0.1', '169.254.113.116', '169.254.97.143'], ['172.18.0.1', '192.168.17.161', '172.17.0.1', '169.254.240.6', '169.254.74.189']]"
}
我试着用这个做子选择:
- debug:
var:
main_nodes_ips | select('match', '^192') | list
这个returns没有数据,我想是因为它是一个列表列表。 所以我尝试更早地进行子选择。像这样:
- hosts: gluster_mariadb
gather_facts: true
tasks:
- set_fact:
main_nodes_ips: "{{ groups.zicluster |
map('extract', hostvars, 'ansible_all_ipv4_addresses') |
select('match', '^192') |
list }}"
run_once: true
- debug:
var: main_nodes_ips
run_once: true
这也returns没有数据。
ok: [zi04] => {
"main_nodes_ips": []
}
我要找的是这样的:
ok: [zi04] => {
"main_nodes_ips":
[
"192.168.17.100",
"192.168.17.101",
"192.168.17.102",
"192.168.17.103",
"192.168.17.104",
"192.168.17.105"
]
}
变量main_nodes_ips是一个列表的列表
main_nodes_ips:
- - 172.18.0.1
- 192.168.17.209
- 172.17.0.1
- 169.254.135.46
- 169.254.74.141
- - 172.18.0.1
- 192.168.17.208
- 169.254.118.121
- 169.254.53.186
- 172.17.0.1
- - 172.18.0.1
- 192.168.17.196
- 172.17.0.1
- 169.254.211.146
- 169.254.1.199
- - 172.18.0.1
- 192.168.17.159
- 169.254.234.110
- 169.254.150.56
- 172.17.0.1
- - 172.18.0.1
- 192.168.17.160
- 172.17.0.1
- 169.254.113.116
- 169.254.97.143
- - 172.18.0.1
- 192.168.17.161
- 172.17.0.1
- 169.254.240.6
- 169.254.74.189
您不能直接使用过滤器 select。您必须映射过滤器select到每个项目
main_nodes_192: "{{ main_nodes_ips|
map('select', 'match', '^192.*$')|
flatten }}"
给予
main_nodes_192:
- 192.168.17.209
- 192.168.17.208
- 192.168.17.196
- 192.168.17.159
- 192.168.17.160
- 192.168.17.161