Consul Template 动态配置
Consul Template(CT)是 HashiCorp 的模板渲染工具:持续监听 Consul 中 KV 与服务的变化,变化时重新渲染本地模板文件,并可执行一条命令收尾(如 reload Nginx),实现配置随注册中心自动更新。
安装
CT 与 Consul 一样是单二进制,下载解压放进 PATH:
wget https://releases.hashicorp.com/consul-template/0.37.5/consul-template_0.37.5_linux_amd64.zip
unzip consul-template_0.37.5_linux_amd64.zip
sudo mv consul-template /usr/local/bin/
consul-template -version
# 输出:consul-template v0.37.5
配置文件
consul-template 命令的配置文件描述三件事:模板源、渲染目标、渲染后要执行的命令:
template {
source = "/etc/ct/web.conf.ctmpl" # 模板源文件
destination = "/etc/nginx/conf.d/web.conf" # 渲染输出文件
command = "nginx -s reload" # 渲染成功后执行
}
consul-template -config=ct.hcl
# 输出:Consul Template is listening for Consul changes...
# 进程常驻前台,持续监听 KV 与服务变化,Ctrl+C 停止
模板语法示例
模板用 Go 模板语法:{{ key "路径" }} 取 KV 值,range 遍历健康服务实例:
# 读取 KV:动态端口(web/port 的值会替换到这里)
listen {{ key "web/port" }};
# 遍历 api 服务的健康实例
{{ range service "api" }}
server {{ .Address }}:{{ .Port }};
{{ end }}
{{ key "app/port" }} 指定的键不存在、或模板语法有误时,CT 会拒绝渲染并在日志报错,目标文件保持旧内容不更新。改完模板要让 CT 重载或重启才生效。
典型场景:动态生成 Nginx 上游
api 服务每上线一个新实例,Nginx 上游就自动多一行并 reload,扩容缩容零人工:
upstream api_backend {
{{ range service "api" }}
server {{ .Address }}:{{ .Port }};
{{ end }}
}
consul-template -config=nginx.hcl
# api 扩容后无需任何人工操作:web.conf 已更新,nginx -s reload 已自动执行
使用注意
CT 是常驻进程,生产用 systemd 托管并设置开机自启;模板语法错误或 Consul 暂时不可达时渲染会失败,需关注它的日志。CT 只负责"渲染+执行命令",逻辑应尽量保持简单,复杂变更交给配置管理系统。
小结
Consul Template 把 Consul 变成配置变更的源头:KV 或服务一变,模板重渲染、命令自动执行,Nginx/HAProxy 类配置实现真正的配置热更新,适合不想在业务代码里接配置中心的场景。