首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不可接受的yaml变量提取/筛选器保留“父”名称

不可接受的yaml变量提取/筛选器保留“父”名称
EN

Stack Overflow用户
提问于 2021-06-30 17:47:13
回答 2查看 91关注 0票数 1

我有一个ansible yaml变量:

代码语言:javascript
复制
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,保留tenantsegment的名称。

最后,我希望有一个循环体,使我能够编写如下内容:

代码语言:javascript
复制
- debug:
    msg: "name: {{ item.tenant_name }}_{{ item.segment_name }}_{{ item.ifgroup_name }} is {{ item.?...ifgroup_name }}:{{ item.?...tag }}"
  loop: "{{ ??? | json_query('???') | ??? }}"

期望产出:

group1:untagged

  • name:
  1. 名称: ccf_demo_segment1_group1 is ccf_demo_segment1_group2 is ccf_demo2_t2seg1_othergroup is othergroup:untagged

编辑?

理想情况下,我想定义一个新的yaml变量,其结果如下

代码语言:javascript
复制
resultVar:
  - tenant_name: ccf_demo
    segment_name: segment1
    ifgroup_name: group1
    tag: untagged
  - tenant_name: ccf_demo
    segment_name: segment1
    ifgroup_name: group2
    tag: untagged
  - tenant_name: ccf_demo2
    segment_name: t2seg1
    ifgroup_name: othergroup
    tag: untagged

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-30 21:11:51

与使用JMESPath过滤列表不同,最终不会消除对结果列表的循环需要,更好的选择可能是使用带有嵌套循环的基本Jinja模板。

考虑到剧本:

代码语言:javascript
复制
- 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

这产生了:

代码语言:javascript
复制
ok: [localhost] => (item=ccf_demo) => 
  msg: |-
    name: ccf_demo_segment1_group1 is group1:untagged
    name: ccf_demo_segment1_group2 is group2:untagged
ok: [localhost] => (item=ccf_demo2) => 
  msg: |-
    name: ccf_demo2_t2seg1_othergroup is othergroup:untagged
skipping: [localhost] => (item=ccf_demo3) 
票数 2
EN

Stack Overflow用户

发布于 2021-07-01 14:18:07

这就是我最后的结局:

代码语言:javascript
复制
---

- 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

代码语言:javascript
复制
{% 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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68199432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档