如何使用逗号连接consul-template的服务元数据

时间:2016-07-25 17:52:41

标签: templates go consul consul-template

有谁知道如何连接consul-template的consul字符串?

如果我在Consul中注册了服务'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

我知道consul-template使用golang模板语法,但我根本无法找出使其工作的语法。我可能应该使用consul-template join,但如何将.Address.Port传递给join?这只是一个简单的例子,我没有故意使用索引,因为服务的数量可能超过两个。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这应该有用。

{{1}}

我在考虑是否加入"可以使用。

注意" {{ - "意味着删除前导空格(例如'',\ t,\ n)。

答案 1 :(得分:0)

您可以使用自定义插件。

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)
}