2016-07-25 3 views
1

누구든지 consul-template에 대한 consul에서 문자열을 연결하는 방법을 알고 있습니까? 이 잎 이후consul-template 용 서비스 메타 데이터를 쉼표로 연결하는 방법

servers=192.168.0.1:3333,192.168.0.2:4444/bogus 

다음 시도가 작동하지 않습니다 나는 서비스 영사에 등록 된 'foo는'있는 경우

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

나는 다음 줄을 생성하기 위해 영사 템플릿을 부탁합니다 후행 쉼표 ,

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에서 g olang 템플릿 구문,하지만 난 단순히 구문을 이해할 수 없다. 아마도 영사 - 템플릿의 join을 사용해야하지만 .Address.Port을 모두 join으로 전달하는 방법은 무엇입니까? 이는 단순한 예일 뿐이고 서비스의 수가 2 개를 초과 할 수 있으므로 인덱스를 의도적으로 사용하지 않습니다. 어떤 아이디어?

답변

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

이 작동합니다.

{{$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과 같은] 선행 공백을 제거하는 것을 의미합니다.