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

ℝap*_*ink 3 templates go consul 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 }}
Run Code Online (Sandbox Code Playgroud)

产生

  # 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
Run Code Online (Sandbox Code Playgroud)

这里.Namegeoserver_dev_hello_org有一个server_name=geoserver.hello.org标签。我希望在.Tags范围循环结束时,$server_name应该具有 value geoserver.hello.org,但它仍然具有其原始值geoserver.dev.hello.org

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

vas*_*lvk 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 }}
Run Code Online (Sandbox Code Playgroud)