Как я могу фильтровать узлы консула, используя несколько тегов в шаблоне консула?

У меня есть несколько узлов консула, которые выглядят примерно так:

 [
    {
        "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}}

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


person Keyan P    schedule 09.12.2015    source источник


Ответы (2)


Начиная с consul-template 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< /а>

person Keyan P    schedule 09.12.2015

Вот как я использую служебные теги в 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 }}
person James Morgan    schedule 14.08.2017