英文:
With helm template file conditionally set a variables used throughout template file
问题
我想在我的Helm模板文件的顶部有条件地设置一个名为'go'的变量,然后在模板文件的其他地方使用它。以下是我尝试但不起作用的方法:
在模板文件的顶部,我进行如下操作:
{{- if eq $.Values.kafka.create true -}}
{{- $kafka_port := 9094 -}}
{{- else -}}
{{- $kafka_port := $.Values.kafka.port -}}
{{- end }}
但是,当我尝试执行"helm install"时,我在模板文件的其他地方使用$kafka_port时出现解析错误。具体的错误是:
错误:解析错误 (tombolo/templates/tom-node-launch.yaml:89):未定义变量"$kafka_port"
英文:
I want to conditionally set a 'go' variable at the top of my helm template file then use it later in the template file. Here is what I tried that doesn't work:
At the top of my template file, I do the following:
{{- if eq $.Values.kafka.create true -}}
{{- $kafka_port := 9094 -}}
{{- else -}}
{{- $kafka_port := $.Values.kafka.port -}}
{{- end }}
But when I attempt to do "helm install" I get a parse error where I use $kafka_port later in the template file. The specific error is:
Error: parse error at (tombolo/templates/tom-node-launch.yaml:89): undefined variable "$kafka_port"
答案1
得分: 2
在外部代码块中定义变量:
{{- $kafka_port := 9094 -}}
{{- if eq $.Values.kafka.create false -}}
{{- $kafka_port = $.Values.kafka.port -}}
{{- end }}
在外部代码块中定义变量:
{{- $kafka_port := 9094 -}}
{{- if eq $.Values.kafka.create false -}}
{{- $kafka_port = $.Values.kafka.port -}}
{{- end }}
英文:
Define the variable in the outer block:
{{- $kafka_port := 9094 -}}
{{- if eq $.Values.kafka.create false -}}
{{- $kafka_port = $.Values.kafka.port -}}
{{- end }}
答案2
得分: 0
你的示例非常简短,对于你的用例可能是可以的。
但作为一般规则:当你开始在模板中编写代码时,这也可能是你应该在控制器部分(即Go代码)中编写代码的一个指示:
type KafkaCfg struct {
port int
create bool
}
const kafkaCreationPort = 9094
func (c KafkaCfg) Port() int {
if c.create {
return kafkaCreationPort
}
return c.port
}
func someWhereElse() {
var data struct {
Values struct {
Kafka KafkaCfg
}
}
data.Values.Kafka.create = true
helmTemplate.Execute(w, data)
}
// 在你的模板中:
{{ .Values.Kafka.Port }} {{ /* <- 将调用 .Port() 方法 */ }}
链接:https://play.golang.org/p/6pNHY0kcegp
英文:
Your example is pretty short and may well be ok for your use case.
But as a general rule : when you start writing code in your templates, it could also be an indication that you should write code in the controller part (the go code) :
type KafkaCfg struct {
port int
create bool
}
const kafkaCreationPort = 9094
func (c KafkaCfg) Port() int {
if c.create {
return kafkaCreationPort
}
return c.port
}
func someWhereElse() {
var data struct {
Values struct {
Kafka KafkaCfg
}
}
data.Values.Kafka.create = true
helmTemplate.Execute(w, data)
}
// in your template :
{{ .Values.Kafka.Port }} {{ /* <- will call the .Port() method */ }}
答案3
得分: 0
Go的text/template
语言(与Go编程语言本身不同)没有全局变量。
你可以编写一个辅助模板,通常放在templates/_helpers.tpl
中,生成这个片段:
{{- define "kafka.port" -}}
{{- if .Values.kafka.create -}}
9094
{{- else -}}
{{- .Values.kafka.port -}}
{{- end -}}
当调用这个模板时,它会输出端口号;它的单个参数应该是标准的顶级Helm对象。
- name: KAFKA_PORT
value: {{ include "kafka.port" . | quote }}
或者,如果在特定上下文中需要将其作为变量使用,你可以在那里包含它(使用Helm include
扩展将调用模板的输出捕获为字符串);但它将仅限于特定的模板或文件。
{{- $kafkaPort := include "kafka.port" . }}
- name: KAFKA_PORT
value: {{ quote $kafkaPort }}
- name: KAFKA_BROKER_URL
value: kafka://{{ include "kafka.name" . }}:{{ $kafkaPort }}
英文:
The Go text/template
language (as distinct from the Go programming language itself) doesn't have global variables.
The thing you can do is to write a helper template, typically in templates/_helpers.tpl
, that generates this fragment:
{{- define "kafka.port" -}}
{{- if .Values.kafka.create -}}
9094
{{- else -}}
{{- .Values.kafka.port -}}
{{- end -}}
This template outputs the port number when called; its single parameter should be the standard top-level Helm object.
- name: KAFKA_PORT
value: {{ include "kafka.port" . | quote }}
Or, if in a specific context, you happen to need it as a variable, you can include it there (using the Helm include
extension to capture the called template's output as a string); but it will be limited to its specific template or file.
{{- $kafkaPort := include "kafka.port" . }}
- name: KAFKA_PORT
value: {{ quote $kafkaPort }}
- name: KAFKA_BROKER_URL
value: kafka://{{ include "kafka.name" . }}:{{ $kafkaPort }}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论