Helm 模板未使用适当的缩进呈现

Helm template not being rendered with appropriate indentation

我正在尝试 helm-template this Secret

kind: Secret
apiVersion: v1
metadata:
  name: my-roles-secret
stringData:
  roles.yml: |-
    click_admins:
      run_as: [ 'clicks_watcher_1' ]
      cluster: [ 'monitor' ]
      indices:
      - names: [ 'events-*' ]
        privileges: [ 'read' ]
        field_security:
          grant: ['category', '@timestamp', 'message' ]
        query: '{"match": {"category": "click"}}'

这是我的模板

{{ if .Values.customRoles }}
{{ if .Values.customRoles.enabled }}
kind: Secret
apiVersion: v1
metadata:
  name: my-roles-secret
stringData:
  roles.yml: |-
    {{ .Values.customRoles.definition -}}
{{ end }}
{{ end }}

和相应的值

customRoles:
  enabled: true
  definition: |-
      click_admins:
        run_as: [ 'clicks_watcher_1' ]
        cluster: [ 'monitor' ]
        indices:
        - names: [ 'events-*' ]
          privileges: [ 'read' ]
          field_security:
            grant: ['category', '@timestamp', 'message' ]
          query: '{"match": {"category": "click"}}'

为什么我得到以下输出?

helm template -f values.yaml
(...)

kind: Secret
apiVersion: v1
metadata:
  name: my-roles-secret
stringData:
  roles.yml: |-
    click_admins:
  run_as: [ 'clicks_watcher_1' ]
  cluster: [ 'monitor' ]
  indices:
  - names: [ 'events-*' ]
    privileges: [ 'read' ]
    field_security:
      grant: ['category', '@timestamp', 'message' ]
    query: '{"match": {"category": "click"}}'

为什么 click_admins 的缩进如此严重?

如何使用 helm 模板生成第一个片段?

definition: |-
      click_admins:

    {{ .Values.customRoles.definition -}}

两者都有前导空格。所以空格被包含了两次。

将模板更改为:

stringData:
  roles.yml: |-
{{ .Values.customRoles.definition | indent 4 }}

(所以不要缩进最后一行,但要在末尾包含 ... | indent 4。)


当 Helm 的 YAML 解析器读取 values.yaml 文件时,它会将 customRoles.definition 值加载到字符串中。 YAML 的规则是从每一行中去除一致数量的前导空格,因此该值将是一个字符串,从第一个字符开始,其下方有缩进行:

# .Values.customRoles.definition -- note, the first line is not indented
click_admins:
  run_as: [ 'clicks_watcher_1' ]
  ...

在您的原始模板中,第一行之前有几个空格,但其余行没有缩进。 Helm indent 函数在每行前插入一致数量的空格。这包括第一行,因此您需要删除模板文件中的额外缩进。

如果您熟悉其他语言,该字符串的值为

"click_admins:\n  run_as: [...]\n  cluster: ..."

在您的原始表单中,您在字符串的前面放置了四个空格,但不影响嵌入的换行符。 indent 4 在字符串的前面和每个换行符之后放置 4 个空格。