我在领事模板中使用了以下模板:
{{ range services }}
{{ $server_name := .Name | replaceAll "_" "." }}
{{ range .Tags }}
{{ if . | regexMatch "server_name=" }}
# found matching server_name in {{ . }}
{{ $server_name := . | regexReplaceAll ".*=" "" }}
{{ end }}
{{ end }}
# server_name = {{ $server_name }}
acl host_{{ .Name }} hdr(host) -i {{ $server_name }}
use_backend {{ .Name }}_backend if host_{{ .Name }}
{{ end }}产
# found matching server_name in server_name=geoserver.hello.org
# server_name = geoserver.dev.hello.org
acl host_geoserver_dev_hello_org hdr(host) -i geoserver.dev.hello.org
use_backend geoserver_dev_hello_org_backend if host_geoserver_dev_hello_org其中.Name是geoserver_dev_hello_org,还有一个server_name=geoserver.hello.org标记。我希望到.Tags range循环结束时,$server_name应该有值geoserver.hello.org,但是它仍然具有原始的geoserver.dev.hello.org值。
如何使循环覆盖$server_name (并在找到值时退出循环)?
发布于 2016-01-13 09:23:49
内部$server_name和外部$server_name是不同的变量。您不能在Go模板:http://play.golang.org/p/0fuOmqXrSK中从外部范围设置变量。
您可以尝试重写模板,以便在内部acl中打印if等部分,除非只执行一次,否则会工作。Go模板不是为复杂逻辑设计的脚本语言,而是用于显示预先计算的信息的工具。类固醇的fmt.Printf如果你愿意的话。包括搜索和替换在内的所有逻辑都应该在Go中,它将更快、更安全、更易于维护和调试。
发布于 2017-03-09 21:12:41
在consul-template模板中,您可以使用划痕 --一个临时的键值存储,可以在模板的整个生命周期内使用。
您的代码将如下所示:
{{ range services }}
{{ $server_name := .Name | replaceAll "_" "." }}
{{ scratch.Set "server_name" $server_name }}
{{ range .Tags }}
{{ if . | regexMatch "server_name=" }}
# found matching server_name in {{ . }}
{{ $server_name := . | regexReplaceAll ".*=" "" }}
{{ scratch.Set "server_name" $server_name }}
{{ end }}
{{ end }}
# server_name = {{ scratch.Get "server_name" }}
acl host_{{ .Name }} hdr(host) -i {{ $server_name }}
use_backend {{ .Name }}_backend if host_{{ .Name }}
{{ end }}https://stackoverflow.com/questions/34761716
复制相似问题