3

我在领事模板中使用以下模板:

{{ 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(并在找到值时退出循环)?

4

3 回答 3

5

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 }}
于 2017-03-09T21:12:41.830 回答
2

内部$server_name和外部$server_name是不同的变量。您不能在 Go 模板中从外部范围设置变量:http ://play.golang.org/p/0fuOmqXrSK 。

您可以尝试重写您的模板以在acl内部打印 etc. 部分if,除非您只需要执行一次该部分,否则它将起作用。Go 模板不是为复杂逻辑设计的脚本语言,它是一种显示预先计算信息的工具。如果fmt.Printf你愿意,可以服用类固醇。包括搜索和替换在内的所有逻辑都应该在 Go 中,它会更快、更安全、更容易维护和调试。

于 2016-01-13T09:23:49.390 回答
1

Go 1.11 版本开始,可以通过模板中的赋值来修改变量。所以这现在有效:

  {{ $v := "init" }}
  {{ if true }}
    {{ $v = "changed" }}
  {{ end }}
  v: {{ $v }} {{/* "changed" */}}

这个版本是在v0.25.1版本中引入Consul Template 的。

于 2021-02-05T07:12:54.970 回答