#go #yaml #gomplate
#Вперед #yaml #gomplate
Вопрос:
Я пробовал gomplate и столкнулся с ошибкой.
Для контекста я определил файл шаблона test.tmplt и файл источника данных dev.yaml.
test.tmplt имеет следующее содержимое :
localAPIEndpoint:
advertiseAddress: {{ (datasource "k8s").api-advertise-ip }}
в то время как dev.yaml содержит следующее :
api-advertise-ip: 192.168.0.1
Если я попытаюсь заполнить содержимое test.tmplt, используя gomplate, например :
gomplate -d k8s=./dev.yaml -f ./test.tmplt -o test.conf
Я получаю следующую ошибку :
09:42:44 FTL error="template: ./test.tmplt:2: bad character U 002D '-'"
Мне кажется, что ему не нравится символ ‘-‘ в файле шаблона. Есть ли обходной путь?Это предполагаемое поведение?
Редактировать 1: Спасибо @icza за ответ, который правильно работает для примера выше. Тем не менее, если я изменю файл yaml, чтобы в нем были вложенные поля, он, похоже, выйдет из строя.
Например
dev.yaml :
kubernetes:
api-advertise-ip: 192.168.0.0
test.tmplt :
localAPIEndpoint:
advertiseAddress: {{ index (datasource "k8s") "kubernetes.api-advertise-ip" }}
В этом случае вывод :
gomplate -d k8s=./dev.yaml -f ./test.tmplt -o test.conf
является :
localAPIEndpoint:
advertiseAddress: <no value>
Ответ №1:
Вашим "k8s"
источником данных является конфигурация YAML, и вы хотите получить доступ к api-advertise-ip
его свойству.
Поскольку api-advertise-ip
содержит тире, вы не можете использовать имя как есть в шаблоне, потому что это синтаксическая ошибка: механизм шаблонов пытается использовать api
в качестве имени свойства, а тире после этого является синтаксической ошибкой.
Вы должны заключить имя свойства в кавычки, содержащие тире: "api-advertise-ip"
, но это использование .
селектора также является недопустимым синтаксисом.
Используйте встроенную index
функцию для индексации источника данных YAML с помощью этого ключа:
localAPIEndpoint:
advertiseAddress: {{ index (datasource "k8s") "api-advertise-ip" }}
gomplate
как используется text/template
под капотом, смотрите Рабочий пример на игровой площадке Go.
При использовании index
и наличии нескольких вложенных уровней укажите каждый ключ в качестве дополнительного параметра index
.
Например:
localAPIEndpoint:
advertiseAddress: {{ index (datasource "k8s") "kubernetes" "api-advertise-ip" }}
Попробуйте это на игровой площадке Go.
Комментарии:
1. Большое спасибо, я попытался использовать index, сохраняя при этом точку (не знаком с golang), и ничего не вышло! Спасибо за решение, я попробую его как можно скорее и приму ответ, если он сработает 🙂
2. Это работает, но как насчет вложенных полей? Например, в моем файле yaml у меня может быть «kubernetes: n tapi-конечная точка: 123». Использование {{ index (datasource «k8s») «kubernetes.api-end-point» }} не работает. Ну, он компилируется правильно, но вывод «<нет значения>». Как так получилось?
3. @MFranc Каждый ключ является дополнительным параметром
index
, подобным этому:{{ index (datasource "k8s") "kubernetes" "api-end-point" }}
. Смотрите рабочий пример на игровой площадке Go .
Ответ №2:
Для тех, кто попадает сюда для доступа к значениям из Kubernetes secret (с kubectl
помощью), в ключах которых есть дефис -
, решение, предложенное @icza:
kubectl -n <namespace>
get secret <secret-name>
-ogo-template='{{ index .data "key-with-hyphens" | base64decode }}'