confd基本使用--Nginx配置自动化

2020-07-27 17:27:52 浏览数 (1)

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

代码语言:javascript复制
[template]
src = "myconfig.conf.tmpl"
dest = "/tmp/myconfig.conf"
keys = [
    "/myapp/database/url",
    "/myapp/database/user",
]

创建模板源文件

模板源文件使用golang文本模板形式。

/etc/confd/templates/myconfig.conf.tmpl

代码语言:javascript复制
[myconfig]
database_url = {{getv "/myapp/database/url"}}
database_user = {{getv "/myapp/database/user"}}

处理模板

confd支持两次操作模式:守护或仅一次。在守护模式下,confd会轮询后端的修改并在必要时对目的配置文件进行更新。

由于confd支持很多后端模式,当前仅示例file和redis。

file

需先创建数据源文件。

myapp.yaml

代码语言:javascript复制
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。

结果

  1. consul中存储的数据
代码语言:javascript复制
➜  ~ 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
  1. 生成的配置文件数据

/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相关,进行可视化配置~~~

0 人点赞