摘要
我有一个Jinja2模板,我正在使用Ansible运行它。
我希望我的模板加载另一个文件,作为模板(即评估{{ var }}
),然后过滤,然后将结果粘贴到顶层模板。
我想我快到了,我只需要找到一个Jinja2过滤器,它接受一个字符串并将其解析为一个模板。
米维
在这个例子中,让我们假设我要应用的过滤器只是为了使文件大写。(很明显,这个例子非常简单,我可以在一个模板文件中完成。但我真正的用例更复杂。)
顶层模板main.yaml.j2
---
something:
blah:
x: {{ y }}
{%- set names = [ 'John', 'Amy' ] %}
z: >
{{ lookup('file', './other-file.j2') | upper | indent(4*2) }}
other-file.j2
{%- for name in names %}
Hello {{ name }}
{%- endfor %}
用这个可操作的剧本运行它:
---
- hosts: localhost
connection: local
tasks:
- name: generate template
template:
src: "main.yaml.j2"
dest: "output.yaml.j2"
trim_blocks: False
register: templating
vars:
y: 5
期望输出
---
something:
blah:
x: 5
z: >
HELLO JOHN
HELLO AMY
实际输出
---
something:
blah:
x: 5
z: >
{%- FOR NAME IN NAMES %}
HELLO {{ NAME }}
{%- ENDFOR %}
最佳猜测
我想我快到了。我只需要一个过滤器,它将Jinja2模板应用于文本。
例如:
{{ lookup('file', './other-file.j2') | template | upper | indent(4*2) }}
(但template
并不是真正的过滤器。也许还有别的名字?)
我还试过什么
{{ include './other-file.j2' | upper | indent(4*2) }}
不起作用。
致命: 127.0.0.1:失败!=> {“已更改”:false,"msg":"AnsibleError:模板错误,而模板字符串:预期的令牌‘结束打印语句’,得到'string'.字符串:
---\nsomething:\n blah:\n x: {{ y }}\n {%- set names = [ 'John', 'Amy' ] %}\n z: >\n {{ include './other-file.j2' | upper | indent(4*2) }}"}
{% include './other-file.j2' | upper | indent(4*2) %}
TemplateNotFound://其他-FILE.J2“
不起作用。
用例
对于上下文,我的用例是我有一个Jinja2模板生成AWS CloudFormation模板。我试着用YAML而不是JSON来做这一切。(因为YAML可以有注释,而且您不必担心列表中的最后一项是否带有后缀逗号,而且通常更容易读、写和调试。)一些CloudFormation资源需要粘贴到YAML文件中的文本JSON。(如CloudWatch仪表板体)。因此,我希望在YAML中有另一个文件,Jinja2将其转换为json,并将其粘贴到我的整体YAML模板中。我希望使用for循环生成这个仪表板,并传入变量。我想要一个单独的
发布于 2020-02-28 03:32:00
而不是file
插件
lookup('file', './other-file.j2')
使用template
插件
lookup('template', './other-file.j2')
注意,变量{% set names = ['John', 'Amy'] %}
的作用域是模板main.yaml.j2。如果在模板other-file.j2
中使用此变量,则命令lookup('template', './other-file.j2')
将与错误崩溃:
"AnsibleUndefinedVariable:‘名称’是未定义的“
溶液
在剧本的范围内声明变量。例如
- template:
src: "main.j2"
dest: "output.txt"
vars:
names: ['John', 'Amy']
main.j2
{{ lookup('template', './other-file.j2') }}
other-file.j2
{% for name in names %}
Hello {{ name }}
{% endfor %}
给
shell> cat output.txt
Hello John
Hello Amy
https://stackoverflow.com/questions/60443820
复制相似问题