首页 > 代码库 > python练习_module01-3-haproxy配置文件操作

python练习_module01-3-haproxy配置文件操作

haproxy配置文件操作

haproxy 配置文件示例:
global
log 127.0.0.1 local2
daemon
maxconn 256
log 127.0.0.1 local2 info
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option dontlognull

listen stats :8888
stats enable
stats uri /admin
stats auth admin:1234

frontend oldboy.org
bind 0.0.0.0:80
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i www.oldboy.org
use_backend www.oldboy.org if www

backend www.oldboy.org
server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
server 100.1.7.8 100.1.7.8 weight 20 maxconn 3000
backend www.tesla.com
server 100.1.7.19 100.1.7.19 weight 20 maxconn 3000
server 100.1.7.18 100.1.7.18 weight 20 maxconn 3000
backend www.51cto.com
server 100.1.7.29 100.1.7.29 weight 20 maxconn 3000
server 100.1.7.28 100.1.7.28 weight 20 maxconn 3000
backend www.baidu.com
server 100.1.7.39 100.1.7.39 weight 20 maxconn 3000
server 100.1.7.38 100.1.7.38 weight 20 maxconn 3000

1. 需求
  • 根据用户输入输出对应的backend下的server信息
  • 可添加backend 和sever信息
  • 可修改backend 和sever信息
  • 可删除backend 和sever信息
  • 操作配置文件前进行备份
  • 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作

2. 实现

  • 达成6项作业需求
  • 任何时候都可以退出  
  • 选择操纵类型后,再输入内容时,可输入 <font color=‘blue‘>*b*</font> 返回上一层
  • 在添加、修改、删除操作时,会判断输入backend的格式是否正确

3.  代码

  1 #! /usr/bin/env python3
  2 # -*- coding:utf-8 -*-
  3 # Author:Jailly
  4 
  5 import re,os
  6 
  7 # 以字典形式获取原配置文件中backend的相关数据
  8 def get_backends():
  9     original_backends = {}
 10 
 11     with open(haproxy.cfg, r) as f:
 12         for line in f:
 13             m = re.search(r^backend\s+(?P<backend>.+)$, line.strip())
 14             if m:
 15                 original_backend_name = m.group(backend)
 16                 original_backends[original_backend_name] = {}
 17                 continue
 18 
 19             if original_backends:
 20                 m2 = re.search(r‘‘‘
 21                                 server\s+(?P<server>.*)\s+\1\s+
 22                                 weight\s+(?P<weight>\d+)\s+
 23                                 maxconn\s+(?P<maxconn>\d+)
 24                                 ‘‘‘,line.strip(),re.X)
 25                 if m2:
 26                     original_backends[original_backend_name][m2.group(server)] = {weight:int(m2.group(weight)),
 27                                                                                     maxconn:int(m2.group(maxconn))}
 28 
 29     return original_backends
 30 
 31 # 修改指定backend下的server条目
 32 def modify(update_backend,update_server,update_weight,update_maxconn):
 33     with open(haproxy.cfg, r) as f1,open(haproxy.cfg.temp, w+) as f2:
 34         search_flag = 0
 35 
 36         for line in f1:
 37             m = re.search(r^backend\s+(.*)$, line.strip())
 38             if m:
 39                 if m.group(1) == update_backend:
 40                     search_flag = 1
 41                 else:
 42                     if search_flag:
 43                         search_flag = 0
 44 
 45             if search_flag:
 46                 if re.search(r^server\s+%s % update_server, line.strip()):
 47                     line =         server %s %s weight %d maxconn %d\n%  48                            (update_server, update_server, update_weight, update_maxconn)
 49 
 50             f2.write(line)
 51 
 52     os.remove(haproxy.cfg)
 53     os.rename(haproxy.cfg.temp, haproxy.cfg)
 54 
 55 
 56 # 查找backend配置信息
 57 def search():
 58 
 59     while 1:
 60         search_flag = 0  # 标记是否找到相应的backend
 61         res = ‘‘
 62 
 63         kw = input(请输入您想要查询的backend(b:返回,q:退出):).strip()
 64         if kw == q:
 65             exit()
 66         elif kw == b:
 67             break
 68         else:
 69             with open(haproxy.cfg) as f:
 70                 for line in f:
 71                     if re.search(r^backend\s+%s % kw.strip(), line.strip()):
 72                         search_flag = 1
 73                         continue
 74 
 75                     if search_flag == 1:
 76                         if re.search(r^backend\s+.*, line.strip()):
 77                             break
 78                         else:
 79                             res += line
 80             if search_flag == 0:
 81                 print(\033[1;31m您输入的backend不存在!\033[0m)
 82             else:
 83                 print(res)
 84 
 85 # 添加backend配置信息
 86 def add():
 87 
 88     while 1:
 89         original_backends = get_backends()
 90         # print(original_backends)
 91         add_content = input(请输入您想要添加的backend配置(b:返回,q:退出):).strip()
 92 
 93         if add_content == b:
 94             break
 95         elif add_content == q:
 96             exit()
 97         else:
 98             try:
 99                 add_content = eval(add_content)
100                 add_backend = add_content[backend]
101                 add_record = add_content[record]
102                 add_server = add_record[server]
103                 add_weight = add_record[weight]
104                 add_maxconn = add_record[maxconn]
105             except:
106                 print(\033[1;31m格式错误,请重新输入!\033[0m)
107                 continue
108 
109             # 输入backend 在文件中存在的情况
110             if add_backend in original_backends:
111 
112                 # 输入backend的server条目 在文件中存在的情况
113                 if add_server in original_backends[add_backend]:
114 
115                     # 输入backend的server条目 与 文件中该server条目的信息相同的情况
116                     if {weight:add_weight,maxconn:add_maxconn} == original_backends[add_backend][add_server]:
117                         print(\033[1;31m您输入的backend信息在配置文件中已存在!\033[0m)
118 
119                     # 输入backend的server条目 与 文件中该server条目的信息不同的情况
120                     else:
121                         confirm = input(该backend下的server条目已存在,要更新吗?(Y/N):)
122                         if confirm.upper() == Y:
123                             modify(add_backend,add_server,add_weight,add_maxconn)
124                             print(更新成功!)
125                         else:
126                             print(取消更新!)
127 
128                 # 输入backend的server条目 在文件中不存在的情况
129                 else:
130                     # add_to_the_bottom_of_the_backend
131                     with open(haproxy.cfg,r) as f1,open(haproxy.cfg.temp,w) as f2:
132                         search_flag = 0
133 
134                         for line in f1:
135                             m = re.search(r^backend\s+(.*)$, line.strip())
136                             if m:
137                                 if m.group(1) == add_backend:
138                                     search_flag = 1
139 
140                                 else:
141                                     if search_flag:
142                                         search_flag = 0
143                                         f2.write(        server %s %s weight %d maxconn %d\n%
144                                                  (add_server,add_server,add_weight,add_maxconn))
145                             f2.write(line)
146 
147                     os.remove(haproxy.cfg)
148                     os.renames(haproxy.cfg.temp,haproxy.cfg)
149                     print(添加成功!)
150 
151             # 输入backend 在文件中不存在的情况
152             else:
153                 # add_to_the_bottom_of_the_file
154                 with open(haproxy.cfg,a) as f:
155                     f.write(‘‘‘
156 backend %s
157         server %s %s weight %d maxconn %d                     
158                         ‘‘‘ % (add_backend,add_server,add_server,add_weight,add_maxconn))
159                 print(添加成功!)
160 
161 # 修改backend配置信息
162 def update():
163     
164     while 1:
165         original_backends = get_backends()
166         update_content = input(请输入您想要修改的backend配置(b:返回,q:退出):)
167 
168         if update_content == b:
169             break
170         elif update_content == q:
171             exit()
172         else:
173 
174             try:
175                 update_content = eval(update_content)
176                 update_backend = update_content[backend]
177                 update_record = update_content[record]
178                 update_server = update_record[server]
179                 update_weight = update_record[weight]
180                 update_maxconn = update_record[maxconn]
181             except:
182                 print(\033[1;31m格式错误,请重新输入!\033[0m)
183                 continue
184 
185             # 输入的backend 在文件中存在的情况
186             if update_backend in original_backends:
187 
188                 # 输入backend的sever条目 在文件中存在的情况
189                 if update_server in original_backends[update_backend]:
190                     modify(update_backend,update_server,update_weight,update_maxconn)
191                     print(修改成功!)
192 
193                 # 输入backend的sever条目 在文件中不存在的情况
194                 else:
195                     print(\033[1;31m该backend下的server在配置文件中不存在!如果想要添加server,请返回上一层选择\‘2\‘添加\033[0m)
196 
197             # 输入的backend 在文件中不存在的情况
198             else:
199                 print(\033[1;31m该backend在配置文件中不存在!如果想要添加backend,请返回上一层选择\‘2\‘添加\033[0m)
200 
201 # 删除backend信息
202 def delete():
203 
204     while 1:
205         original_backends = get_backends()
206         del_content = input(请输入您想要删除的backen配置(b:返回,q:退出):)
207 
208         if del_content == b:
209             break
210         elif del_content == q:
211             exit()
212         else:
213             try:
214                 del_content = eval(del_content)
215                 del_backend = del_content[backend]
216                 del_record = del_content[record]
217                 del_server = del_record[server]
218                 del_weight = del_record[weight]
219                 del_maxconn = del_record[maxconn]
220             except:
221                 print(\033[1;31m格式错误,请重新输入!\033[0m)
222                 continue
223 
224             if del_backend in original_backends and del_server in original_backends[del_backend] and 225                     original_backends[del_backend][del_server] == {weight:del_weight,maxconn:del_maxconn}:
226                 with open(haproxy.cfg,r) as f1, open(haproxy.cfg.temp,w) as f2:
227                     search_flag = 0
228                     for line in f1:
229                         if re.search(r^backend\s+%s%del_backend,line.strip()):
230                             search_flag = 1
231 
232                         if search_flag:
233                             re.search(r^server\s+%s%del_server,line.strip())
234                             search_flag = 0
235                             continue
236 
237                         f2.write(line)
238 
239                 os.remove(haproxy.cfg)
240                 os.rename(haproxy.cfg.temp,haproxy.cfg)
241 
242                 print(删除成功!)
243 
244             else:
245                 print(\033[1;31m您输入的backend信息不存在!\033[0m)
246 
247 # 主程序
248 def main():
249     print(欢迎进入HAProxy管理系统.center(50,-))
250 
251     while 1:
252 
253         print(‘‘‘ 
254 1. search
255 2. add
256 3. update
257 4. delete
258             ‘‘‘)
259 
260         choice = input(请选择您想要进行的操作(q:退出):)
261 
262         if choice == 1:
263             search()
264 
265         elif choice == 2:
266             add()
267 
268         elif choice == 3:
269             update()
270 
271         elif choice == 4:
272             delete()
273 
274         elif choice == q:
275             exit()
276 
277         else:
278             print(\033[1;31m请输入正确的指令!\033[0m)
279 
280 if __name__ == __main__:
281     main()

 

python练习_module01-3-haproxy配置文件操作