如何对 Helm 进行模板化以从其他应用程序插入模板语言?

How to template Helm to insert templating language from other application?

我有一个 configMap,其中包含一条警报,如下所示:

alert_output:
  outputs:
    - type: webhook
      enabled: true
      template: |
          {{- if ne (print .PolicyType) "Heartbeat" -}}
          {"text": "New Alert\n Type: {{.PolicyType}}\n Details: {{.Description}}"
          {{- end -}}

我如何在 Helm 中对此进行模板化,以便 outputs.template 内的 text 可以通过这样的值文件进行自定义?

alert_output:
  outputs:
    - type: webhook
      enabled: true
      template: |
          {{- if ne (print .PolicyType) "Heartbeat" -}}
          {"text": {{ .Values.custom_alert_text }}
          {{- end -}}
custom_alert_test: "New Alert\n Type: {{.PolicyType}}\n Details: {{.Description}}"

当然,原始 {{}} 被解释为 Helm 模板而不是应用程序模板语言。

你需要做两件事才能完成这项工作。

在模板本身中,您需要使 Helm(或更准确地说是 Go text/template 引擎)输出 {{ 而不是将其解释为模板标记。我发现最简单的方法是编写一个发出花括号的模板块:

{{/* A template that evaluates to the literal string "{{" */}}
{{"{{"}}- if ne ... -}}

values.yaml 文件中不解释大括号,因此您无需在那里进行更改。但是,解析 YAML 文件会将 \n 转义序列转换为换行符并消耗可能存在的任何引号。 Helm 包含一个 toJson 函数,可以将任何内容呈现为有效 JSON,并且应该为您执行所需的引用和转义。

在您的示例中,还需要在与 { JSON 对象语法匹配的行的末尾再添加一个 }

把这些东西放在一起,你应该得到这样的东西:

alert_output:
  outputs:
    - type: webhook
      enabled: true
      template: |
          {{"{{"}}- if ne (print .PolicyType) "Heartbeat" -}}
          {"text": {{ toJson .Values.custom_alert_text }}}
          {{"{{"}}- end -}}

您也可以 assemble 模板语言中的整个对象,然后将其序列化;看起来像

template: |
  {{"{{"}}- if ne (print .PolicyType) "Heartbeat" -}}
  {{ dict "text" .Values.custom_alert_text | toJson }}
  {{"{{"}}- end -}}