文档章节

python操作haproxy配置文件实例

eddy_linux
 eddy_linux
发布于 2015/11/29 23:18
字数 1276
阅读 253
收藏 4
配置文件模板:
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
粉丝 21
博文 135
码字总数 188789
作品 0
成都
程序员
私信 提问
saltstack与docker结合构建高可用和自动发现服务

最近看了刘天斯大哥的文章《构建一个高可用及自动发现docker基础架构》,觉得高大上,他的架构基于etcd+confd+docker+haproxy构建的。至于优势,刘天斯大哥已经说的很清楚。 我这里想说的是我...

liuping0906
07/02
0
0
HAProxy实现RabbitMQ负载均衡

最近看了一下RabbitMQ的负载均衡策略,对于RabbitMQ集群来说,主要有两类负载均衡,客户端内部的和服务端的,客户端内部主要是采用负载均衡算法,服务端主要是采用代理服务器,这里记录一下,...

DFKyun
07/05
0
0
部署k8s ssl集群实践6:配置高可用kube-apiserver组件ha+keepalived

参考文档: https://github.com/opsnull/follow-me-install-kubernetes-cluster 感谢作者的无私分享。 集群环境已搭建成功跑起来。 文章是部署过程中遇到的错误和详细操作步骤记录。如有需要对...

am2012
08/27
0
0
使用Haproxy对MariaDB做负载均衡

服务器环境: 安装 vim /etc/apt/sources.list.d/mariadb.list # 添加以下两句deb http://mirror.yongbok.net/mariadb/repo/5.5/ubuntu precise maindeb-src http://mirror.yongbok.net/maria......

birdinroom
06/28
0
0
高可用高性能负载均衡软件HAproxy详解指南-第一章(简介、安装)

第一章:HAproxy简介及安装配置 对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本文防盗链:http://zhang789.blog.51cto.com 目录 HAproxy简介 为什么要使用HAproxy haproxy 性能特点 负...

好笔记运维
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
45分钟前
6
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部