jinja2 模板文件中的递归 Ansible 过滤器

问题描述

我有一个这样的剧本:

- name: Testing
  hosts: localhost
  gather_facts: False
  tasks:
    - name: Set things
      set_fact:
        my_things:
          - parameters:
              dog: true
              opts:
                DO_THIS: true
                DO_THAT: "false"
              role: Samba
            action: dance
          - parameters:
              cat: true
              opts:
                DO_THIS: no
                DO_THAT: "yes"
              role: Funk
            action: dance

我想用 jinja2 模板编写,如下所示:

apiVersion: v1
kind: ConfigMap
Metadata:
  name: "test"
data:
  myfile.yml: |+
    ---
    dancers:
    {% for thing in my_things %}
      - {{ thing.action }}:
      {% for key,value in thing.parameters.items() %}
        {% if value is string and not (value) %}
          {{ key }}: "{{ value }}"
        {% elif value is mapping %}
          {{ key }}:
            {{ value | to_nice_yaml | indent(12) -}}
        {% elif value | bool %}
          {{ key }}: {{ (value) }}
        {% elif not value | bool %}
          {{ key }}: {{ (value) }}
        {% else %}
          {{ key }}: {{ value | to_yaml }}
        {% endif %}
      {% endfor %}
    {% endfor %}

这是在做它的事情,但它看起来非常丑陋,如果 mapping 中有 mapping,它也会损坏。理想情况下,我想做这样的事情:

apiVersion: v1
kind: ConfigMap
Metadata:
  name: "test"
data:
  myfile.yml: |+
    ---
    dancers:
    {% for thing in my_things %}
      - {{ thing.action }}:
      {% thing.parameters | to_yaml %}

这适用于 roledogcat,但对 opts 无效,因为它不是递归的。

由于我使用 operator-sdk 和 lookup 过滤器部署此配置映射,因此我无法使用 jinja 的 env 编写自定义过滤器。

- name: 'Creating v1.ConfigMap'
  community.kubernetes.k8s:
    deFinition: "{{ lookup('template','my_template.yml.j2') }}"

因此,我的问题是:有没有办法内联一些 Python 代码,或者有没有类似递归 to_yaml 过滤器的东西?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)