我在
values.yaml
中定义了一系列属性,如下所示:
files:
- "file1"
- "file2"
然后在我的模板中,我想根据我的值创建配置映射。
我想出了以下模板:
{{- range $value := .Values.files }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ $value }}
data:
{{ $value }}: {{ .Files.Get (printf "%s/%s" "files" $value) | indent 4 }}
{{- end }}
如您所见,我希望配置映射与文件同名。我混淆了文档的几个部分,但是我的模板无法按预期工作。
如何通过模板实现configmap创建?
//编辑 我期望有以下 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: file1
data:
file1: <file1 content>
---
apiVersion: v1
kind: ConfigMap
metadata:
name: file2
data:
file2: <file2 content>
尝试以下操作:
{{- $files := .Files }}
{{- range $value := .Values.files }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ $value }}
data:
{{ $value }}: |
{{ $files.Get (printf "%s/%s" "files" $value) | indent 6 }}
{{- end }}
您的问题似乎是缩进不正确。确保以
$files.Get
开头的行没有空格。
我还添加了
{{- $files := .Files }}
来访问 .Files
,因为由于某种原因 range
正在更改 .
范围。
我在文档中找到了这个示例,但它似乎仅在文件内容为一行时才有效。因此,如果您的文件只有一行,那么您应该检查示例。
另请注意
|
之后的 {{ $value }}:
。您需要它,因为文件内容是多行字符串。检查 this StackQuestion 了解如何在 yaml 中使用多行字符串。
尝试以下操作
{{ $currentScope := .}}
{{- range $value := .Values.files }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ $value }}
data:
{{- with $currentScope}}
{{ $value }}: {{ .Files.Get (printf "%s/%s" "files" $value) | indent 4 }}
{{- end }}
{{- end }}
我的图表结构
├── Chart.yaml
├── charts
├── files
│ ├── file1
│ └── file2
├── templates
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── secret.yaml
│ └── service.yaml
└── values.yaml
现在可以使用 Files.Glob 分别使用
AsConfig
和 AsSecret
将文件内容渲染到 ConfigMaps 和 Secrets 中
例如
apiVersion: v1
kind: ConfigMap
metadata:
name: MyConifg
data:
{{ (.Files.Glob "files/*").AsConfig | indent 2 }}
在这个简单的情况下,您最终会得到 1 个 ConfigMap,其中包含每个文件的一个条目,并进行了正确的转义和格式化,但可以轻松地使用
range
块进行调整以创建多个 ConfigMap