配置管理工具-Confd

1 简介

1.1 Confd介绍

Confd是一个轻量级的配置管理工具。通过查询后端存储,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。对应的后端存储可以是etcd,redis、zookeeper等。[1]

通过上面的介绍可以看出,通过confd修改配置的前提是,被修改配置的服务需要支持热加载配置,如nginx等。这样才能实现在配置变更时自动reload。

1.2 Conf的作用

随着上线的服务越来越多,配置文件和配置项越来越复杂,管理和变更维护配置文件逐渐成为一件麻烦的事情。

在这时候,就需要一套集中化的配置文件管理系统。一方面实现配置文件的统一管理,版本回溯,另一方面提供配置文件的批量自动下发,以及动态加载重启服务。confd+etcd可以作为解决上述问题的一种思路。

本文主要介绍如何使用etcd作为后端存储,通过confd动态修改nginx的配置文件。

2 安装Confd

官网下载confd并安装[2]

复制代码
root@ceph-1:~# wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64

创建confd目录,confd主要有两个核心的目录

  • conf.d:主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。

  • templates:配置模板Template,即基于不同组件的配置,修改为符合 Golang text templates的模板文件。

    root@ceph-1:~# mkdir -p /etc/confd/{conf.d,templates}

3 配置Confd

3.1 创建confd模板文件

下面介绍一下什么是confd的模板文件[3]

  • Template定义了单一应用配置的模板,默认存储在/etc/confd/templates目录下,模板文件符合Go的text/template格式。
  • 模板文件常用函数有base,get,gets,lsdir,json等。

下面例子的逻辑是定义一个名为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

3.2 创建confd配置文件

配置文件是TOML格式的文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。默认目录在/etc/confd/conf.d。[3]

必要参数包括

  • dest:目标文件(字符串类型)
  • keys :键数组(字符串数组)
  • src :配置模板的相对路径(字符串)

可选参数包括

  • gid:应该拥有该文件的gid。默认为有效的gid(整数)

  • mode:文件的权限模式(字符串)

  • uid:应该拥有该文件的uid。默认为有效的uid(整数)

  • reload_cmd:重新加载配置的命令(字符串)

  • check_cmd:检查配置的命令(字符串)

  • prefix:键前缀的字符串(字符串)

    root@ceph-1:~# cat /etc/confd/conf.d/myapp-nginx.toml

3.3 etcd中创建好变量相关的键值对

因为我们是使用的etcd作为confd的后端存储,因此要先在etcd中定义好先前模板文件中的变量的键值对。

复制代码
root@ceph-1:~# etcdctl put /nginx/root_dir '/usr/share/nginx/v1' --endpoints=192.168.85.130:2379

3.4 启动confd

配置使用systemd管理confd并启动confd

复制代码
root@ceph-1:~# cat /etc/confd/confd.toml  ##创建配置文件,指定后端存储为etcd

4 热更新nginx配置文件实验

4.1 为nginx创建两个版本的index页面

创建v1、v2两个目录,分别用来存放不同的两个nginx配置文件

复制代码
root@ceph-1:~# mkdir /usr/share/nginx/{v1,v2}

新建两个index文件

复制代码
root@ceph-4:~# cat /usr/share/nginx/v1/index.html

4.2 访问nginx

复制代码
root@ceph-4:~# curl 127.0.0.1  ##可以看到能正常访问到v1下面的index文件

4.3 更新etcd中的/nginx/root_dir值

将/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请求头修改方法

相关推荐
国冶机电安装10 分钟前
电气安全保护装置:从设计选型到安装验收的全流程解析
服务器·网络·安全
夫礼者14 分钟前
【极简监控】不骗篇幅!7个零运维成本的排障“微操”,让线上问题彻底左移
java·运维·监控
开开心心就好17 分钟前
进程启动瞬间暂停工具,适合调试多开
linux·运维·安全·pdf·智能音箱·智能手表·1024程序员节
祭曦念26 分钟前
MySQL基础运维:日志基础之慢查询日志与错误日志 | 作用、配置与查看方法全实战
运维·mysql·adb
win x34 分钟前
一篇搞懂Git基础操作
linux·git
吴声子夜歌43 分钟前
TypeScript——内置工具类型、类型查询、类型断言和类型细化
linux·ubuntu·typescript
刚入门的大一新生1 小时前
Linux-Linux基础指令2
linux·运维·服务器
liulilittle1 小时前
TC Hairpin NAT 驱动使用手册(个人版)
服务器·开发语言·网络·c++·网络协议·tcp/ip·tc
是店小二呀1 小时前
Docker部署EasyNode+内网穿透:轻松实现服务器远程管理
服务器·docker·容器
一招定胜负1 小时前
在 Windows 11 家庭版安装 Docker Desktop解决虚拟化问题
运维·docker·容器