Golang中Helmfile和go模板使用问题探讨
Golang中Helmfile和go模板使用问题探讨 我正在为Helmfile实现一些Go模板,遇到了两个问题:
-
{{ $name := Release.name }} 我需要在Values内部渲染$name 我尝试使用: {{ .Values.$name.something }} 但这不起作用,同样地: {{ .Values.{{$name}}.something }} 也不行。
-
我需要得到: value: myurlone,myurltwo,myurlthree
Values.elements → one, two, three
Values文件: elements: one: website: url: myurlone two: website: url: myurltwo three: website: url: myurlthree
我尝试了类似这样的方法:
{{ -range $key, $value := .Values.elements }} {{ join “,” .Values.$value.website.url }} 但没有成功。
非常感谢任何帮助。
更多关于Golang中Helmfile和go模板使用问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢,但我没看到在那里有办法解析 {{ .Values }} 作用域内的变量。
更多关于Golang中Helmfile和go模板使用问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你能展示一个如何反序列化输入YAML的示例吗?了解其具体形式将有助于回答你关于如何生成输出的问题。
你在这里回答的是哪一点?第1点还是第2点?如果你最初没有 $value,你如何定义 $url?
定义变量
{{- $url := .Values.url}}
{{ -range $key, $value := .Values.elements }}
{{ $url }}{{ $key }}{{ $value }}
{{- end }}
我的配置由YAML文件组成,并且我正在根据这些YAML文件对K8s对象进行模板化。 因此命令是:
helmfile -f helmfile.yaml -l name=service template > output.yaml
oc apply -f output.yaml
你能告诉我为什么你试图使用 text/template 包来生成 YAML,而不是使用专门处理 YAML 的包,比如我链接的那个(yaml 包 - gopkg.in/yaml.v2 - Go Packages)吗?首先,你是如何解析 YAML 以便在模板中使用它的?
是的,那么第二个问题是关于如何从以下YAML文件中获取:
value: myurlone,myurltwo,myurlthree
elements:
one:
website:
url: myurlone
two:
website:
url: myurltwo
three:
website:
url: myurlthree
所以我需要以某种方式遍历 elements 并获取一个用逗号分隔的URL列表。
{{ -range $key, $value := .Values.elements }}
{{ -- not working join “,” .Values.$value.website.url }}
你好,Stefano,欢迎加入社区!
-
你所说的“Helmfile”,是指这个吗:GitHub - roboll/helmfile: Deploy Kubernetes Helm Charts?
-
我不太清楚你想做什么。听起来你正在解析YAML,并且想使用
text/template包将其渲染成另一种YAML模式。是这样吗?如果是这样,为什么不使用像 yaml package - gopkg.in/yaml.v2 - Go Packages 这样的Go包来处理YAML呢?
如果不是,你能重新说明一下你的输入和期望的输出吗?
附言:另外,当代码片段(尤其是那些空格很重要的代码,比如YAML)被反引号(`)包裹时,我们通常更容易阅读,例如:
inline code 会变成 inline code
或者对于多行代码,放3个反引号(```),然后换行,接着是你的代码,再换行,最后再放3个反引号。例如:
multiple
lines
of
code
会变成:
multiple
lines
of
code
这样我们就能看到输入(和输出?)YAML的实际布局了。
针对你的两个Go模板问题,这里提供具体的解决方案:
问题1:动态访问Values字段
使用index函数来动态访问嵌套的Values字段:
{{ $name := .Release.Name }}
{{ $value := index .Values $name "something" }}
或者在一行中访问:
{{ (index .Values $name "something").property }}
如果你的结构是Values.$name.something,可以这样:
{{ $name := .Release.Name }}
{{ with index .Values $name }}
{{ .something }}
{{ end }}
问题2:遍历并拼接URL
使用range循环和printf或join函数:
{{- $urls := list -}}
{{- range $key, $value := .Values.elements -}}
{{- $urls = append $urls $value.website.url -}}
{{- end -}}
value: {{ join "," $urls }}
或者更简洁的版本:
{{- define "getUrls" -}}
{{- $result := list -}}
{{- range .Values.elements -}}
{{- $result = append $result .website.url -}}
{{- end -}}
{{- join "," $result -}}
{{- end -}}
value: {{ include "getUrls" . }}
如果你需要直接输出,可以这样:
value: {{- range $index, $element := .Values.elements -}}
{{- if $index }},{{ end -}}
{{- $element.website.url -}}
{{- end -}}
完整示例
结合你的两个需求:
{{ $name := .Release.Name }}
{{ $dynamicValue := index .Values $name "something" }}
{{- $urlList := list -}}
{{- range $key, $value := .Values.elements -}}
{{- $urlList = append $urlList $value.website.url -}}
{{- end -}}
config:
nameValue: {{ $dynamicValue }}
urls: {{ join "," $urlList }}
这些代码可以直接在Helmfile模板中使用,能够正确解析动态字段名和遍历拼接URL的需求。

