猿问

在 consul-template 中的循环中覆盖变量

我在 consul-template 中使用以下模板:


{{ 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范围循环结束时,$server_name应该具有 value geoserver.hello.org,但它仍然具有其原始值geoserver.dev.hello.org。


我怎样才能使循环覆盖$server_name(并在找到值时退出循环)?


MMMHUHU
浏览 149回答 3
3回答

慕丝7291255

在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 }}

泛舟湖上清波郎朗

内部$server_name和外部$server_name是不同的变量。您不能在 Go 模板中从外部范围设置变量:http : //play.golang.org/p/0fuOmqXrSK。您可以尝试重写您的模板以在acl内部打印等部分if,除非您只需要执行该部分一次,否则该部分将起作用。Go 模板不是作为复杂逻辑的脚本语言设计的,它是用于显示预先计算的信息的工具。一fmt.Printf,如果你愿意的类固醇。包括搜索和替换在内的所有逻辑都应该在 Go 中,它会更快、更安全、更易于维护和调试。

饮歌长啸

自Go 1.11 发布以来,可以通过模板中的赋值来修改变量。所以这是现在工作:  {{ $v := "init" }}  {{ if true }}    {{ $v = "changed" }}  {{ end }}  v: {{ $v }} {{/* "changed" */}}这个版本是在v0.25.1版本中引入到 Consul 模板的。
随时随地看视频慕课网APP

相关分类

Go
我要回答