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
- 使用etcd+confd管理nginx配置
1.前言 最近在项目中用nginx做反向代理,需要动态生成nginx的配置.大概流程是用户在页面上新增域名.http或https协议以及端口信息,后台会根据域名自动生成一个nginx的server配置 ...
- 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...
- confd+etcd实现高可用自动发现
Confd是什么 Confd是一个轻量级的配置管理工具. 通过查询后端存储,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload. 对应的后端存储可以是etcd,redi ...
- confd template src格式和 templates 语法
Template Resources Template resources are written in TOML and define a single template resource. Tem ...
- Etcd+Confd实现Nginx配置文件自动管理
一.需求 我们使用Nginx做七层负载均衡,后端是Tomcat.项目采用灰度发布方式,每次项目升级,都要手动先从Nginx下摘掉一组,然后再升级这组,当项目快速迭代时,手动做这些操作显然会增加部署时间 ...
- confd动态生成配置文件
下载安装confd $ mkdir -p $GOPATH/src/github.com/kelseyhightower $ git clone https://github.com/kelseyhig ...
- 【Docker】基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
各个工具介绍 (1)Docker:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux机器上,也可以实现虚拟化,docker ...
- confd test
vi /etc/confd/confd.toml backend = "consul"confdir = "/etc/confd"log-level = &qu ...
随机推荐
- HDU_3746 Cyclic Nacklace(KMP)
题目请点我 题解: 题目大意:有一个字符串s.能够在前后加入字符,使字符串成为一个循环次数至少为2的循环字符串.输出最少须要加入的字符数目. 首先能够证明题目能够等价为仅仅在末尾加入字符使满足题意.要 ...
- linux source code search
https://elixir.bootlin.com/linux/latest/source/fs/eventpoll.c#L1120
- 【Spark 深入学习 02】- 我是一个凶残的spark
学一门新鲜的技术,其实过程都是相似的,先学基本的原理和概念,再学怎么使用,最后深究这技术是怎么实现的,所以本章节就带你认识认识spark长什么样的,帅不帅,时髦不时髦(这货的基本概念和原理),接着了解 ...
- github贡献开源项目
1.正常流程 1.拷贝项目到自己的github 2.本地修改后提交远程仓库 3.创建讨论Pull requests 4.开源项目者合并到master分支 5.删除仓库 2.快速发出讨论Pull req ...
- spring batch中用到的表
1,批量表的前缀:{prefix}来自类AbstractJdbcBatchMetadataDao中的变量DEFAULT_TABLE_PREFIX 2,{prefix}job_execution:存放j ...
- 319. Bulb Switcher
题目: There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ev ...
- Java知多少(80)图形界面设计基础
早先程序使用最简单的输入输出方式,用户在键盘输入数据,程序将信息输出在屏幕上.现代程序要求使用图形用户界面(Graphical User Interface,GUI),界面中有菜单.按钮等,用户通过鼠 ...
- LeetCode_1. Two Sum_Solution
原题链接 原题中文链接 一.题目描述 二.题目分析 1,常规解法 这道题目的意思是给定一个数组和一个值,要求出这个数组中两个值的和等于这个给定值target. 输出是有要求的: 坐标较小的放在前面,较 ...
- MySQL 5.7.19 忘记密码 重置密码 配置文件my.ini示例 服务启动后停止 log配置
[参考]java 项目 存入mysql后 变问号 MySql 5.6 (X64) 解压版 1067错误与编码问题的解决方案 一.my.ini 的mysqld下添加 skip-grant-tables ...
- Guava学习笔记(一):Maven
<dependencies> <dependency> <groupId>com.google.guava</groupId> <artifact ...