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

confd的更多相关文章

  1. 使用etcd+confd管理nginx配置

    1.前言 最近在项目中用nginx做反向代理,需要动态生成nginx的配置.大概流程是用户在页面上新增域名.http或https协议以及端口信息,后台会根据域名自动生成一个nginx的server配置 ...

  2. 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务

    基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...

  3. Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现

    前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...

  4. confd+etcd实现高可用自动发现

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

  5. confd template src格式和 templates 语法

    Template Resources Template resources are written in TOML and define a single template resource. Tem ...

  6. Etcd+Confd实现Nginx配置文件自动管理

    一.需求 我们使用Nginx做七层负载均衡,后端是Tomcat.项目采用灰度发布方式,每次项目升级,都要手动先从Nginx下摘掉一组,然后再升级这组,当项目快速迭代时,手动做这些操作显然会增加部署时间 ...

  7. confd动态生成配置文件

    下载安装confd $ mkdir -p $GOPATH/src/github.com/kelseyhightower $ git clone https://github.com/kelseyhig ...

  8. 【Docker】基于docker+etcd+confd + haproxy构建高可用、自发现的web服务

    各个工具介绍 (1)Docker:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux机器上,也可以实现虚拟化,docker ...

  9. confd test

    vi /etc/confd/confd.toml backend = "consul"confdir = "/etc/confd"log-level = &qu ...

随机推荐

  1. C#:网络传输问题

    1.Http Post Header 中文数据值,服务端接收Header 中文数据值乱码问题: 客户端:    Encoding utf8Encoding = Encoding.GetEncoding ...

  2. 【转载】Mysql load data infile用法(万级数据导入,在几秒之内)

    https://blog.csdn.net/u014082714/article/details/53173975 http://blog.itpub.net/26506993/viewspace-2 ...

  3. export / import 温故而知新

    认知一: 导出的对象被修改,依然会影响原来的对象. 仔细想想这是理所当然的事(说明导出的依然是对象指向内存的地址,所以通常还需要结合深拷贝使用) /** export const state = { ...

  4. 揭开Redis的神秘面纱

    本篇博文将为你解开Redis的神秘面纱,通过阅读本篇博文你将了解到以下内容: 什么是Redis? 为什么选择 Redis? 什么场景下用Redis? Redis 支持哪些语言? Redis下载 Red ...

  5. Atitit 医学之道 attilax总结

    Atitit 医学之道 attilax总结 1. 相关的学科3 1.1. 口腔医学  ok3 1.2. 人体解剖学  ok3 1.3. 生理学  ok3 1.4. 病理学  ok3 1.5. 骨伤科学 ...

  6. rsync安装及部署

    一.服务器端1.yum -y install rsync xinetd 2.vi /etc/xinetd.d/rsync 将yes 修改为no IPV6修改为IPV4 3.vi /etc/rsyncd ...

  7. Guava Lists.transform踩坑小记<转>

    1.问题提出 1.前段时间在项目中用到Lists.transform返回的List,在对该list修改后发现修改并没有反映在结果里,研究源码后发现问题还挺大.下面通过单步调试的结果来查看Guava L ...

  8. 从git上check out指定的文件夹至本地

    当项目过大时,从服务器上拉取项目是件很头疼的事情,那么就说说怎么只拉区某个或几个文件夹至本地. git clone -n git@172.0.0.10:test/test_platform.git c ...

  9. const读书笔记

    Const 的使用读书笔记 Const的主要主要用法有: 常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名  常对象: 类名 const 对象名 常成员函数 ...

  10. Java8学习笔记(九)--日期/时间(Date Time)API指南

    Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容 ...