如何在Ansible的set_fact调用中将sessions转换为sessions_flat?
Ansible实现嵌套字典扁平化生成sessions_flat
可以通过subelements过滤器结合set_fact循环拼接的方式实现,以下是具体的Playbook任务:
- name: 生成扁平化的sessions_flat列表 set_fact: sessions_flat: "{{ sessions_flat | default([]) + [{'oid': item.0.name ~ '-' ~ item.1.name, 'password': item.1.password, 'port': item.1.port}] }}" loop: "{{ sessions | subelements('vpns') }}"
实现说明:
subelements过滤器:将双层嵌套的sessions结构展开,把每个客户端条目和其下属的vpn条目配对,生成形如(客户端字典, VPN字典)的元组列表。- 循环构建条目:遍历每个元组,用
~运算符拼接客户端名称和VPN名称作为oid字段,同时保留VPN原有的password和port字段,生成目标格式的字典。 - 列表追加:通过
default([])初始化空列表,每次循环将新生成的字典追加到sessions_flat中,最终得到完整的扁平化列表。
备选方案(使用json_query):
如果偏好使用JMESPath查询,可以用以下方式实现:
- name: 用json_query实现扁平化 set_fact: sessions_flat: "{{ sessions | json_query('[].{client: name, vpns: vpns} | [] | [].vpns[] | [].{oid: join([client, name], \"-\"), password: password, port: port}') }}"
内容的提问来源于stack exchange,提问作者verideskstar
相关产品推荐
相关产品推荐

