列表中使用变量+通配符的可靠筛选项


  1. 以下列表存储在变量results_one.msg
[
{
"IP": [
"192.168.1.100",
"192.168.1.101"
],
"Pool": "lan_pool_sftp",
"Members": [
"sftpnode01:5425",
"sftpnode02:5425"
]
},
{
"IP": [
"192.168.1.103",
"192.168.1.104"
],
"Pool": "icmp-net-pool",
"Members": [
"icmpnet01:8443",
"icmpnet02:8443"
]
}
]
  1. 我有另一个变量node_name

我想通过查询其中一个成员的名称,从上面的输出中获得PoolMembers信息。

例如,如果我分配变量node_name: icmpnet02我想将输出存储在各自的变量名中,如下所示。

pool_name: icmp-net-pool
pool_members: [ icmpnet01:8443,icmpnet02:8443 ]

我尝试了如下,但我无法获得

- set_fact: 
pool_name: "{{ item.Pool }}"
pool_members: "{{ item.Members }}"
with_items: "{{results_one.msg }}"
when: 'item.Members.0 is defined and "node_name:*" in item.Members'
  1. 创建仅包含成员名称的成员列表:
_members_hostnames: "{{ results_one.msg | map(attribute='Members') 
| map('map', 'regex_replace', '^(.*):.*$', '\1') }}"

提供:

"_members_hostnames": [
[
"sftpnode01",
"sftpnode02"
],
[
"icmpnet01",
"icmpnet02"
]
]
  1. 从相关变量中选择匹配条目,即。
    • 创建元组列表,将每个原始元素与其对应的计算成员主机名相关联
    • 仅保留列表中存在hostname的元素
    • 只保留元组的第一个元素(即原始条目(
    • 只保留列表中的第一个元素
_matching_entry: "{{ results_one.msg | zip(_members_hostnames) 
| selectattr(1, 'contains', node_name) | map(attribute=0) | first }}"

给出

"_matching_entry": {
"IP": [
"192.168.1.103",
"192.168.1.104"
],
"Members": [
"icmpnet01:8443",
"icmpnet02:8443"
],
"Pool": "icmp-net-pool"
}
  1. 使用匹配条目提取所需的任何变量:
pool_name: "{{ _matching_entry.Pool }}"
pool_members: "{{ _matching_entry.Members }}"

将所有这些放在一个测试剧本中:

---
- hosts: localhost
gather_facts: false
vars:
# Your orig data on a single line for legibility
results_one: {"msg":[{"IP":["192.168.1.100","192.168.1.101"],"Pool":"lan_pool_sftp","Members":["sftpnode01:5425","sftpnode02:5425"]},{"IP":["192.168.1.103","192.168.1.104"],"Pool":"icmp-net-pool","Members":["icmpnet01:8443","icmpnet02:8443"]}]}
node_name: icmpnet02
_members_hostnames: "{{ results_one.msg | map(attribute='Members') 
| map('map', 'regex_replace', '^(.*):.*$', '\1') }}"
_matching_entry: "{{ results_one.msg | zip(_members_hostnames) 
| selectattr(1, 'contains', node_name) | map(attribute=0) | first }}"
pool_name: "{{ _matching_entry.Pool }}"
pool_members: "{{ _matching_entry.Members }}"
tasks:
- debug:
msg:
- Pool name is {{ pool_name }}
- Pool members are {{ pool_members }}

哪个给出:

PLAY [localhost] ***********************************************************************************************************************************************************************************************************************
TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": [
"Pool name is icmp-net-pool",
"Pool members are ['icmpnet01:8443', 'icmpnet02:8443']"
]
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

最新更新