当前位置: 首页 > 工具软件 > Confd > 使用案例 >

confd_confd

冯元魁
2023-12-01

1.下载安装confd

]# wget https://github.com/kelseyhightower/confd/releases/download/v0.15.0/confd-0.15.0-linux-amd64

]# mkdir -p /opt/confd/bin

]# mv confd-0.15.0-linux-amd64 /opt/confd/bin/confd

]# chmod +x /opt/confd/bin/confd

]# export PATH="$PATH:/opt/confd/bin"

为了方便,我一般将confd直接安装到/sbin中

2.创建confd配置目录

]# mkdir -p /etc/confd/{conf.d,templates}

目录结构如下:

├── confd

│   ├── conf.d

│   │   └── haproxy.toml

│   ├── confd.toml

│   └── templates

│       └── haproxy.cfg.tmpl

conf.d 目录中是应用的配置文件定义

templates 目录中是应用的模版文件

confd.toml 是confd本身的配置文件

3.confd本身的配置文件

]# cat /etc/confd/confd.toml

backend = "etcd"

confdir = "/etc/confd"

log-level = "debug"

interval = 60

nodes = [

"http://10.1.1.1:2379",

"http://10.1.1.2:2379",

"http://10.1.1.3:2379",

]

prefix = "/production"

scheme = "https"

配置很简单明了

backend 后端类型,默认etcd

confdir confd的配置文件目录,默认/etc/confd

interval confd向后端轮询的周期,单位”秒“,默认600秒

log-level 日志详细等级,默认“info”

node 后端节点地址

prefix 访问key的前缀,默认是“/”

scheme  访问后端的URI scheme ,可以是"http"或"https"

更多配置项,自行参考confd的github文档。

3.创建confd启动文件

]# cat /etc/systemd/system/confd.service

[Unit]

Description=Confd

After=haproxy.service

[Service]

ExecStart=/sbin/confd

Restart=always

[Install]

WantedBy=basic.target

]# systemctl enable /etc/systemd/system/confd.service

]# systemctl start /etc/systemd/system/confd.service

]# journalctl -f -u confd.service

4.创建haproxy的应用配置定义

]# cat /etc/confd/conf.d/haproxy.toml

[template]

src = "haproxy.cfg.tmpl"

dest = "/etc/haproxy/haproxy.cfg"

keys = [

"/app/your_awesome_app"

]

reload_cmd = "echo restarting && /usr/bin/systemctl reload haproxy"

src 定义了模板文件

dest 定义了用模版生成的配置文件

keys 是我们要监控的etcd中的key

reload_cmd 是生成confd生成新的配置以后的动作

5.创建haproxy的模板文件

]# cat /etc/confd/templates/haproxy.cfg.tmpl)

global

log 127.0.0.1    local0

log 127.0.0.1    local1 notice

maxconn 4096

user haproxy

group haproxy

daemon

stats socket /var/run/haproxy.sock mode 600 level admin

defaults

log    global

mode    http

option    httplog

option    dontlognull

retries    3

option redispatch

maxconn    2000

contimeout    5000

clitimeout    50000

srvtimeout    50000

option forwardfor

option http-server-close

frontend stats

bind *:8888

stats enable

stats uri /

frontend http-in

bind *:80

default_backend application-backend

backend application-backend

balance leastconn

option httpclose

option forwardfor

cookie JSESSIONID prefix

{{range getvs "/app/your_awesome_app*"}}

server {{.}} cookie A check

{{end}}

backend app

balance     roundrobin

{{range gets "/app/servers/*"}}

server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2

{{end}}

6.confd模板相关

6.1 模板内内嵌的语法支持,全部需要加{{}}来标记。

6.2 在模板文件内, . 代表了当前变量,即在非循环体内,.就代表了传入的那个变量。

6.3 模板内的变量定义方法:  {{$variable := value}},例如{{$username := "jhon"}}

假设我们定义了一个结构体:

type Article struct {

ArticleId int

ArticleContent string

那么我们在模板内可以通过.ArticleContent和.ArticleId的方式来获取并把变量的内容渲染到模板内。

{{.ArticleContent}}{{.ArticleId}}

6.4 with语句创建一个封闭的作用域,在其范围内,可以使用.action,而与外面的.无关,只与with的参数有关:

{{ with arg }}

此时的点 . 就是arg

{{ end }}

6.5 循环依靠range语句

{{range gets "/services/zookeeper/*"}}

{{$data := json .Value}}

id: {{$data.Id}}

ip: {{$data.IP}}

{{end}}

6.6 如果取回的值是json格式的,可以创建一个map

例如: etcdctl set /myapp/upstream/app1 '{"IP": "99.99.99.99","NAME": "jhon"}'

{{with get "/myapp/upstream/app1"}}

key: {{base .Key}}

{{$data := json .Value}}

Ipaddress: {{$data.IP}} Username: {{$data.NAME}}

{{end}}

6.7 confd一些常用的函数

get 返回匹配的“键-值”对

gets 返回所有匹配的“键-值”对

getv 返回匹配“键”的“值”

getvs 返回所有匹配“键”的“值”

ls 返回指定路径下的所有子键

lsdir 返回指定路径下所有具有子目录的子键

dir 返回指定“键”的父目录

exist 检查指定的“键”是否存在

base 返回路径的最后一个元素

另有一些go函数的别名,具体用法看文档

join

split

replace

toUpper

toLower

getenv

datatime

参考文档:

https://github.com/kelseyhightower/confd/blob/master/docs/templates.md

https://seanmcgary.com/posts/automatically-scale-haproxy-with-confd-and-etcd/

https://www.jianshu.com/p/05671bab2357

https://www.cnblogs.com/iamdoufu/p/4533063.html

 类似资料:

相关阅读

相关文章

相关问答