使用Ansible创建dict筛选不同值的列表

使用Ansible创建dict筛选不同值的列表,ansible,jinja2,jmespath,Ansible,Jinja2,Jmespath,我正在寻找一个更好的解决方案,通过键a过滤dict列表,并返回键B的值列表。更具体地说,每个主机都有一个dict: infrastructure: name: "x..." network: address: "1..." 有主机,其中定义了网络.地址,还有主机,其中未定义网络.地址。我现在需要一个所有基础设施的列表。名称和定义的网络地址 - name: "Define Alias fact" set_fact:

我正在寻找一个更好的解决方案,通过键a过滤dict列表,并返回键B的值列表。更具体地说,每个主机都有一个dict:

infrastructure:
  name: "x..."
network:
  address: "1..."
有主机,其中定义了
网络.地址
,还有主机,其中未定义
网络.地址
。我现在需要一个所有
基础设施的列表。名称
和定义的
网络地址

- name: "Define Alias fact"
  set_fact:
    alias: []

- name: "Add Aliases for all hosts with network.address is defined"
  set_fact:
    alias: "{{ alias + [hostvars[host].infrastructure.name + '-alias'] }}"
  when:
    - "hostvars[host].network is defined"
    - "hostvars[host].network.address is defined"
  with_items: "{{ groups['all'] }}"
  loop_control:
    loop_var: host
这是可行的,但有点混乱,因为我多次调用set_fact并将项添加到列表中

当我看到:

- name: "Define addresses fact"
  set_fact:
    address: "{{ groups['all'] | map('extract', hostvars) | list | json_query('[*].network.address') }}"
这要短得多,也许更容易


我想问一下,我是否可以使用
map
extract
以及“目录列表”,然后将列表展平以“过滤”未定义network.address的所有项目,并使用json_查询和一些字符串操作来附加“-alias”。有没有类似的简单方法来替换第一个脚本?

在给定JSON的情况下,使用纯JMESPath方式

[
  {
    "infrastructure": {"name": "x..."},
    "network": {"address": "1..."}
  },
  {
    "infrastructure": {"name": "y..."}
  },
  {
    "infrastructure": {"name": "z..."},
    "network": {"address": "2..."}
  },
  {
    "infrastructure": {"name": "a..."},
    "network": {}
  }
]
您可以提取与
-alias
连接的
基础结构。名称
具有
网络。地址
设置如下:

[?network.address].join('-',[infrastructure.name',alias'])
这将产生:

[
“x…-别名”,
“z…-别名”
]
该函数主要用于将数组元素粘合在一起,但也可用于连接字符串


因此,对于一本演示这一点的剧本:

-主机:所有
收集事实:不
任务:
-调试:
味精:>-
{{ 
服务器|到|从| json |
json_查询(
“[?network.address].join(`-`,[infrastructure.name,`alias`])”
) 
}}
变量:
服务器:
-基础设施:
姓名:x。。。
网络:
地址:1。。。
-基础设施:
姓名:y。。。
-基础设施:
姓名:z。。。
网络:
地址:2。。。
-基础设施:
姓名:a。。。
网络:
注意,解释了从_json到_json的奇数构造

这将产生:

播放[全部]********************************************************************************************************
任务[调试]******************************************************************************************************
确定:[本地主机]=>{
“味精”:[
“x…-别名”,
“z…-别名”
]
}
重演********************************************************************************************************
localhost:ok=1已更改=0无法访问=0失败=0跳过=0已获救=0已忽略=0

在我的例子中,“服务器”dict是hostvars的一部分,看起来,我不需要通过
|到| json |从| json
进行过滤,但它可以按预期工作。啊,是的,这确实是YAML/Ansible数据的一个问题,如果您从以前的任务/主机中得到了这一事实,那么您应该没有它