调查了consul-template事件触发器
简单来说,consul-template是一个能够检测到consul的不同事件,并且能够自动执行“模板更新”和“任意命令”的工具。
这次想实现的是以consul-kvs的变更为触发条件来执行某些操作。
一开始对consul-template的触发条件不太清楚,但在仔细查看文档后,发现相关规范已经记录下来了,我会做个备忘。
你是根据什么条件来观看的?
在读取模板时似乎是在检查使用的值是否已经更改。
太棒了。(※有一些例外)
例:如果要监控KVS的键的值
只需要按照以下的模板引用键。
只需使用以下模板引用键即可。
update hogekey > {{ key "/hogekey" }}
用类似这样的方式来执行 consul-template…
consul-template -consul xxx.xxx.xxx.xxx:8500 -template "/tmp/in_watch_key.tmpl:/tmp/out_watch_key.tmpl:cat /tmp/out_watch_key.tmpl"
当更改kvs时,会显示如下内容(仅在值确实发生更改时触发)。
# kvsへput
curl -XPUT -d 'blahblahblah' http://xxxxxxx:8500/v1/kv/hogekey
# consul-template側
...
update hogekey > blahblahblah
API参考资料
此外,还要提及有哪些API的定义。参见链接:https://github.com/hashicorp/consul-template#api-functions
数据中心
显示目录中的所有数据中心(无触发事件)。
{{datacenters}}
文件
监视/触发代理端的本地文件更改(显示正在查看内容的状态)。
我暂时想不到使用案例…
另外,如果在启动consul-template时文件不存在,会导致错误。
{{file "/path/to/local/file"}}
关键
监视/触发KVS的键值。
{{key "service/redis/maxconns"}}
# データセンター指定版
{{key "service/redis/maxconns@east-aws"}}
列出文件和文件夹。
监视并触发以kvs指定的前缀作为顶级的所有键值。
{{range ls "service/redis"}}
{{.Key}} {{.Value}}{{end}}
对于上述情况,我们将监视”service/redis/*”层级下的键值变更。
节点
监视/触发目录中的所有节点。
{{nodes}}
# データセンター指定版
{{nodes "@east-aws"}}
服务
对指定的服务组进行监视和触发。
# webappサービスを表示
{{service "webapp"}}
# rangeでは []*Service 構造体を返す
{{range service "webapp@datacenter"}}
server {{.Name}} {{.Address}}:{{.Port}}{{end}}
# デフォルトではヘルシーなサービス情報のみ表示するが、ステータスを指定して表示も可能
# ステータス関係なくすべてのサービスを表示
{{service "webapp" "any"}}
# ステータス=passing のサービスを表示
{{service "webapp" "passing"}}
# ステータス=passing or warning or critical のサービスを表示
{{service "webapp" "passing, warning, critical"}}
服务
展示目录中的所有服务(尚未确认服务更改时的事件触发)。
{{services}}
# データセンター指定版
{{services "@east-aws"}}
# rangeで取ると、サービスの構造体でデータ参照することが出来ます
# see. http://www.consul.io/docs/agent/services.html
{{range services}}
{{.Name}}
{{range .Tags}}
{{.}}{{end}}
{{end}}
树
监视/触发指定前缀以下的KVS中的所有键值。
{{range tree "service/redis"}}
{{.Key}} {{.Value}}{{end}}
在这种情况下,我们会监视”service/redis/*”及其子目录下的键值变化。
補充:ls和tree的不同之处。
因为在阅读文件的时候,我对其实际形象没有太清晰的概念,所以我决定亲自操作并进行尝试。
我认为,可以将ls和tree想象成原汁原味的Unix命令。
ls仅针对指定层级,而tree则针对指定层级及以下的所有内容。
Example: 列出文件
以下是在指定”service/redis”时的行为。
# NG: 指定したキーそのものを更新しても発火しません
curl -XPUT -d 'data' http://localhost:8500/v1/kv/service/redis
# OK: 配下のキーが増えた時
curl -XPUT -d 'xxx.xxx.xxx.xxx' http://localhost:8500/v1/kv/service/redis/node1
# OK: 配下のキーの値を更新した時
curl -XPUT -d 'yyy.yyy.yyy.yyy' http://localhost:8500/v1/kv/service/redis/node1
# NG: 階層を超えて増やしても発火しません
curl -XPUT -d 'aaa.aaa.aaa.aaa' http://localhost:8500/v1/kv/service/redis/node0/master
# NG: 深い階層のキーの値を更新しても発火しません
curl -XPUT -d 'bbb.bbb.bbb.bbb' http://localhost:8500/v1/kv/service/redis/node0/master
例子:树
以下是当指定服务为”service/redis”时的行为。
# NG: 指定したキーそのものを更新しても発火しません
curl -XPUT -d 'data' http://localhost:8500/v1/kv/service/redis
# OK: 配下のキーが増えた時
curl -XPUT -d 'xxx.xxx.xxx.xxx' http://localhost:8500/v1/kv/service/redis/node1
# OK: 配下のキーの値を更新した時
curl -XPUT -d 'yyy.yyy.yyy.yyy' http://localhost:8500/v1/kv/service/redis/node1
# OK: 階層を超えて増えた時
curl -XPUT -d 'aaa.aaa.aaa.aaa' http://localhost:8500/v1/kv/service/redis/node0/master
# OK: 深い階層のキーの値を更新した時
curl -XPUT -d 'bbb.bbb.bbb.bbb' http://localhost:8500/v1/kv/service/redis/node0/master
总结
consul-template太方便了,简直太棒了。