2015-12-09 1 views
1

У меня есть несколько консулов ​​узлов, которые выглядят что-то похожее на:Как фильтровать консульные узлы с использованием нескольких тегов в консульном шаблоне?

[ 
    { 
     "Address": "127.0.0.1", 
     "Node": "foo", 
     "ServiceAddress": "", 
     "ServiceName": "api", 
     "ServicePort": 8100, 
     "ServiceTags": [ 
      "production", 
      "blocking" 
     ] 
    }, 
    { 
     "Address": "127.0.0.1", 
     "Node": "foo", 
     "ServiceAddress": "", 
     "ServiceName": "api", 
     "ServicePort": 8101, 
     "ServiceTags": [ 
      "production", 
      "nonblocking" 
     ] 
    } 
] 

Фильтрация по одной метке легко:

{{range service "production.api"}} 
{{.Address}} 
{{end}} 

, но как я могу фильтровать услуги в пределах моего консулом-шаблона двумя метками однажды?

ответ

2

По консулом шаблона v0.11.1 вы можете использовать оператор contains сделать:

{{range service "production.api"}} 
{{if .Tags | contains "nonblocking"}} 
{{.Address}} 
{{end}} 
{{end}} 

Если вы используете старую версию, Вы можете воспользоваться Go:

{{range service "api"}} 
{{if and (.Tags.Contains "nonblocking") (.Tags.Contains "production")}} 
{{end}} 
{{end}} 

см также: https://github.com/hashicorp/consul-template/issues/260

0

Вот как я пользуюсь тегами сервиса в haproxy, так что можно было бы сделать в nginx

{{ range $tag, $services := service "some-service" | byTag }} 
backend some-service-{{ $tag }} 

    {{ if eq $tag "some_tag" }} 
    .... 
    {{ end }} 
    ... 

    {{ range $services }} 
    server {{.Address}}-{{.Port}} {{.Address}}:{{.Port}} check downinter 3s inter 2000 fall 3 maxconn 100 check cookie {{.ID}} weight 1 
    {{ end }} 
{{ end }} 
Смежные вопросы