haproxy配置文件简单管理

版本:python3
功能:对haproxy配置文件进行简单的查询、添加以及删除功能
操作流程:
1.根据提示选择相应的选项
2.进入所选项后,根据提示写入相应的参数
3.查询功能会返回查询结果,添加、删除以及回退功能无回显

流程图:

 1 global
 2         log 127.0.0.1 local2
 3         daemon
 4         maxconn 256
 5         log 127.0.0.1 local2 info
 6 defaults
 7         log global
 8         mode http
 9         timeout connect 5000ms
10         timeout client 50000ms
11         timeout server 50000ms
12         option  dontlognull
13 
14 listen stats :8888
15         stats enable
16         stats uri       /admin
17         stats auth      admin:1234
18 
19 frontend oldboy.org
20         bind 0.0.0.0:80
21         option httplog
22         option httpclose
23         option  forwardfor
24         log global
25         acl www hdr_reg(host) -i www.oldboy.org
26         use_backend www.oldboy.org if www
27 
28 backend www.oldboy.org
29         server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
30 
31 backend buy.oldboy.org
32         server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
33 
34 backend nb.oldboy.org
35         server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
36 
37 backend ttt.oldboy.org
38         server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
39 
40 backend www.oldboy.com
41 server  192.168.1.1 192.168.1.1 weight 30 maxcoon 3000
haproxy配置示例文件
  1 import os
  2 import os.path
  3 import time
  4 def query(back_name):#定义查询函数
  5     flage=False    #[通过用户给定的backend,找到backend所在行,在寻找下一个以backend开头的行,将两个backend中间的内容添加进列表中]
  6     query_list=[]
  7     with open('ha','r') as ha:  #打开配置文件
  8         for line in ha:          #获取配置文件的内容
  9             if line.strip()=='backend %s'%(back_name): #获取要查询的backend所在行的内容
 10                 flage=True#善用标志位
 11                 continue
 12             if line.strip().startswith('backend'):#判断是否行开头为backend
 13                 flage=False
 14             if flage and line.strip(): #判断flage是否为真
 15                 query_list.append(line.strip())#将符合的内容添加单独进列表中
 16     return query_list
 17 
 18 
 19 
 20 
 21 def add_backend(back_name,ip,weight,maxcoon):#定义添加函数
 22     current_title='backend %s'%back_name  #获得用户输入backend所在行内容
 23     current_record='server  %s %s weight %s maxcoon %s'%(ip,ip,weight,maxcoon)  #获得用户所要添加的server
 24     fetch_list=query(back_name)     #获取指定的backend下的记录
 25     if fetch_list:  #如果添加的backend存在
 26         if current_record in fetch_list: #如果添加的子项存在backend中,则不进行操作
 27             pass      # '''【主要思路:通过判断,将需要添加的backend下的内容和原来已经存在的内容存入一个列表,将需要添加的
 28                       # backend之前的内容写入新文件,再将backend和存入列表中需要添加的sever写入,最后添加其余内容】'''
 29         else:
 30             fetch_list.append(current_record)#如果不存在backend中,添加进指定的backend中
 31         flage=False  #定义标示位,用于判断前后backend之间需要写入的内容
 32         has_write=False##定义标示位,用于判断需要添加的内容是否已存在
 33         with open('ha','r') as ha,open('ha.new','w') as new_ha:  #打开ha配置文件,创建一个新的文件
 34             for line in ha: #迭代配置文件
 35                 if line.strip() == current_title: #判断文件中是否有用户输入的backend
 36                     flage=True
 37                     new_ha.write(line)#把backend写入到新配置文件内
 38                     continue
 39                 if flage and line.strip().startswith('backend'):
 40                     flage=False
 41                 if flage :
 42                     if not has_write: #通过标示位判断
 43                         for line in fetch_list:#获得需要添加的backend下的所以server
 44                             temp="%s%s\n" %(" "*8,line)
 45                             new_ha.write(temp) #写入新的文件中
 46                             has_write = True
 47                 else:
 48                     new_ha.write(line)#将其余内容写入到新的文件中
 49     else:#如果用户输入的backend不存在配置文件中
 50         with open('ha','r') as ha,open('ha.new','w') as new_ha:
 51             for line in ha:
 52                 new_ha.write(line)#将配置文件的所以内容写入新的文件中
 53             new_ha.write('\n'+current_title)#将用户输入的backend写入新的文件中
 54             tem=''*8+current_record+'\n'
 55             new_ha.write('\n'+tem)#将用户输入的sever写入文件中
 56     os.rename('ha','ha_bak')
 57     os.rename('ha.new','ha')
 58 
 59 def quit_time():#查询完成后退出
 60     for i in [3,2,1]:
 61         print('\033[32;1m查询完毕,正在返回主菜单.....\033[1m',i)
 62         time.sleep(1)
 63 
 64 def del_backend(back_name,ip,weight,maxcoon):  #与添加类似,通过将需要的server存入一个列表中,最后将其余内容和列表中的内容写入新的文件中
 65     current_title='backend %s'%back_name     #通过文件重命名的方式实现功能
 66     current_record='server  %s %s weight %s maxcoon %s'%(ip,ip,weight,maxcoon)
 67     fetch_list=query(back_name)     #获取指定的backend下的记录
 68     if fetch_list:  #如果添加的backend存在
 69         if current_record in fetch_list: #如果添加的子项存在backend中
 70                 fetch_list.remove(current_record)
 71         else:
 72             pass
 73         flage=False
 74         has_write=False
 75         with open('ha','r') as ha,open('ha.new','w') as new_ha:
 76             for line in ha:
 77                 if line.strip() == current_title:
 78                     flage=True
 79                     new_ha.write(line)#把backend写入到新配置文件内
 80                     continue
 81                 if flage and line.strip().startswith('backend'):
 82                     flage=False
 83 
 84                 if flage :
 85                     if not has_write:
 86                         for line in fetch_list:
 87                             temp="%s%s\n" %(" "*8,line)
 88                             new_ha.write(temp)
 89                             has_write = True
 90                 else:
 91                     new_ha.write(line)
 92     else:
 93         with open('ha','r') as ha,open('ha.new','w') as new_ha:
 94             for line in ha:
 95                 new_ha.write(line)
 96             new_ha.write('\n'+current_title)
 97             tem=''*8+current_record+'\n'
 98             new_ha.write('\n'+tem)
 99     if os.path.isfile('ha_bak'): #文件重命名需要判断文件是否存在,当第一次时,备份文件不存在会报错
100         os.remove('ha_bak')
101     os.rename('ha','ha_bak')
102     os.rename('ha.new','ha')
103 
104 def fallback(): #回退代码,将备份文件和当前配置文件重命名的方式实现功能
105     os.rename('ha','ha_new')
106     os.rename('ha_bak','ha')
107 
108 
109 while True:
110     print('\033[34;1m#######################################   \033[1m') #打印选项
111     user_enter=input('''\033[32;1m 1.查询后端backend
112  2.添加后端backend
113  3.删除后端backend
114  4.回滚至前一版本
115  5.退出\033[1m
116  请输入你要选择的操作:''' )
117     if user_enter =='1':
118         back_name=input('\033[32;1m请输入需要查询的backend名称,example:www.oldboy.org:\033[1m')
119         result=query(back_name)  #调用查询函数
120         if result:
121             print('\033[33;1m查询结果如下:\033[1m')
122             for i in result:
123                 print(i)
124             quit_time()
125             continue
126         else:
127             print('\033[34;1m查询错误,backend不存在,结果为空!\033[1m')
128     elif user_enter=='2':
129          back_name=input('\033[32;1m请输入需要查询的backend名称,example:www.oldboy.org:\033[1m')
130          ip=input('\033[33;1m请输入要添加的serverIP地址,example192.168.1.1:\033[1m')
131          weight=input('\033[34;1m请输入该server的weight:\033[1m')
132          maxcoon=input('\033[35;1m请输入该server的maxcoon:\033[1m')
133          add_backend(back_name,ip,weight,maxcoon)
134          print('添加完成')
135          quit_time()
136     elif user_enter=='3':
137          back_name=input('\033[32;1m请输入需要删除的backend名称,example:www.oldboy.org:\033[1m')
138          ip=input('\033[33;1m请输入要添加的serverIP地址,example192.168.1.1:\033[1m')
139          weight=input('\033[34;1m请输入该server的weight:\033[1m')
140          maxcoon=input('\033[35;1m请输入该server的maxcoon:\033[1m')
141          del_backend(back_name,ip,weight,maxcoon)
142          print('删除完成')
143          quit_time()
144     elif user_enter=='4':
145          try:
146            fallback()
147          except FileNotFoundError: #回退时,备份文件不存在报错
148              print('\033[31;1m回退失败,当前为最新版本,无法回退!\033[1m')
149          except FileExistsError:#用户重复回退
150              print('已经是最新版本')
151              quit_time()
152     elif user_enter=='5':
153           quit_time()
154           break
155     else:#非法输入时
156         print('\033[31;1m您输入的选项错误,请重新选择!\033[1m')
程序代码

 

posted @ 2016-05-30 14:02  百衲本  阅读(814)  评论(0编辑  收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码