在Ansible和<;中转义或区分jinja模板变量;服务>;。 历史:

在Ansible和<;中转义或区分jinja模板变量;服务>;。 历史:,ansible,jinja2,prometheus,ansible-template,Ansible,Jinja2,Prometheus,Ansible Template,在过去的几个月里,我们一直在使用Ansible来部署我们的服务和配置文件,并且我们一直在使用Ansible变量。 变量放在我们的(config_name).yml.j2文件中,这样我们就可以轻松地进行更改,而无需硬编码所有配置 例如,在Ansibles group_vars中,我们可能有: 公制端口变量:“9100” (config_name).yml.j2将包含一行: EXPOSE_METRIC_PORT={{{METRIC_PORT_var} 部署配置后,该框上的配置现在为: EXPOSE\

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

例如,在Ansibles group_vars中,我们可能有:

公制端口变量:“9100”

(config_name).yml.j2将包含一行:

EXPOSE_METRIC_PORT={{{METRIC_PORT_var}

部署配置后,该框上的配置现在为:

EXPOSE\u METRIC\u PORT=9100

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

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

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

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

AlertManager还在其自己的配置文件中使用jinja模板变量

alertmanager使用Go模板

参见Jinja文档的一节:

key={{ '{{' }}the_var{{ '}}' }}
将呈现为:

key={{the_var}}
布莱恩·巴西人是对的。(不出所料,谷歌搜索了他的名字)

我们在这里经常使用这种技术,在Ansible模板中有.j2.j2文件,这些文件在容器开始时解析为dockers中的.j2文件。
下面是一个更具体到您的用例的示例。 alertmanager确实使用Go模板,但我同意,当混合在jinja模板中时,乍一看可能会令人困惑

假设您有一个名为alertmanager.yml.j2的文件,其中以下几行是摘录

receivers:
- name: '{{ name_of_receiver_group }}'
  opsgenie_configs:
  - api_key: 123-123-123-123-123
    send_resolved: false
    {% raw %}
    # protecting the go templates inside the raw section.
    details: { details: "{{ .CommonAnnotations.SortedPairs.Values | join \" \" }}" }
    {% endraw %}
您将有一个类似这样的任务

- name: copy helper scripts
  template: src={{ item }}.j2 dest={{ container_dir }}/{{ item }} mode=0755
  with_items:
    - alertmanager.yml

这对我来说很好:

模板2.j2:

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

foo val
bar {{ other_var }}
zzz {{ another_var }}
可能重复的