我有一个 ansible yaml 变量:
tenants:
- tenant_name: ccf_demo
description: "ccf demo tenant"
state: present
segments:
- segment_name: segment1
state: present
ifgroups:
- ifgroup_name: group1
tag: untagged
- ifgroup_name: group2
tag: untagged
- tenant_name: ccf_demo2
description: "ccf demo2 tenant"
state: absent
segments:
- segment_name: t2seg1
state: present
ifgroups:
- ifgroup_name: othergroup
tag: untagged
- tenant_name: ccf_demo3
description: "ccf demo3 tenant"
state: present
现在我想提取/循环每个租户的所有段(如果有的话)的所有 ifgroups
,保留tenant
和 {{ 1}}。
最后,我想要一个循环体,使我能够编写如下内容:
segment
期望输出:
已编辑 ------------------
理想情况下,我想用结果定义一个新的 yaml 变量,例如喜欢
- debug:
msg: "name: {{ item.tenant_name }}_{{ item.segment_name }}_{{ item.ifgroup_name }} is {{ item.?...ifgroup_name }}:{{ item.?...tag }}"
loop: "{{ ??? | json_query('???') | ??? }}"
感谢任何帮助。
答案 0 :(得分:2)
与其使用 JMESPath 过滤列表,这最终不会消除您对结果列表进行循环的需要,更好的选择可能是使用带有嵌套循环的基本 Jinja 模板。
给定剧本:
print('result:', res)
这产生:
- hosts: localhost
gather_facts: no
tasks:
- debug:
msg: >-
{% for segment in item.segments %}
{%- for ifgroup in segment.ifgroups -%}
name: {{ item.tenant_name }}_{{ segment.segment_name }}_{{ ifgroup.ifgroup_name }} is {{ ifgroup.ifgroup_name }}:{{ ifgroup.tag }}
{% endfor %}
{% endfor %}
loop: "{{ tenants }}"
loop_control:
label: "{{ item.tenant_name }}"
when: item.segments is defined
vars:
tenants:
- tenant_name: ccf_demo
description: "ccf demo tenant"
state: present
segments:
- segment_name: segment1
state: present
ifgroups:
- ifgroup_name: group1
tag: untagged
- ifgroup_name: group2
tag: untagged
- tenant_name: ccf_demo2
description: "ccf demo2 tenant"
state: absent
segments:
- segment_name: t2seg1
state: present
ifgroups:
- ifgroup_name: othergroup
tag: untagged
- tenant_name: ccf_demo3
description: "ccf demo3 tenant"
state: present
答案 1 :(得分:0)
这就是我最终得到的结果:
---
- hosts: localhost
connection: local
gather_facts: no
tasks:
- name: include businessVars
include_vars: ./businessVars/busVars.yml
- name: "DEBUG3 -> write template variable to file"
template:
src: ifgroups.j2
dest: tmp/ifgroups.yml
mode: 0600
tags: DEBUG3
- name: extract interface data by jinja template
set_fact:
theIfGroups: "{{ lookup('template', 'ifgroups.j2') | from_yaml }}"
## theIfGroups:
## - tenant_name: ccf_demo
## segment_name: segment1
## ifgroup_name: group1
## tag: untagged
- name: final output
debug:
msg: "{{ item.tenant_name }}__{{ item.segment_name }}__{{ item.ifgroup_name }}: {{ item.ifgroup_name }}:{{ item.tag }}"
loop: "{{ theIfGroups }}"
./templates/ifgroups.j2
{% for tenant in tenants %}
{%- if tenant.segments is defined -%}{% for segment in tenant.segments %}
{%- if segment.ifgroups is defined -%}{%- for ifgroup in segment.ifgroups -%}
- tenant_name: {{ tenant.tenant_name }}
segment_name: {{ segment.segment_name }}
ifgroup_name: {{ ifgroup.ifgroup_name }}
tag: {{ ifgroup.tag }}
{% endfor %}{% endif %}
{% endfor %}{% endif %}
{% endfor %}
./businessVars/busVars.yml
tenants:
- tenant_name: ccf_demo
description: "ccf demo tenant"
state: present
segments:
- segment_name: segment1
state: present
ifgroups:
- ifgroup_name: group1
tag: untagged
- ifgroup_name: group2
tag: untagged
- tenant_name: ccf_demo2
description: "ccf demo2 tenant"
state: absent
segments:
- segment_name: t2seg1
state: present
ifgroups:
- ifgroup_name: group3
tag: untagged
- tenant_name: ccf_demo3
description: "ccf demo3 tenant"
state: absent
segments:
- segment_name: t3seg1
state: present
- tenant_name: ccf_demo3
description: "ccf demo3 tenant"
state: present