我正在使用confd進行動態nginx服務重新配置,並且與Go模板有點糾結。我有一個名爲$data
的json對象,並且$data.subsets
可能包含一個名爲'addresses'的鍵 - 我只想在滿足條件時執行循環內的模板。轉到模板 - 檢查一個鍵是否存在於json列表中
我試過了各種東西,如你在下面看到的$data.subsets[0].addresses
,這是完全錯誤的。我不確定如何做到這一點。
這是我的nginx模板的一部分,我只想渲染,如果至少有一個上游服務,而不是如果沒有/不可用。
以下模板是json對象$data
成功失敗的原因。
預先感謝您的幫助,非常感謝!
{{ range $ns := getvs "/registry/services/endpoints/*/app" }}
{{ $data := json $ns }}
{{ if $data.subsets[0].addresses }}
upstream {{ $data.metadata.namespace }}_{{ $data.metadata.name }}_pool {
{{ range $subset := $data.subsets }}{{ range $ref := $subset.addresses }}{{ range $portConfig := $subset.ports }}
server {{ $ref.ip }}:{{ $portConfig.port }};
{{ end }}{{ end }}{{ end }}
}
{{ end }}
{{ end }}
的$data
實例時,有沒有計劃莢:
{
"kind":"Endpoints",
"apiVersion":"v1",
"metadata":{
"name":"app",
"namespace":"ns1",
"selfLink":"/api/v1/namespaces/ns1/endpoints/app",
"labels":{
"app":"app"
}
},
"subsets":[]
}
例$data
如果有運行中的豆莢,但沒有健康:
$data
{
"kind":"Endpoints",
"apiVersion":"v1",
"metadata":{
"name":"app",
"namespace":"ns1",
"labels":{
"app":"app"
}
},
"subsets":[
{
"notReadyAddresses":[
{
"ip":"10.254.60.5",
"targetRef":{
"kind":"Pod",
"namespace":"ns1",
"name":"app-421757659-83rfg",
}
}
],
"ports":[
{
"name":"ns1-app-8080",
"port":8080,
"protocol":"TCP"
}
]
}
]
}
當有豆莢運行並可用。這是我希望滿足迭代模板渲染的唯一條件。
{
"kind":"Endpoints",
"apiVersion":"v1",
"metadata":{
"name":"app",
"namespace":"ns1",
"selfLink":"/api/v1/namespaces/ns1/endpoints/app",
"labels":{
"app":"app"
}
},
"subsets":[
{
"addresses":[
{
"ip":"10.254.18.11",
"targetRef":{
"kind":"Pod",
"namespace":"ns1",
"name":"app-3869480132-kfthi"
}
},
{
"ip":"10.254.18.9",
"targetRef":{
"kind":"Pod",
"namespace":"ns1",
"name":"app-3869480132-9bufk"
}
}
],
"ports":[
{
"name":"ns1-app-8080",
"port":8080,
"protocol":"TCP"
}
]
}
]
}
爲什麼你不檢查正常的JSON處理正常的代碼中的條件,然後只傳遞一個布爾到模板?在你的json中訪問值是非常直接的,不管它是哪種變化,但我不確定你會怎麼做,因爲在這種情況下庫的發揮。除非'$ data'對象在其他地方大量使用,否則我認爲它不應該傳遞給模板,因爲大部分對象在這種情況下是無關緊要的。事實上,你應該只是提取地址列表並傳遞它,並且在你的模板中沒有這個邏輯。 – evanmcdonnal