为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MMMHUHU 2021-12-07 10:17:08
我在 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(并在找到值时退出循环)?
查看完整描述

3 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-12-07
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2021-12-07
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

自Go 1.11 发布以来,可以通过模板中的赋值来修改变量。所以这是现在工作:


  {{ $v := "init" }}

  {{ if true }}

    {{ $v = "changed" }}

  {{ end }}

  v: {{ $v }} {{/* "changed" */}}

这个版本是在v0.25.1版本中引入到 Consul 模板的。


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信