Gomplate: неверный символ U 0022 ‘-‘

#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 }}'