如何在 Python/Ansible 中用模式 {{ '{{' }} / {{ '}}' }} 替换左大括号和右大括号 {{ }}

问题描述 投票:0回答:2
我们使用 Ansible 来模板化以 JSON 文件导出的 grafana 仪表板。仪表板 JSON 可能在 Json 内的许多地方具有仪表板变量引用,例如 {{ Region }}、{{ state }} 等。运行模板代码时,我们得到未为“region”、“state”变量定义的变量。我们希望 ansible 忽略这些变量并按原样与大括号一起打印。我们遇到了两种解决方案

    使用{% raw %} {% endraw %}
  1. 在 json 中将 {{ 替换为 {{ '{{' }} 并将 }} 替换为 {{ '}}' }}
我们尝试了#1,但没有成功。我们的 jinja2 模板如下所示

{ "dashboard": {{ item.json | indent(width=2) | trim }} ,{{ "\n" }} {%- if 'folder_uid' in item %} "folderUid": "{{ item.folder_uid }}",{{ "\n" }} {%- endif %} "overwrite": true }
上面的 item.json 变量包含仪表板 json 数据

我们尝试了以下所有方法

    {% raw %} {{ item.json |缩进(宽度=2)|修剪 }} {% endraw %}
  • “{% raw %} {{ item.json | 缩进(宽度=2) | 修剪 }} {% endraw %}”
  • {% raw %} '{{ item.json |缩进(宽度=2)|修剪 }}' {% endraw %}
  • {% raw %} "{{ item.json | 缩进(宽度=2) | 修剪 }}" {% endraw %}
没有任何效果。 ansible 仍然尝试模板化 json 内容

所以,我们正在尝试#2。谁能帮助我们如何用 {{ '{{' }} 替换 {{ 并用 {{ '}}' }} 模式替换 }} ?问题是我们无法进行简单的文本替换,因为替换 {{ 也会引入 }}。

python ansible jinja2
2个回答
1
投票
我认为您可以通过在 Ansible 模板中包含 JSON 属性来避免扩展花括号。例如,给定

“以 JSON 文件导出的 grafana 仪表板”

shell> cat test-152.json { "dashboard": "region {{ region }} state {{ state }}" }
将 JSON 数据包含在字典中,例如

- set_fact: content: "{{ lookup('file', 'test-152.json') }}"
创建字典

内容

content: dashboard: region {{ region }} state {{ state }}
接下来创建一个Ansible模板并引用其属性

“仪表板 JSON(该)可能具有仪表板变量引用,例如 {{region }}、{{state }})”

shell> cat test-152.txt.j2 # Grafana dashboard created by Ansible # Created {{ '%Y-%m-%d' | strftime }} {{ content.dashboard }}
Ansible 任务

- template: src: test-152.txt.j2 dest: test-152.txt
创建文件

shell> cat test-152.txt # Grafana dashboard created by Ansible # Created 2021-08-05 region {{ region }} state {{ state }}
使模板适合您的需求。


0
投票
Ansible

模板模块 包括 variable_end_string

variable_start_string
 参数,可能会帮助您解决此问题。例如,您可以将 
{{
}}
 替换为 
{{{{
}}}}

© www.soinside.com 2019 - 2024. All rights reserved.