consul-template官方文档:consul-template
consul-template说明
Consul Template 提供一个方便的方式从Consul获取数据通过consul-template的后台程序保存到文件系统。
这个后台进程可以实时监听consul示例的变化,并动态更新对应的信息到对应的文件系统。
consul template和consul一样,也是一个二进制文件,可以从 官网下载对应的版本。
linux系统中可以把对应的二进制包放入到系统的PATH环境变量中。
consul-template的实际应用
会以实例说明consul template的应用,在实例中会介绍consul template的语法特性!
有如下consul集群: 【有关consul的简单应用、集群搭建、服务注册与发现、键值管理:CLICK HERE】
[root@test1 nameservice]# consul members
Node Address Status Type Build Protocol DC Segment
test1 10.9.8.26:8301 alive server 1.7.0 2 local_ds <all>
test2 10.9.8.25:8301 alive server 1.7.0 2 local_ds <all>
test3 10.9.8.24:8301 alive server 1.7.0 2 local_ds <all>
clent1 10.9.8.23:8301 alive client 1.7.0 2 local_ds <default>
[root@test1 nameservice]# consul operator raft list-peers
Node ID Address State Voter RaftProtocol
test2 a7f2c8ef-21ec-f544-8eac-ededfd9a0f48 10.9.8.25:8300 follower true 3
test1 99de144d-82dd-22e7-11bb-1c7e1fcfe3c4 10.9.8.26:8300 follower true 3
test3 f501a2ab-2719-dd76-2768-fafd9bb40573 10.9.8.24:8300 leader true 3
使用consul template模板化consul注册的服务
查找出当前consul中注册的服务信息:
[root@test3 nameservice]# consul catalog services
consul
min-kline
min-redis
查找出当前consul中注册的kv信息:
[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/?keys
["redis/config/connections","stock/db/kline_info","wm/memory/redis_info"]
consul模板语法用法
现有如下模板:
# 显示数据中心
{{ datacenters }}
# file的用法,会把文件中的内容读取到输出的文件中
{{ file "/data/nameservice/template/consul.txt" }}
# 查询指定的key值,key值后面可以加上 @数据中心 指定查询某个中心的key值
# 若是不加,则指向当前数据中心
{{ key "stock/db/kline_info" }}
# {{ key "stock/db/kline_info@local_ds" }}
# 查询key值是否存在,值存在的话会返回一个true,否则返回false
{{ keyExists "wm/memory/redis_info1" }}
# 可以放入if语句中,做流程选择
{{ if keyExists "wm/memory/redis_info" }}
{{ key "stock/db/kline_info" }}
{{ else }}
{"host":"10.9.8.24", "port":"3309"}
{{ end }}
# 查询consul中指定的值,如果key不存在则返回默认值
{{ keyOrDefault "stock/db/deal_info" "None" }}
# ls返回kv键值对,注意这里的ls后面的路径要在键值对的上一层
{{ range ls "wm/memory" }}
{{ .Key }}: {{ .Value }}{{ end }}
{{ range ls "redis/config/connections" }}
{{ .Key }}: {{ .Value }}{{ end }}
# 查询节点
{{ with node "test1" }}
{{ .Node.Address }} {{ .Node.ID }} {{ end }}
# 查询所有的node, 忽略指定的数据中心,则指向本地
{{ range nodes "@local_ds"}}
{{ .Address }} {{ end }}
# 查询consul中的所有服务
{{ range services }}
{{ .Name }}
{{ end }}
然后使用consul template执行如下命令:
consul-template -consul-addr=10.9.8.25:8500 -template "test.hcl:test.out" -once
-consul-addr: 指定consul集群的ip,
-template: 指定使用的模板文件,和输出的文件名
-once: consul-template是在后运行的,此参数指定consul-template运行一次就停止
执行结构如下:
# 显示数据中心
[local_ds]
# file的用法,会把文件中的内容读取到输出的文件中
consul version
# 查询指定的key值,key值后面可以加上 @数据中心 指定查询某个中心的key值
# 若是不加,则指向当前数据中心
{
"user": "klineread",
"host": "10.9.68.41",
"port": "3306",
"password": "1234qwer",
"db": "klinedb"
}
# {
"user": "klineread",
"host": "10.9.68.41",
"port": "3306",
"password": "1234qwer",
"db": "klinedb"
}
# 查询key值是否存在,值存在的话会返回一个true,否则返回false
false
# 可以放入if语句中,做流程选择
{
"user": "klineread",
"host": "10.9.68.41",
"port": "3306",
"password": "1234qwer",
"db": "klinedb"
}
# 查询consul中指定的值,如果key不存在则返回默认值
None
# ls返回kv键值对,注意这里的ls后面的路径要在键值对的上一层
redis_info: {
"sentinel_host": ["10.9.68.41", "10.9.68.33"],
"password": "123456",
"mymaster": "mymaster"
}
# 查询节点
10.9.8.26 99de144d-82dd-22e7-11bb-1c7e1fcfe3c4
# 查询所有的node, 忽略指定的数据中心,则指向本地
10.9.8.23
10.9.8.26
10.9.8.25
10.9.8.24
# 查询consul中的所有服务
consul
min-kline
min-redis
services模板用法
说明:下面不在列出执行过程,只写出对应模板语法及结果展示:
- 查询所有服务
{{ services }} # {{ services “@local_ds”}} 不指定数据中心,默认为当前数据中心
result
[0xc0001a0090 0xc0001a00c0 0xc0001a00f0]
- 得出服务具体信息:
{{ range services }}
{{ .Name }}
{{ end }}
result
consul
min-kline
min-redis
- 列出指定目录下的键值对:
{{ range tree “stock/db/” }}
{{ .Key }}:{{ .Value }} {{ end }}
result
kline_info:{
"user": "klineread",
"host": "10.9.68.41",
"port": "3306",
"password": "1234qwer",
"db": "klinedb"
}
- 根据kv值创建映射
首先向集群中添加几个kv值。
[root@test1 nameservice]# consul kv put redis/config/maxmemory 4G
Success! Data written to: redis/config/maxmemory
[root@test1 nameservice]# consul kv put redis/config/timeout 60
Success! Data written to: redis/config/timeout
[root@test1 nameservice]# consul kv put redis/config/requirepass 12345
Success! Data written to: redis/config/requirepass
[root@test1 nameservice]# curl 10.9.8.25:8500/v1/kv/redis/config/?keys
["redis/config/connections","redis/config/maxmemory","redis/config/requirepass","redis/config/timeout"][root@test1 nameservice]#
有如下consul template模板:
{{ range $key, $pairs := tree “redis” | byKey }}{{ $key }}: {{ range
$pair := $pairs }} {{ .Key }}={{ .Value }} {{ end }}{{ end }}
result
config:
connections=5
maxmemory=4G
requirepass=12345
timeout=60
- value是json字符
在这种情况下key对应的values是一个字符串,还有一种情况是key对应values是一个json字符串,下面一个实例是对values是json的情况进行解析!
[root@test1 nameservice]# consul kv get stock/db/kline_info
{
"user": "klineread",
"host": "10.9.68.41",
"port": "3306",
"password": "1234qwer",
"db": "klinedb"
}
模板如下:
[stock_kline_dbinfo]
{{ range $k, $v := key "stock/db/kline_info" | parseJSON }}{{ $k }}={{ $v }}
{{ end }}
result
[stock_kline_dbinfo]
db=klinedb
host=10.9.68.41
password=1234qwer
port=3306
user=klineread
consul-template的语法还有很多,以上只是基本的应用。更加详细的语法请关注官网实例,在学习过程中发现一些blog中的语法会报错,应该是因为consul-template版本更新导致!
consul-template