我有一个这样的剧本:
- 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
过滤器的东西?