0

我有一个这样的剧本:

- 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这是在做它的事情,但它看起来非常难看,如果 a 中有一个内部也会破坏mapping。理想情况下,我想做这样的事情:

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

这适用于role,但由于它不是递归的dog,所以cat会中断。opts

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

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

因此,我的问题是:有什么方法可以内联一些 python 代码,或者是否有类似递归to_yaml过滤器的东西?

4

0 回答 0