Golang中Helmfile和go模板使用问题探讨

Golang中Helmfile和go模板使用问题探讨 我正在为Helmfile实现一些Go模板,遇到了两个问题:

  1. {{ $name := Release.name }} 我需要在Values内部渲染$name 我尝试使用: {{ .Values.$name.something }} 但这不起作用,同样地: {{ .Values.{{$name}}.something }} 也不行。

  2. 我需要得到: 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

10 回复

谢谢,但我没看到在那里有办法解析 {{ .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

pkg.go.dev

template package - text/template - Go Packages

template 包实现了数据驱动的模板,用于生成文本输出。

你能告诉我为什么你试图使用 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,欢迎加入社区!

  1. 你所说的“Helmfile”,是指这个吗:GitHub - roboll/helmfile: Deploy Kubernetes Helm Charts

  2. 我不太清楚你想做什么。听起来你正在解析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循环和printfjoin函数:

{{- $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的需求。

回到顶部