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 类配置实现真正的配置热更新,适合不想在业务代码里接配置中心的场景。

笔记加载中…