Как объединить метаданные Сервиса для консула-шаблона с запятыми
Кто-нибудь знает, как соединить строки из консула для консула-шаблона?
Если у меня есть услуга '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)
}