Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 在模板中渲染之前在Jinja2中转换YAML_Templates_Macros_Ansible_Yaml_Jinja2 - Fatal编程技术网

Templates 在模板中渲染之前在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" 我正试图找

我在YAML文档中有一个规范的项目列表,需要在不同的地方使用,以使用大量由宏支持的Jinja2模板以不同的方式呈现数据。我的输入YAML如下所示:

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传递到另一个模板中