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

 

haproxy reqreq 重写_haproxy reqreq 重写

 




haproxy reqreq 重写_配置文件_02

haproxy reqreq 重写_python_03

1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 # Author:Ahappier
  4 
  5 
  6 import os,sys
  7 
  8 #将文本生成字典和列表
  9 def show_list(file):
 10     backend_list=[]
 11     backend_dict={}
 12     server_list=[]
 13     server_dict={}
 14     with open (file,"r") as f:  #读取haproxy文件
 15         for line in f:
 16             line =line.strip()
 17             if line.startswith("backend") == True:  #判断backend是否开头,并写入backend_list内
 18                 backend_name = line.split()[1]
 19                 backend_list.append(backend_name)
 20                 server_list=[]
 21             elif line.startswith("server")== True:
 22                 server_dict["name"]=line.split()[1]
 23                 server_dict["ip"]=line.split()[2]
 24                 server_dict["weight"]=line.split()[4]
 25                 server_dict["maxconn"]=line.split()[6]
 26                 server_list.append(server_dict.copy())
 27                 backend_dict[backend_name]=server_list
 28     return (backend_list,backend_dict)
 29 
 30 #读取backend的内容
 31 def backend_show(backend_list):
 32     backend_show_dict={}
 33     print("backend列表信息如下")
 34     for index,k in enumerate(backend_list,1):
 35         print(index,k)
 36         backend_show_dict[str(index)]=k
 37     return backend_show_dict
 38 
 39 #读取server内容
 40 def server_show(backend_input,backend_dict):
 41     server_show_dict={}
 42     server_list=backend_dict[backend_input]
 43     for i,k in enumerate(server_list,1):
 44         print(i,"name:",k["name"],"\tip:",k["ip"],"\tweight:",k["weight"],"\tmaxconn:",k["maxconn"])
 45         server_show_dict[i]=k
 46     return server_show_dict
 47 
 48 #显示操作编号和列表
 49 def action_list():
 50     print("****************************************")
 51     print("\t\t欢迎来到haproxy操作平台")
 52     print("****************************************")
 53     print('''
 54     1.查询backend和server信息
 55     2.添加backend和server信息
 56     3.修改backend和server信息
 57     4.删除backend和server信息
 58     5.退出
 59     ''')
 60     print("****************************************")
 61     action_num =input("请选择编号(注意是数字):")
 62     return action_num
 63 
 64 #定义查询功能
 65 def inquiry(inquiry_input):
 66     while True:
 67         if inquiry_input in backend_show_dict:
 68             backend_input = backend_show_dict[inquiry_input]
 69             print(backend_input,":")
 70             server_show(backend_input,backend_dict)
 71             break
 72         elif inquiry_input in backend_show_dict.values():
 73             print(inquiry_input,":")
 74             server_show(inquiry_input,backend_dict)
 75             break
 76         else:
 77             inquiry_input = input("输入错误,请重新输入:")
 78 
 79 #定义添加功能
 80 def add(add_input,file):
 81     (backend_list,backend_dict)= show_list(file)
 82     while True:
 83         if add_input in backend_show_dict:
 84             add_dict={}
 85             add_dict["name"]=input("请输入需要增加的server的名称:")
 86             add_dict["ip"]= input("请输入需要增加的server的ip:")
 87             add_dict["weight"]= input("请输入需要增加的server的weight:")
 88             add_dict["maxconn"]= input("请输入需要增加的server的maxconn:")
 89             backend_name_add= backend_list[int(add_input)-1]
 90             #如果ip存在,就更新weight和maxconn信息
 91             for dict in backend_dict[backend_name_add]:
 92                 if add_dict["ip"] in dict.values():
 93                     dict["weight"]=add_dict["weight"]
 94                     dict["maxconn"]=add_dict["maxconn"]
 95                     break
 96                 else:
 97                     backend_dict[backend_name_add].append(add_dict)
 98 
 99             backup(file,backend_name_add,backend_dict)
100             print("name:%s IP:%s weight:%s manxconn:%s已添加成功"%(
101                 add_dict["name"],add_dict["ip"],add_dict["weight"],add_dict["maxconn"]))
102             break
103         else:
104             add_dict={}
105             add_dict["name"]=input("请输入%s下新增的server名称:"%add_input)
106             add_dict["ip"]=input("请输入%s下新增的ip:"%add_input)
107             add_dict["weight"]=input("请输入%s下新增的weight:"%add_input)
108             add_dict["maxconn"]=input("请输入%s下新增的maxconn:"%add_input)
109             backend_name_add=add_input
110             backend_dict[backend_name_add]=add_dict
111 
112             file_new = "%s_new"%file
113             with open(file,"r") as f_read, open(file_new,"a+")as f_write:
114                 for line in f_read:
115                     f_write.write(line)
116                 f_write.write("\nbackend %s"%backend_name_add)
117                 server_line_write = "\n\t\tserver {name} {ip} weight {weight} maxconn {maxconn}\n"
118                 f_write.write(server_line_write.format(**add_dict))
119 
120             os.system("mv %s %s_backup"%(file,file))
121             os.system("mv %s %s"%(file_new,file))
122             print("\nbackend %s" % backend_name_add)
123             print("name:%s IP:%s weight:%s maxconn:%s已添加成功" % (
124                 add_dict["name"], add_dict["ip"], add_dict['weight'], add_dict['maxconn']))
125             break
126 
127 #定义修改功能
128 def resive(resive_input):
129     resive_dict={}
130     if resive_input in backend_show_dict: #判断输入是否在
131         backend_resive = backend_show_dict[resive_input]  #通过编号获取backend
132         resive_choise = input("是否需要修改该backend名称:%s;确认请按'y',按任意键继续;"%backend_resive)
133         if resive_choise == "y":
134             backend_resive_new = input("请输入修改后的backend的名称:")
135             backend_dict[backend_resive_new]=backend_dict.pop(backend_resive)
136             server_resive=input("是否需要修改%s下的server;确认请按‘y,按任意键继续’"%backend_resive_new)
137             if server_resive =="y":
138                 server_resive_dict =server_show(backend_resive_new, backend_dict)
139                 server_resive_num=input("请输入需要修改server的编号:")
140                 resive_dict["name"]=input("请输入需要修改后server的名称:")
141                 resive_dict["ip"]=input("请输入需要修改后ip:")
142                 resive_dict["weight"]=input("请输入需要修改后weight:")
143                 resive_dict["maxconn"]=input("请输入需要修改后maxconn:")
144                 server_resive_dict[int(server_resive_num)]=resive_dict
145                 server_resive_dict_backup ={}
146                 server_resive_dict_backup[backend_resive_new]=server_resive_dict.values()
147                 backup(file,backend_resive,server_resive_dict_backup,backend_resive_new)
148             else:
149                 backup(file,backend_resive,backend_dict,backend_resive_new)
150         else:
151             server_resive_dict = server_show(backend_resive, backend_dict)
152             server_resive_num = input("请输入需要修改server的编号:")
153             resive_dict["name"] = input("请输入需要修改后server的名称:")
154             resive_dict["ip"] = input("请输入需要修改后ip:")
155             resive_dict["weight"] = input("请输入需要修改后weight:")
156             resive_dict["maxconn"] = input("请输入需要修改后maxconn:")
157             server_resive_dict[int(server_resive_num)] = resive_dict
158             server_resive_dict_backup = {}
159             server_resive_dict_backup[backend_resive] = server_resive_dict.values()
160             backup(file, backend_resive, server_resive_dict_backup)
161     else:
162         resive_input_return=input("输入的backend不存在,请重新输入:")
163         resive(resive_input_return)
164 
165 #定义删除功能
166 def delete(delete_input):
167     if delete_input in backend_show_dict:
168         backend_delete = backend_show_dict[delete_input]
169         delete_choise = input("是否需要删除该backend:%s;确定请按'y',按任意键继续;"%backend_delete)
170         if delete_choise == "y":
171             del backend_dict[backend_delete]
172             backup(file,backend_delete,backend_dict)
173         else:
174             server_delete_dict= server_show(backend_delete,backend_dict)
175             server_delete_num = input("请输入需要删除的server的编号:")
176             while True:
177                 if server_delete_num in server_delete_dict:
178                     server_delete_dict.pop(server_delete_num)
179                     server_delete_dict_backup={}
180                     server_delete_dict_backup[backend_delete]=server_delete_dict.values()
181                     backup(file,backend_delete,server_delete_dict_backup)
182                     break
183                 else:
184                     server_delete_num = input("输入的编号不存在,请重新输入:")
185 
186 #定义退出
187 def backend_exit():
188     flag_exit = True
189     b_input= input("退出请输入'b';")
190     while flag_exit:
191         if b_input == "b":
192             flag_exit = False
193             return flag_exit
194         else:
195             return backend_exit()
196 
197 #定义文档备份
198 def backup(file,backend_name_action,backend_backup_dict,*backend_name_revise):
199     file_new="%s_new"%file
200     add_flag=False
201     with open(file,"r") as f_read,open(file_new,"w+")as f_write:
202         for line in f_read:
203             backend_name="backend %s"%backend_name_action
204             backend_name_revise="".join(tuple(backend_name_revise))
205             if line.strip() == backend_name:
206                 if backend_name_action not in backend_backup_dict and backend_name_revise not in backend_backup_dict:
207                     add_flag = True
208                     pass
209                 elif backend_name_revise in backend_backup_dict:
210                     line_revise = "backend %s\n" % backend_name_revise
211                     f_write.write(line_revise)
212                     for add_dict in backend_backup_dict[backend_name_revise]:
213                         server_line_write = '\t\tserver {name} {ip} weight {weight} maxconn {maxconn}\n'
214                         f_write.write(server_line_write.format(**add_dict))
215                     add_flag = True
216                 else:
217                     f_write.write(line)
218                     for add_dict in backend_backup_dict[backend_name_action]:
219                         server_line_write = '\t\tserver {name} {ip} weight {weight} maxconn {maxconn}\n'
220                         f_write.write(server_line_write.format(**add_dict))
221                     add_flag = True
222             elif line.strip().startswith("server") == True and add_flag == True:
223                 pass
224             else:
225                 f_write.write(line)
226                 add_flag = False
227 
228     os.system("mv %s %s_backup"%(file, file))
229     os.system("mv %s %s"%(file_new, file))
230 
231 
232 
233 
234 
235 
236 
237 #主程序
238 flag = True
239 while flag:
240     flag_main = True
241     flag_action = True
242     file = "haproxy"
243     action_num = action_list()
244     (backend_list,backend_dict)=show_list(file)
245     backend_show_dict= backend_show(backend_list)
246 
247 
248     while flag_main:
249         if action_num == "1":
250             inquiry(input("请输入需要查询的backend编号或名称:"))
251             flag_main = backend_exit()
252             break
253 
254         if action_num == "2":
255             add(input("请输入需要添加的现有backend编号或新backend名称:"),file)
256             flag_main = backend_exit()
257             break
258 
259         if action_num == "3":
260             resive(input("请输入需要修改的backend编号或名称:"))
261             flag_main = backend_exit()
262             break
263 
264         if action_num == "4":
265             delete(input("请输入需要删除的backend编号或名称:"))
266             flag_main = backend_exit()
267             break
268 
269         if action_num == "5":
270             sys.exit()
271 
272         elif action_num not in range(5):
273             print("你输入的有误,请重新输入")
274             flag_main = False