Confd是一个轻量级的配置管理工具。通过查询后端存储,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。对应的后端存储可以是etcd,redis、zookeeper等。[1]
通过上面的介绍可以看出,通过confd修改配置的前提是,被修改配置的服务需要支持热加载配置,如nginx等。这样才能实现在配置变更时自动reload。
随着上线的服务越来越多,配置文件和配置项越来越复杂,管理和变更维护配置文件逐渐成为一件麻烦的事情。
在这时候,就需要一套集中化的配置文件管理系统。一方面实现配置文件的统一管理,版本回溯,另一方面提供配置文件的批量自动下发,以及动态加载重启服务。confd+etcd可以作为解决上述问题的一种思路。
本文主要介绍如何使用etcd作为后端存储,通过confd动态修改nginx的配置文件。
官网下载confd并安装[2]
root@ceph-1:~# wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
创建confd目录,confd主要有两个核心的目录
root@ceph-1:~# mkdir -p /etc/confd/{conf.d,templates}
3 配置Confd
下面介绍一下什么是confd的模板文件[3]
下面例子的逻辑是定义一个名为nginx.tmpl的模板文件。使用getv获取root_dir这个变量的值,来动态更新nginx的root文件目录,如果root_dir这个key不存在,则默认值为/usr/share/nginx/html。root_dir变量我们在后面定义。
root@ceph-1:~# cat /etc/confd/templates/nginx.tmpl
配置文件是TOML格式的文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。默认目录在/etc/confd/conf.d。[3]
必要参数包括
可选参数包括
root@ceph-1:~# cat /etc/confd/conf.d/myapp-nginx.toml
因为我们是使用的etcd作为confd的后端存储,因此要先在etcd中定义好先前模板文件中的变量的键值对。
root@ceph-1:~# etcdctl put /nginx/root_dir '/usr/share/nginx/v1' --endpoints=192.168.85.130:2379
配置使用systemd管理confd并启动confd
root@ceph-1:~# cat /etc/confd/confd.toml ##创建配置文件,指定后端存储为etcd
4 热更新nginx配置文件实验
创建v1、v2两个目录,分别用来存放不同的两个nginx配置文件
root@ceph-1:~# mkdir /usr/share/nginx/{v1,v2}
新建两个index文件
root@ceph-4:~# cat /usr/share/nginx/v1/index.html
root@ceph-4:~# curl 127.0.0.1 ##可以看到能正常访问到v1下面的index文件
将/nginx/root_dir的值更新为/usr/share/nginx/v2
root@ceph-1:~# etcdctl put /nginx/root_dir '/usr/share/nginx/v2' --endpoints=192.168.85.130:2379
查看confd的日志,可以观察到有配置文件更新的动作
root@ceph-1:~# journalctl -u confd
检查nginx配置是否已更新
root@ceph-1:~# cat /etc/nginx/conf.d/myapp.conf
5 参考资料
关注公众号 singless,获取更多有价值的文章
你可能还喜欢
如何在prometheus产生告警时自动执行某个脚本文件
如何编译打包OpenSSH 9.4并实现批量升级
K8S使用开源CEPH作为后端StorageClass
Nginx安全加固,版本隐藏及HTTP请求头修改方法