consul-template的hcl和配置文件模板语法
hcl和配置文件模板语法参考:
https://wizardforcel.gitbooks.io/consul-guide/content/11_consul_template.html
和
https://github.com/hashicorp/consul-template/blob/main/docs/templating-language.md#in
后者是官方的。
其中,配置文件模板本身有类似于lisp的语法,其实就是所谓的go template。go template的语法参考:
https://www.jianshu.com/p/29c9f5e06b1d
https://qdmana.com/2022/03/202203240208085632.html
consul不过在其上补了一些自定义函数罢了。
比如查询consul服务使用:
{{ service .Name }}
会返回一个[]*HealthService 结构的数组,对这个结果调用range,可以遍历该数组:
{{ range service .Name }}
如想判断数组是否不为空,可用:
{{ if service .Name }}
或
{{ if gt (len (service “flask_svr”)) 0 }}
看到没,这是典型的lisp语法,op code在前,op number在后。
注释使用:
# 注释
{{/* comment */}}
{{- /* comment */ -}}
注意
:/*要紧贴大括号写。
if-else这样写:
{{ if or (eq .Name "Webapp1") (eq .Name "Webapp2") }}
upstream {{.Name}}_b {
{{ else }}
upstream {{.Name}} {
{{ end }}
字符串的变量赋值和引用这样写:
{{ $svc := "flask_svr" }}
{{ if service $svc }}
...
数组的变量赋值和引用这样写:
{{ $svcs := parseJSON `["write", "read"]` }}
{{ range $svcs }}
{{ . }}
{{ end }}
注意
: {{ . }} 代表的是range循环遍历中的每个元素,有点perl里的$_的意思。
如果不用parseJSON,原始的go template语法是没办法直接赋值一个常量数组的。对此,我研究过go\src\text\template\parse\lex.go的源码,基本可以确定。
in语法这样写(in也是consul提供的自定义函数,而非go的原生API):
{{ $svcs := parseJSON `["write", "read"]` }}
{{ if in $svcs "read" }}
bingo
{{ end }}
注意
:in函数要,范围是第一个参数,待判定的元素是第二个参数
``在go template里表示raw quote string,即相比双引号,不做任何转义。类似python的三引号。
字典的变量赋值和引用这样写:
{{ $svcs := parseJSON `[{"id":1, "age":45},{"id":2, "age":40}]`}}
{{ range $svcs }}
{{ .age }}
{{ end }}
打印结果是:
45
40