Templates 在模板中渲染之前在Jinja2中转换YAML
我在YAML文档中有一个规范的项目列表,需要在不同的地方使用,以使用大量由宏支持的Jinja2模板以不同的方式呈现数据。我的输入YAML如下所示:Templates 在模板中渲染之前在Jinja2中转换YAML,templates,macros,ansible,yaml,jinja2,Templates,Macros,Ansible,Yaml,Jinja2,我在YAML文档中有一个规范的项目列表,需要在不同的地方使用,以使用大量由宏支持的Jinja2模板以不同的方式呈现数据。我的输入YAML如下所示: depots: - name: "Manchester" cost_code: "H" - name: "Liverpool" - name: "Bristol" - name: "Hull" - name: "Glasgow" cost_code: "M" - name: "Edinburgh" 我正试图找
depots:
- name: "Manchester"
cost_code: "H"
- name: "Liverpool"
- name: "Bristol"
- name: "Hull"
- name: "Glasgow"
cost_code: "M"
- name: "Edinburgh"
我正试图找到一种转换的方法,以便输出是一个修饰过的YAML,它适用于一些Jinja2宏。我需要一个类似于以下的列表,该列表仅基于来自的name
属性:
- name: "Depot"
attrs:
- name: "name"
value: "Manchester"
- name: "Depot"
attrs:
- name: "name"
value: "Liverpool"
...
请注意,这不是模板的文本输出,而是我要传递到模板中的转换YAML。很难使用模板并将其作为文本输出,因为输出YAML需要合并到更大的YAML文档中,并将由模板宏整体转换
似乎Python中可用的列表理解和其他整洁的工具在Jinja2中是故意不可用的,所以我想知道,有没有其他方法来执行这种初步转换?插件可能会起作用,尽管我正在抵制诱惑,直到我完全确信没有更好/更简单的方法。我不确定它是否真的能帮助您,但您可以就地转换源yaml(在jinja2模板中)然后将宏中的转换结果与
宏
/调用
语句组合使用。请参见示例:
{% macro ConvertYaml(rootName, yaml) %}
{% set result = [] %}
{% for dict in yaml %}
{% set attrs=[] %}
{% for k in dict | list %}
{% set v = dict[k] %}
{% do attrs.append({'name': k, 'value': v}) %}
{% endfor %}
{% do result.append({'name': rootName, 'attrs': attrs}) %}
{% endfor %}
{{ caller(result) }}
{% endmacro %}
{% call(result) ConvertYaml("Depot", depots) %}
{{ result | pprint }}
{% endcall %}
depots
var这是源yaml字典convertyml
macro将此字典转换为适当的形式(如第二个示例所示),然后将其传递给调用者。调用者接受结果作为准备(转换)的字典,而不是文本。因此,您可以使用它进行任何进一步的转换,传递到其他宏等
注意:
do
应该为Jinja2环境启用扩展以处理此代码。如果我理解正确,应该使用模板
查找插件。您可以将输出设置为var或set\u fact
host fact,然后将该var传递到另一个模板中