ansible - 在 Ansible 和 <service> 中转义或区分 jinja 模板变量。

标签 ansible jinja2 prometheus ansible-template

历史:

在过去的几个月里,我们一直在使用 Ansible 来部署我们的服务和配置文件,并且我们一直在使用 Ansible 变量。
变量被放置在我们的 (config_name).yml.j2 文件中,这使我们能够轻松地进行更改,而无需对所有配置进行硬编码。

例如在 Ansibles group_vars 中,我们可能有:
metric_port_var: "9100"
并且 (config_name).yml.j2 将包含一行:
EXPOSE_METRIC_PORT={{ metric_port_var}}
部署配置后,盒子上的配置现在是:
EXPOSE_METRIC_PORT=9100
问题:

现在我们正在为 AlertManager/Prometheus 部署配置。
出现的问题是 AlertManager 也在我们尝试部署的自己的配置文件中使用 jinja 模板变量。这些其他 jinja 模板将来自盒子上的其他配置文件。

这意味着我们的 (config_name).yml.j2 理论上将包含大括号变量的混合,其中一些可能属于 Ansible,而另一些则属于另一个文件。

我们不能再使用 Ansible 的"template"模块来部署我们的配置,因为在 group_vars 中找不到变量时会引发错误,因为特定的变量应该来自 AlertManager。

我们需要一种混合 jinja 模板或转义一些花括号而不是其他花括号的方法。现在我们回到硬编码我们的配置并让 AlertManager 使用所有变量。

最佳答案

这对我来说很好:

模板.j2:

foo {{ ansible_var }}
bar {{ '{{' }} other_var {{ '}}' }}
zzz {%raw%}{{ another_var }}{%endraw%}

输出:
foo val
bar {{ other_var }}
zzz {{ another_var }}

关于ansible - 在 Ansible 和 <service> 中转义或区分 jinja 模板变量。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44799543/

相关文章:

docker - 使用cAdvisor监视Docker容器

git - Vagrant shell 和 ansible 配置因 bitbucket 失败

docker - Ansible 可以远程部署 Docker 容器吗?

ansible - 如何禁用特定 ansible 命令的 json 输出?

javascript - 可见光JS : Cant make network fit bootstrap panel

prometheus - Prometheus 中的远程读取是什么意思?

linux - 无法导入 docker 或 docker-py - 没有名为 docker 的模块

python - Jinja 模板将变量解析为文字字符串

jinja2 - 如何从包含的文件中获取 jinja2 变量

java - 如何在 Java 中配置 OpenTracing Tracer 将数据推送到 Prometheus/Grafana