confd 配置文件:
有时候,我们不想在confd启动命令中写很长的参数,那么可以通过 -config-file 来指定配置文件,如果你喜欢将配置文件的位置定义到 /etc/confd/confd.toml ,那么一个参数也不需要,因为,这就是默认搜索的配置文件
一个confd.toml 的示例:
1 2 3 4 5 6 7 8 |
username="root" password="2379" nodes=[ "http://172.16.22.36:2379", ] watch=true prefix="/" basic_auth=true |
一个conf.d/upstream.toml
1 2 3 4 5 6 7 8 9 10 11 |
[template] prefix = "/sa/nginx" src = "upstream.tmpl" dest = "/tmp/upstream.conf" owner = "www" mode = "0644" keys = [ "/upstream", ] check_cmd = "ls {{.src}}" reload_cmd = "cat /tmp/upstream.conf" |
其中:
- prefix 就是要(递归)watch的结点,watch的返回值是变化结点的原值和新值
- keys是当发生更新时从哪些结点获取数据(来渲染模板),这里的结点必然是prefix下的,不能是prefix外部的,所以,如果期望变更不会被立即触发,而是一组变更完成后才被触发,这里是做不到的;比如: 期望同一时间更新多个upstream,而只重启一次nginx,这里做不到;除非自己实现,自己实现也要考虑很多东西,如:模板渲染如何实现?
- watch总是递归的,这个代码中写死的,没得配
- 这里的prefix最好从confd的根开始,不要指望和confd.toml中的prefix拼接使用; 如果 confd.tomal 中的prefix 是 /sa 而upstream.toml 中的prefix是 /nginx, 则-onetime执行时可以看到预期的效果(生成了期望的目标配置文件),但是watch的时候却不能达到预期的效果;非常怀疑这是个bug,因为,confd启动的时候可以渲染出来正确的目标配置文件(参考了confd.toml 中的prefix),后续watch的时候却没有参考confd.toml 中的prefix,所以自然watch不到了:tcpdump部分截图如下:
初始渲染的请求:
watch的请求:
模板文件示例:
1 2 3 4 5 6 7 8 |
{{range $dir := lsdir "/upstream/" -}} upstream {{base $dir}} { {{$custdir := printf "/upstream/%s/servers/*" $dir -}} {{range gets $custdir -}} server {{.Value}}; {{ end }} } {{end}} |
注意:
- 模板中的指令,默认会导致生成的文件中出现多余的空行的,解决办法就是使用 -}}
- 模板中可以构造变量(如:通过printf拼接字符串)
- 参考: https://github.com/kelseyhightower/confd/blob/master/docs/templates.md
watch的实现:
- 查询请求中,wait参数为true就是watch,wait可以指定waitIndex,当然也可以不指定,不指定的话逻辑比较简单,就是有变化就响应;如果指定的waitIndex已经发生过,则直接返回曾经的变化结果(这是历史上指定版本的值,可能不是现在的);如果waitIndex是下下次的版本号,则下次变化将不会被感知到
- wait可以递归也可以不递归,通过参数recursive指定