confd可监听多种数据源,并根据模板生成相应的指定的文件。
【这篇博客没啥技术含量,基本就是官方文档quick-start的翻译版】地址见简介~
简介
confd
是一个轻量配置管理工具,他的主要关注点:
- 保持本地配置文件与存储在etcd,consul,dynamodb,redis,vault,zookeeper,aws ssm parameter store 或 env vars中的数据一致(最新),并处理模板资源。
- 重新加载应用程序以获取新的配置文件更改。
快速开始
可参见:quick-start-guide
基本参数查看:confd -h
创建配置文件目录(confdir)
代码语言:javascript复制sudo mkdir -p /etc/confd/{conf.d,templates}
创建模板资源配置文件
模板资源使用TOML
配置,并放置在confdir
下面。
/etc/confd/conf.d/myconfig.toml
[template]
src = "myconfig.conf.tmpl"
dest = "/tmp/myconfig.conf"
keys = [
"/myapp/database/url",
"/myapp/database/user",
]
创建模板源文件
模板源文件使用golang文本模板形式。
/etc/confd/templates/myconfig.conf.tmpl
[myconfig]
database_url = {{getv "/myapp/database/url"}}
database_user = {{getv "/myapp/database/user"}}
处理模板
confd支持两次操作模式:守护或仅一次。在守护模式下,confd会轮询后端的修改并在必要时对目的配置文件进行更新。
由于confd支持很多后端模式,当前仅示例file和redis。
file
需先创建数据源文件。
myapp.yaml
myapp:
database:
url: db.example.com
user: rob
启动confd,指定后端(backend)为file, 并仅做一次同步,并且指定资源文件为myapp.yaml。
代码语言:javascript复制confd -onetime -backend file -f myapp.yaml
redis
需设置Redis初始化数据
代码语言:javascript复制redis-cli set /myapp/database/url db.example.com
redis-cli set /myapp/database/user rob
启动confd,并指定后端为redis, 并指定-interval 为2秒间隔轮询。
代码语言:javascript复制confd -interval 2 -backend redis -node 127.0.0.1:6379
Nginx配置示例
在这个示例中,我们将使用同一个模板来管理两个nginx配置文件。
增加keys值
etcd
代码语言:javascript复制etcdctl set /myapp/subdomain myapp
etcdctl set /myapp/upstream/app2 "10.0.1.100:80"
etcdctl set /myapp/upstream/app1 "10.0.1.101:80"
etcdctl set /yourapp/subdomain yourapp
etcdctl set /yourapp/upstream/app2 "10.0.1.102:80"
etcdctl set /yourapp/upstream/app1 "10.0.1.103:80"
创建模板资源
/etc/confd/conf.d/myapp-nginx.toml
代码语言:javascript复制[template]
prefix = "/myapp"
src = "nginx.tmpl"
dest = "/tmp/myapp.conf"
owner = "nginx"
mode = "0644"
keys = [
"/subdomain",
"/upstream",
]
check_cmd = "/usr/sbin/nginx -t -c {{.src}}"
reload_cmd = "/usr/sbin/service nginx reload"
/etc/confd/conf.d/yourapp-nginx.toml
代码语言:javascript复制[template]
prefix = "/yourapp"
src = "nginx.tmpl"
dest = "/tmp/yourapp.conf"
owner = "nginx"
mode = "0644"
keys = [
"/subdomain",
"/upstream",
]
check_cmd = "/usr/sbin/nginx -t -c {{.src}}"
reload_cmd = "/usr/sbin/service nginx reload"
创建资源模板
/etc/confd/templates/nginx.tmpl
代码语言:javascript复制upstream {{getv "/subdomain"}} {
{{range getvs "/upstream/*"}}
server {{.}};
{{end}}
}
server {
server_name {{getv "/subdomain"}}.example.com;
location / {
proxy_pass http://{{getv "/subdomain"}};
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
**Remember: **
- check first reload last.
- check_cmd 和 reload_cmd 算是confd提供的两个回调配置,当后端数据更新后,会先执行check,没问题的话再执行reload。
结果
- consul中存储的数据
➜ ~ consul kv get -recurse
myapp/database/url:db.example.com
myapp/database/user:rob
myapp/subdomain:myapp
myapp/upstream/app1:10.0.1.100:80
myapp/upstream/app2:10.0.1.101:80
yourapp/subdomain:yourapp
yourapp/upstream/app1:10.0.1.102:80
yourapp/upstream/app2:10.0.1.103:80
- 生成的配置文件数据
/tmp/myapp.conf
代码语言:javascript复制➜ /tmp cat myapp.conf
upstream myapp {
server 10.0.1.100:80;
server 10.0.1.101:80;
}
server {
server_name myapp.example.com;
location / {
proxy_pass http://myapp;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
延伸
后续可增加Web相关,进行可视化配置~~~