文档章节

python操作haproxy配置文件实例

eddy_linux
 eddy_linux
发布于 2015/11/29 23:18
字数 1276
阅读 233
收藏 4
点赞 0
评论 0
配置文件模板:
defaults
        log global
        mode http
        option httpclose
        option dontlognull
        option abortonclose
        option redispatch
        retries 3
        maxconn 20480
        balance roundrobin
        timeout connect 15000
        timeout client 15000
        timeout server 15000

listen admin_stat
        bind *:2008
        mode http
        option httplog
        stats refresh 30s
        stats uri /status
        stats realm Haproxy\ Statistics
        stats auth admin:123456
        stats hide-version
        stats admin if TRUE

listen image.eddy.com_LB
       bind 10.25.16.11:8000
       balance roundrobin
       option forwardfor
       option originalto
       mode http
       balance roundrobin
       server  pwepaypubc0101  pwepaypubc0101:8000 check inter 5000  weight 1
       server  pwepaypubc0102  pwepaypubc0102:8000 check inter 5000  weight 1

listen payment.eddy.com:8080_HA
       bind 10.25.16.11:8080
       mode tcp
       server  pwepaypubc0101 pwepaypubc0101:8080 check inter 5000  weight 1
       server  pwepaypubc0102 pwepaypubc0102:8080 check inter 5000  weight 1 backup


1.查询配置文件
#!/usr/bin/env python
# encoding: utf-8
import json
import re
import linecache
import time
import shutil
#定义listen行号列表
listen_line = []
#定义文件行号列表
line = []
#定义文件内容列表
line_content = []
#定义listen行号与listen那一行内容字典
listen_dic = {}
def query_cfg(key):
    #打开文件
    with open('haproxy.cfg','r') as obj:
        #循环文件行号与行内容
        for (num,value)  in enumerate(obj):
            #添加行号列表
            line.append(num)
            line_content.append(value)
            #匹配以listen开头的行
            if re.match('(listen.*?)',value,re.S):
                #添加listen的行号
                listen_line.append(num)
                #让行内容之间的空格用‘_’替换
                value = str(value).replace(' ','_')
                #添加listen行号和所在行号内容
                listen_dic.setdefault(num,value)
        #遍历listen行号与内容的字典
        for k,v in listen_dic.items():
            #匹配以listen开头中间任意字符以关键字结尾的
            if re.match('(listen.*?%s)' %(key),v,re.S):
                #定义关键字所在listen行号
                key_line = listen_line.index(k)
                #判断关键字listen行号是否是最后一个listen行号
                if key_line+1 == len(listen_line):
                    #打印listen关键字行号到最后一行的内容
                   for i in range(listen_line[key_line],line[-1]+2):
                        linecache.updatecache('haproxy.cfg')
                        print linecache.getline('haproxy.cfg',i),
                else:
                    #判断关键listen行号不是最后一个listen就打印两个listen行号之间的内容
                    for i in range(listen_line[key_line],listen_line[key_line+1]):
                        linecache.updatecache('haproxy.cfg')
                        print  linecache.getline('haproxy.cfg',i),
query_cfg('payment.eddy.com:8080_HA')
Connected to pydev debugger (build 135.1057)
listen payment.eddy.com:8080_HA
       bind 10.25.16.11:8080
       mode tcp
       server  pwepaypubc0101 pwepaypubc0101:8080 check inter 5000  weight 1
       server  pwepaypubc0102 pwepaypubc0102:8080 check inter 5000  weight 1 backup 
#2.为配置文件添加节点       
def add_cfg():
    read = raw_input("please input listen:")
    result = exist_cfg(read)
    if result:
        print 'please choose another listen name'
    else:
        content = raw_input('please input listen content:')
        #格式化输入内容
        content_dict = json.loads(content)
        listen_title = '\n' + 'listen' + '   ' + content_dict['listen']
        record = content_dict['record']
        listen_bind = '\n' + '     ' + 'bind' + '   ' + record['bind']
        listen_mode = '\n' + '     ' + 'mode' + '   ' + record['mode']
        result1 = exist_cfg(content_dict['listen'])
        if result1:
            print 'please choose another listen name'
        else:
            #备份原配置文件
            shutil.copyfile('haproxy.cfg','haproxy_version_%s.cfg' %time.strftime('%Y%m%d%H%M'))
            with open('haproxy.cfg','a') as obj:
                obj.writelines(listen_title)
                obj.writelines(listen_bind)
                obj.writelines(listen_mode)
                obj.writelines('\n     server %s check inter %s weight %s maxconn %s \n' %(record['server'],record['check inter'],record['weight'],record['maxconn']))
            print 'add successfull'
add_cfg() 
Connected to pydev debugger (build 135.1057)
please input listen:abcd
listen is not exits
please input listen content:{"listen":"abcd","record":{"bind":"10.25.16.11:8002","mode":"http","server":"pwpaystoc0102 10.25.19.52:8002","check inter":"5000","weight":"1","maxconn":"1000"}}
listen is not exits
add successfull
配置文件添加以下内容
listen   abcd
     bind   10.25.16.11:8002
     mode   http
     server pwpaystoc0102 10.25.19.52:8002 check inter 5000 weight 1 maxconn 1000 
#3.为配置更新
def update_cfg1():
    line_content = []
    listen_list = []
    line = []
    with open('haproxy.cfg','r') as obj:
        for (num,value)  in enumerate(obj):
            line_content.append(value)
            line.append(num)
            if re.match('(listen.*?)',value,re.S):
                listen_list.append(num)

    # content = '{"listen":"abcd","record":{"server":"pwpaystoc0102 10.25.19.52:8002","check inter":"5000","weight":"1","maxconn":"1000"}}'
    content =raw_input('please update site:')
    content_dict = json.loads(content)
    listen_title = content_dict['listen']
    record = content_dict['record']
    input_content = '       server %s check inter %s weight %s maxconn %s \n' %(record['server'],record['check inter'],record['weight'],record['maxconn'])
    for i in line_content:
       if re.match('(listen.*?%s)' %(listen_title),i,re.S):
           if  line_content.index(i) == listen_list[-1]:
               line_content.insert(line[-1]+1,input_content)
               s = ''.join(line_content)
               shutil.copyfile('haproxy.cfg','haproxy_version_%s.cfg' %time.strftime('%Y%m%d%H%M'))
               with open('haproxy.cfg','w') as obj:
                   obj.write(s)
           else:
                current_listen_index = listen_list.index(line_content.index(i))
                next_listen_index = current_listen_index + 1
                line_content.insert(listen_list[next_listen_index]-1,input_content)
                s = ''.join(line_content)
                shutil.copyfile('haproxy.cfg','haproxy_version_%s.cfg' %time.strftime('%Y%m%d%H%M'))
                with open('haproxy.cfg','w') as obj:
                    obj.write(s)
update_cfg1() 
Connected to pydev debugger (build 135.1057)
please update site:{"listen":"abcd","record":{"server":"pwpaystoc0102 10.25.19.52:8002","check inter":"5000","weight":"1","maxconn":"1000"}}
配置文件更新如下
listen   abcd
     bind   10.25.16.11:8002
     mode   http
     server pwpaystoc0102 10.25.19.52:8002 check inter 5000 weight 1 maxconn 1000 
       server pwpaystoc0102 10.25.19.52:8002 check inter 5000 weight 1 maxconn 1000 
       server pwpaystoc0102 10.25.19.52:8002 check inter 5000 weight 1 maxconn 1000
#4.删除配置文件的配置
def delete_cfg():
    read = raw_input("please input listen:")
    result  = exist_cfg(read)
    if result:
        for k,v in listen_dic.items():
            if re.match('(listen.*?%s)' %(read),v,re.S):
                 key_line =  listen_line[listen_line.index(k)]
                 if key_line == listen_line[-1]:
                    print key_line
                    print line[-1]
                 else:
                    key_line1 = listen_line[listen_line.index(k)+1]-2
                    print key_line
                    print key_line1
        read = raw_input("please input delete line number:")
        del line_content[int(read)]
        shutil.copyfile('haproxy.cfg','haproxy_version_%s.cfg' %time.strftime('%Y%m%d%H%M'))
        with open('haproxy.cfg','w') as obj:
            new_realserver = ''.join(line_content)
            obj.write(new_realserver)   
Connected to pydev debugger (build 135.1057)
please input listen:abcd

listen   abcd
     bind   10.25.16.11:8002
     mode   http
     server pwpaystoc0102 10.25.19.52:8002 check inter 5000 weight 1 maxconn 1000 
       server pwpaystoc0102 10.25.19.52:8002 check inter 5000 weight 1 maxconn 1000 
listen is exits
97
101
please input delete line number:101
配置文件如下:
listen   abcd
     bind   10.25.16.11:8002
     mode   http
     server pwpaystoc0102 10.25.19.52:8002 check inter 5000 weight 1 maxconn 1000 
     
注意:
1.以上输入内容必须为以下格式
    {"listen":"fastdfs_group2_8002_external","record":{"bind":"10.25.16.11:8002","mode":"http","server":"pwpaystoc0102 10.25.19.52:8002","check inter":"5000","weight":"1","maxconn":"1000"}}
    因为raw_input输入的内容都为字符串,需要json化
2.注意写入内容的空格与换行符
3.扩展1:你可以使用flask或django做成网页管理haproxy配置文件的方式;
4.扩展2:你可以使用while True的死循环方式把几个函数连接起来做成一个终端操作的小工具,以下代码是否可用,没有验证过,只是举例
#     while True:
#         print '''
#                 ===================================================
#                 1.)select haproxy configuration
#                 2.)add haproxy listen
#                 3).update haproxy
#                 4.)delete haproxy realserver
#                 ===================================================
#                 '''
#         read = raw_input('please choose number:')
#         if read == '1':
#             site = raw_input('please input listen:')
#             exist_cfg(site)
#         elif read == '2':
#             add_cfg()
#         elif read == '3':
#             update_cfg()
#         elif read == '4':
#             delete_cfg()
#         elif read == 'q' or read == 'quit':
#             break


© 著作权归作者所有

共有 人打赏支持
eddy_linux
粉丝 18
博文 135
码字总数 188789
作品 0
成都
程序员
HAProxy负载均衡器的安装及配置

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载...

zhangdiandong ⋅ 2014/02/12 ⋅ 0

高性能缓存服务器 nuster v1.7.10.1 发布

高性能缓存服务器 nusterv1.7.10.1 已发布。本次更新主要升级到 HAProxy v1.7.10, 更改了配置文件关键字,删除了 share 关键字, 为升级到HAProxy v1.8 进行了代码重构。这应该是 1.7 版本的最...

nuster ⋅ 04/24 ⋅ 0

linux的chkconfig服务注册(服务注册脚本说明)

linux上一些服务的重启以及随系统启动而启动,可以像windows那样注册为服务通过chkconfig 进行操作。在注册chkconfig时需要在linux的/etc/init.d/目录下有对应的启动脚本。 一、注册服务脚本...

Mr_sheng ⋅ 05/04 ⋅ 0

haproxy+mysql实现代理mysql

我们通常会碰到这样的业务场景: b主机和c数据库在同一个内网,a主机不能直接访问c数据库,我们可以通过在b主机上搭建代理让a访问c数据库,我们使用haproxy来干这个事情 centos7环境 mysql自...

小白的希望 ⋅ 06/08 ⋅ 0

高性能缓存服务器 nuster v1.8.8.3 和 v1.7.11.3 发布

高性能缓存服务器 nuster v1.8.8.3 和 v1.7.11.3 发布。本次更新主要修复了 一个配置文件解析的bug。 Broken rule key parser in config file (Thanks to Nelson) 介绍 nuster 是一个基于 HA...

nuster ⋅ 06/10 ⋅ 0

HAProxy启动时候常见问题

rabbitmq和haproxy结合时候,遇到了下面问题 某段配置:

HappyBoyLi ⋅ 昨天 ⋅ 0

高性能缓存服务器 nuster v1.8.8.1 支持 HTTP/2,多线程

高性能缓存服务器 nuster v1.8.8.1 已发布。本次更新主要是升级到 HAProxy v1.8.8, 支持 HTTP/2 和多线程。 项目主页 https://github.com/jiangwenyuan/nuster 介绍 nuster 是一个基于 HAPr...

nuster ⋅ 05/08 ⋅ 0

高性能缓存服务器 nuster v1.8.8.2 和 v1.7.11.2 发布

高性能缓存服务器 nuster v1.8.8.2 和 v1.7.11.2 发布。本次更新主要修复了两个比较隐蔽的 bug。 项目主页 https://github.com/jiangwenyuan/nuster Fixed Rare case segfault when compari...

nuster ⋅ 05/29 ⋅ 0

haproxy reload 不生效

haproxy 里weight 权重从100 改成1后, 用/etc/init.d/haproxy reload 不生效,/etc/init.d/haproxy restart 才生效。。 有没有哪位大神遇到过?...

大头加二哥 ⋅ 04/24 ⋅ 0

Redis集群方案之Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(待实践)

首先说明一下,Twemproxy+HAProxy+Keepalived+Sentinel+主从复制-这里提到的技术不一定全部都用上,但是全部用上之后可以达到高可用。 主从复制:实现数据一式多份的保障。 Sentinel哨兵模式...

easonjim ⋅ 2017/10/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 54分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部