2016-01-13 6 views
2

Я использую следующий шаблон в консулом-шаблон:Переопределение переменную в цикле в консулом-шаблоне

{{ 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 

, где находится .Namegeoserver_dev_hello_org и есть server_name=geoserver.hello.org тег. Я ожидаю, что к концу цикла .Tags диапазон $server_name должен иметь значение geoserver.hello.org, но он все еще имеет свое исходное значение geoserver.dev.hello.org.

Как это сделать, чтобы цикл перекрывал $server_name (и выходите из цикла, когда значение найдено)?

+0

Возможный дубликат [? В цикле диапазона шаблон Go, переменные, объявленные вне сброса петли на каждой итерации] (http://stackoverflow.com/questions/28674199/in-a-go-template-range-loop-are-variables-declaration-outside-the-loop-reset-on-ea) – icza

+0

Да действительно @icza –

ответ

2

Внутренние $server_name и внешние $server_name - разные переменные. Вы не можете установить переменную из внешней области в шаблонах Go: http://play.golang.org/p/0fuOmqXrSK.

Вы можете попробовать и переписать свой шаблон, чтобы напечатать acl и т. Д. Часть внутри внутреннего if, которая будет работать, если только вам не понадобится выполнить эту часть только один раз. Шаблоны Go не предназначены в качестве языка сценариев для сложной логики, это инструмент для отображения предварительно вычисленной информации. A fmt.Printf на стероидах, если хотите. Вся логика, включая поиск и замену, должна быть в Go, она будет быстрее, безопаснее, проще в обслуживании и отладке.

+0

Спасибо. В консул-шаблоне я предполагаю, что мне нужно написать [плагин] (https://github.com/hashicorp/consul-template#plugins), чтобы написать код Go для этого? –

+0

@ ℝaphink Глядя на свои документы, кажется, что вы можете написать плагин на любом языке, а не просто Go. Кроме того, теперь, когда я думаю об этом, перемещение части после цикла внутри не является на самом деле плохой идеей, если только вам не нужно гарантировать, что она печатает только один раз. –

+0

В этом случае на самом деле это не помешает, если бы я напечатал строку для 'server_name', а также' .Name', поэтому я мог бы это сделать. –

3

В шаблоне consul-template вы можете использовать the scratch - временное хранилище ключей, доступное на протяжении всего жизненного цикла шаблона.

Ваш код будет выглядеть следующим образом:

{{ 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 }} 
+0

приятный приятный приятный приятный – Greg