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

最新文章

  1. STM32之看门狗(独立与窗口)
  2. html中使用js+table 实现分页
  3. Unity3D核心类型一览
  4. ★★★.NET 在meta标签中使用表达式设置页面的关键字
  5. Hadoop2的简单安装
  6. [置顶] ORACLE分析函数(1)
  7. Moutain Tai notes
  8. Linux下Tomcat进行远程调试
  9. java四则运算
  10. redis 在 php 中的应用
  11. Linux 配置SSH 无密钥登陆
  12. JS函数、变量作用域
  13. MT【211】保序同构
  14. C#自动生成XML文件
  15. selenium+python自动化97--unittest参数化(paramunittest)
  16. Python小白学习之路(二十二)—【生成器】
  17. Spring-IOC BeanFactory运行时动态注册bean
  18. 第九章 LinkedBlockingQueue源码解析
  19. jQuery事件篇---基础事件
  20. SqlServer 2008无法远程连接到服务器

热门文章

  1. Effective Java 第三版——56. 为所有已公开的API元素编写文档注释
  2. SNFAutoupdater通用自动升级组件V2.0
  3. 经典的sql语句,将返回结果合并为一个字符串
  4. [svc]runinit管理多进程
  5. 原生AJAX请求教程
  6. swift 遍历枚举
  7. easyradius隆重发布ROS API计费接口,支持ROS 3.3以上版本,实现简单快捷的ROS宽带计费系统云端版
  8. Java8学习笔记(四)--接口增强
  9. 在Android Studio中查看Sqlite的方法
  10. div界面浮动插件