Как объединить метаданные Сервиса для консула-шаблона с запятыми

Кто-нибудь знает, как соединить строки из консула для консула-шаблона?

Если у меня есть услуга 'foo', зарегистрированная в Консуле

{
  "Node": "node1",
  "Address": "192.168.0.1",
  "Port": 3333
},
{
  "Node": "node2",
  "Address": "192.168.0.2",
  "Port": 4444
}

Я хотел бы, чтобы consul-template генерировал следующую строку:

servers=192.168.0.1:3333,192.168.0.2:4444/bogus

Следующая попытка не работает, так как она оставляет запятую ,

servers={{range service "foo"}}{{.Address}}{{.Port}},{{end}}/bogus
# renders
servers=192.168.0.1:3333,192.168.0.2:4444,/bogus

# What I actually want
servers=192.168.0.1:3333,192.168.0.2:4444/bogus

Я знаю, что консул-шаблон использует синтаксис шаблона Голанга, но я просто не могу понять синтаксис, чтобы это работало. Вполне вероятно, что я должен использовать консул-шаблон join но как пройти оба .Address а также .Port в join? Это всего лишь тривиальный пример, и я не использую индексы намеренно, поскольку число служб может быть больше двух. Есть идеи?

2 ответа

Это должно работать.

{{$foo_srv := service "foo"}}
{{if $foo_srv}}
  {{$last := len $foo_srv | subtract 1}}
servers=
  {{- range $i := loop $last}}
    {{- with index $foo_srv $i}}{{.Address}}{{.Port}},{{end}}
  {{- end}}
  {{- with index $foo_srv last}}{{.Address}}{{.Port}}{{end}}/bogus
{{end}}

Я думал, можно ли использовать "присоединиться".

Примечание "{{-" означает удаление начальных пробелов (таких как ' ', \t, \n).

Вы можете использовать собственный плагин.

servers={{service "foo" | toJSON | plugin "path/to/plugin"}}

Код плагина:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type InputEntry struct {
    Node    string
    Address string
    Port    int
}

func main() {
    arg := []byte(os.Args[1])
    var input []InputEntry
    if err := json.Unmarshal(arg, &input); err != nil {
        fmt.Fprintln(os.Stderr, fmt.Sprintf("err: %s", err))
        os.Exit(1)
    }

    var output string
    for i, entry := range input {
        output += fmt.Sprintf("%v:%v", entry.Address, entry.Port)
        if i != len(input)-1 {
            output += ","
        }
    }

    fmt.Fprintln(os.Stdout, string(output))
    os.Exit(0)
}
Другие вопросы по тегам