目的
本文详细介绍了confd模板的语法和结构。并且在结尾给出示例演示,帮助你充分理解好消化。
模板源
模板源以TOML编写并已 .toml 作为后缀的来定义的。默认情况下,模板源存储在/etc/confd/conf.d
目录下。
必要参数
dest
(字符串) - 目标文件。keys
(字符串数组) - 键数组。src
(字符串) - 配置模板的相对路径 。
可选参数
gid
(int) - 应该拥有该文件的gid。默认为有效的gid。mode
(字符串) - 文件的权限模式。uid
(int) - 应该拥有该文件的uid。默认为有效的uid。reload_cmd
(字符串) - 重新加载配置的命令。check_cmd
(字符串)- 检查配置的命令。prefix
(字符串) - 键前缀的字符串。
注意点
使用该 reload_cmd
功能时,命令自行退出非常重要。reload命令不由confd管理,并将阻止配置运行直到它退出。
例子
1 | [template] |
模板定义单个应用程序配置模板。默认情况下,模板存储在/etc/confd/templates
目录下。
模板是用Go编写的 模板格式。
模板函数
map
创建接口和字符串的键值映射
1 | {{$endpoint := map "name" "elasticsearch" "private_port" 9200 "public_port" 443}} |
如果您是子模板并且想要向其传递多个值,则特别有用。
base
path.Base函数的别名 。
1 | {{with get "/key"}} |
exists
判断键是否存在。如果找不到键,则返回false。
1 | {{if exists "/key"}} |
get
返回键与其键匹配的键值对。如果未找到键,则返回错误。
1 | {{with get "/key"}} |
gets
返回与其key匹配所有键值对,如果未找到键,则返回错误。
1 | {{range gets "/*"}} |
getv
返回与其键或可选的默认值匹配的字符串,如果未找到键且未给出默认值,则返回错误。
1 | value: {{getv "/key"}} |
getv默认值
1 | value: {{getv "/key" "default_value"}} |
getvs
返回与其键匹配所有值的字符串,如果未找到密钥,则返回错误。
1 | {{range getvs "/*"}} |
getenv
返回在os.Getenv 中检索由键命名的环境变量的值。如果变量不存在,该值将为空。(可选)您可以提供一个默认值,如果该键不存在,将返回该值。
1 | export HOSTNAME=`hostname` |
getenv默认值
1 | ipaddr: {{getenv "HOST_IP" "127.0.0.1"}} |
datetime
是time.Now的别名
1 | Generated by confd {{datetime}} |
1 | Generated by confd {{datetime.Format "Jan 2, 2006 at 3:04pm (MST)"}} |
更多用法,请参阅官方时间用法。
split
包装器 strings.Split。分隔输入的字符串并返回一个子字符串切片。
1 | {{ $url := split (getv "/deis/service") ":" }} |
toUpper
strings.ToUpper的 别名 返回大写字符串。
1 | key: {{toUpper "value"}} |
toLower
strings.ToLower的 别名 。返回小写字符串。
1 | key: {{toLower "Value"}} |
json
返回map[string]interface{}形式的json值。
lookupSRV
net.LookupSRV 包装器 。通过组合net.SRV结构的所有字段按字母顺序对SRV记录进行排序,以减少不必要的配置重新加载。
1 | {{range lookupSRV "mail" "tcp" "example.com"}} |
etcd添加键值
1 | etcdctl set /services/zookeeper/host1 '{"Id":"host1", "IP":"192.168.10.11"}' |
创建模板源
1 | [template] |
创建模板
1 | {{range gets "/services/zookeeper/*"}} |
map遍历
一旦解析了JSON,就可以使用普通的Go模板函数遍历它 index
。
更高级的结构,如下所示:
1 | { |
它可以像这样遍历:
1 | {{$data := json (getv "/test/data/")}} |
jsonArray
从接口返回json数组,例如: [“a”, “b”, “c”]`。
1 | {{range jsonArray (getv "/services/data/")}} |
ls
返回匹配路径的所有子键,字符串等。如果找不到路径,则返回空列表。
1 | {{range ls "/deis/services"}} |
lsdir
返回匹配路径的所有子键,字符串等。注意它只返回也有子键的子键。如果找不到路径,则返回空列表。
1 | {{range lsdir "/deis/services"}} |
dir
返回制定键的父目录。
1 | {{with dir "/services/data/url"}} |
join
strings.Join 函数的别名 。
1 | {{$services := getvs "/services/elasticsearch/*"}} |
replace
strings.place 函数的别名 。
1 | {{$backend := getv "/services/backend/nginx"}} |
lookupIP
net.LookupIP 函数的包装器 。包装器还按字母顺序排序IP地址。这一点至关重要,因为在动态环境中,DNS服务器通常会混淆链接到域名的地址。这将导致不必要的配置重新加载。
1 | {{range lookupIP "some.host.local"}} |
用法
简单实例
1 | etcdctl set /nginx/domain 'example.com' |
输出: /etc/nginx/nginx.conf
1 | worker_processes 2; |
复杂的例子
此示例显示如何使用模板函数的组合来执行嵌套迭代。
到etcd添加键
1 | etcdctl mkdir /services/web/cust1/ |
创建模板源
1 | [template] |
创建模板
1 | {{range $dir := lsdir "/services/web"}} |
输出:/tmp/services.conf
1 | upstream cust1 { |