ansible yaml 变量提取/过滤器保留“父”名称

时间:2021-06-30 17:47:13

标签: ansible jinja2 ansible-template

我有一个 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

期望输出:

  1. 名称:ccf_demo_segment1_group1 是 group1:未标记
  2. 名称:ccf_demo_segment1_group2 是 group2:未标记
  3. 名称:ccf_demo2_t2seg1_othergroup 是其他组:未标记

已编辑 ------------------

理想情况下,我想用结果定义一个新的 yaml 变量,例如喜欢

- debug:
    msg: "name: {{ item.tenant_name }}_{{ item.segment_name }}_{{ item.ifgroup_name }} is {{ item.?...ifgroup_name }}:{{ item.?...tag }}"
  loop: "{{ ??? | json_query('???') | ??? }}"

感谢任何帮助。

2 个答案:

答案 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
相关问题