使用with修改作用域

假如我们在values.yaml中的app路径下定义了多个参数,在相应的template中调用时需要重复声明多个.Values.app根路径:

image-20211217201422073

with 操作可以解决这个问题——它用于控制变量的作用域,然后重新用 . 调用就表示对当前作用域的引用。例如,我们一直在使用 .Values.app,让我们重写下configmap.yaml模板文件来更改 . 的范围指向 .Values.app

image-20211217201546530

使用with block时,还有一个问题需要特别注意,由于with作用域此时为.Values.app, 如果我们在里面继续调用其他的全局变量(如.Release.Name),则调用路径实际为.Values.app.Release.Name,不符合预期,进行渲染时也会报错。

可以使用$符号来解决这个问题,它表示重新从根路径开始搜索:

image-20211217201704407

附:实验代码

configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-appinfo
data:
{{- with .Values.app }}
  {{- with .ui }}
  background: {{ .bg }}
  foreground: {{ .fg }}
  {{- end }}
  {{- with .db }}
  database: {{ .name }}
  connection: {{ .conn }}
  {{- end }}
  release: {{ $.Release.Name }}
{{- end }}

values.yaml:

app:
  ui:
    bg: red
    fg: black
  db:
    name: "users"
    conn: "mongodb://localhost:27020/mydb"

执行结果:

image-20211219195955376