作業:
對haproxy配置文件進行操作
要求:
對haproxy配置文件中backend下的server實現增刪改查的功能
一、這個程序有二個版本
1、 python2.7版本見haproxy_python27.py
2、 python3.4版本見haproxy_python34.py
二、具體實現了如下功能:
1、輸入1,進入backend菜單,查詢server信息
2、輸入2,進入backend菜單,添加server條目
3、輸入3,進入backend菜單,選擇server條目,進入修改環節
4、輸入4,進入backend菜單,選擇server條目,進入刪除環節
5、輸入5,退出程序
三、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 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.10 100.1.7.10 weight 10 maxconn 2000 frontend mysql bind *:3306 mode tcp log global default_backend mysqlserver backend mysqlserver server mysql1 10.1.1.110:3306 weight 20 maxconn 300 server mysql2 10.1.1.120:3306 weight 10 maxconn 200
四、流程圖如下:
五、python2.7代碼:

#!/usr/bin/python27 #_*_ coding=utf-8 _*_ ''' Created on 2016年1月17日 @author: 王凱 ''' import os,sys,re,time from collections import defaultdict,OrderedDict ######################raw_input輸入字符類型轉化函數####################### def input_handle(s): if str.isdigit(s): ###對輸入是否是數字進行判斷### s = int(s) ###如果輸出的是個數字,則轉化為整數類型### return s ###返回輸入字符### #####################名稱或變量名輸入判斷函數############################# def name_decide(): (name,name_flag) = ('',True) ###初始化返回的名稱和判斷標志位### while name_flag: name_input = raw_input('\033[32m請輸入新服務名:(退出輸入q)\033[0m') if len(name_input) == 0: ###如果輸入為空則直接下一次循環### continue elif name_input == 'q': ###輸入q,退出本次輸入### name_flag = False elif re.match('[0-9a-zA-Z\_]+',name_input): ###匹配輸入是否以字符、數字或下划線開頭### name = name_input name_flag = False ###輸入成功后退出循環### else: print('\033[31m名稱輸入錯誤,請重新輸入!!!\033[0m') return(name) ###返回輸入的結果### #####################IP地址及端口輸入判斷函數############################# def ipaddress_decide(): (address,address_flag) = ('',True) ###初始化返回的IP地址和判斷標志位### while address_flag: address_input = raw_input('\033[32m請輸入新地址(IP哦):(退出輸入q)\033[0m') if len(address_input) == 0: ###如果輸入為空則直接下一次循環### continue elif address_input == 'q': ###輸入q,退出本次輸入### address_flag = False ##################匹配輸入是否是ip:port的格式###################### elif re.match('(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(\:\d{1,5})?$',address_input): address = address_input address_flag = False ###輸入成功后退出循環### else: print('\033[31m地址輸入錯誤,請重新輸入!!!\033[0m') return(address) ###返回輸入的結果### ####################數字輸入判斷函數###################################### def number_decide(name): (number,number_flag) = ('',True) ###初始化返回的數字和判斷標志位### while number_flag: number_input = raw_input('\033[32m請輸入 %s (數字哦):(退出輸入q)\033[0m' % name) if len(number_input) == 0: ###如果輸入為空則直接下一次循環### continue elif number_input == 'q': ###輸入q,退出本次輸入### number_flag = False else: try: int(number_input) ###匹配輸入是否是數字### except: print('\033[31m %s 輸入錯誤,請重新輸入!!!\033[0m' % name) else: number = number_input number_flag = False ###輸入成功后退出循環### return(number) ###返回輸入的結果### #############################backend輸入判斷函數########################## def backend_input_if(input_index,input_dict): (input_name,input_flag) = ('',True) ###初始化返回的名稱和判斷標志位### ###############如果輸入非空,對輸入進行判斷並轉化類型################# if len(input_index) != 0: input_index = input_handle(input_index) if input_index == 'b': ###如果輸入為b,則退出程序### input_flag = False elif input_index in input_dict.keys(): ###如果輸入為數字編號,則從字典中獲取具體backend名稱### input_name = input_dict[input_index] elif input_index in input_dict.values(): ###如果輸入為backend名稱,則直接獲取### input_name = input_index else: input_name = '' ###輸入其他字符,賦值變量為空### return(input_name,input_flag) ###返回輸入的結果和循環標志位### ###########################backend列表展示函數############################ def backend_read(file): backend_list = [] ###初始化backend的列表### show_dict = {} ###初始化要返回的顯示字典### backend_name_dict = defaultdict(list) ###定義一個value為列表的字典,用來存放server### server_flag = False ###初始化server判斷標志位### with open(file,'r') as ha: ###打開haproxy配置文件### for line in ha: server_dict = OrderedDict() ###定義一個有序字典### line = line.strip('\n') if re.match('backend',line): ###匹配配置文件以backend開頭的行### backend_name = re.split('\s+',line)[1] backend_list.append(backend_name) ###將配置到的backend的名稱插入到列表### server_flag = True ###賦值標志位為真,用來與server關聯### elif server_flag and re.match('\s+server',line): ###匹配配置文件以server開頭的行### server_info = re.split('\s+',line) ###對server進行分隔### server_dict['name'] = server_info[2] ###對server的具體信息進行字典賦值### server_dict['address'] = server_info[3] server_dict['weight'] = server_info[5] server_dict['maxconn'] = server_info[7] backend_name_dict[backend_name].append(server_dict) ###將server字典與backend的名稱進行關聯### else: server_flag = False ###當server沒匹配到,賦值標志位為假,結束關聯### for k,v in enumerate(backend_list,1): show_dict[k] = v ###對backend名稱進行新字典賦值,方便查詢和展示### print('%d . %s' % (k,v)) ###輸出backend列表### return(show_dict,backend_name_dict) ###返回顯示的字典和backend-server字典### ########################顯示backend后端服務器函數############################# def backend_server_show(backend_show_value,server_show_dict): ############對backend名稱進行遍歷並加上數字編號########################### print('\n================================================================') print('后端服務器(%s)信息如下 : ' % backend_show_value) print('%-5s %-20s %-20s %-20s %-20s' % ('id','name','address','weight','maxconn')) server_list = server_show_dict[backend_show_value] for k,v in enumerate(server_list,1): ###用enumerate進行server展示### print '%-5s' % k + ' ', for kk,vv in v.items(): print '%-20s' % vv + ' ', print print('\n================================================================') ########################backend后端服務操作並回寫配置文件函數################# def backend_server_handle(file,handle_dict): newfile = '%s.new' % file ###定義回寫的新文件### server_flag = False with open(file,'r') as read_file,open(newfile,'w') as write_file: ###同時打開二文件,一個讀,一個寫### for line in read_file: if re.match('backend',line): ###匹配到backend行時進行server信息插入### write_file.write(line) backend_name = re.split('\s+',line)[1] for server_dict in handle_dict[backend_name]: ###對backend-server字典進行遍歷### server_line = '\tserver {name} {address} weight {weight} maxconn {maxconn}\n' write_file.write(server_line.format(**server_dict)) ###將指定的backend下的server條目插入文件### server_flag = True ###指定標志位為真,方便server判斷### elif server_flag and re.match('\s+server',line): ###匹配server開頭的行,跳過不做任何操作### pass else: write_file.write(line) ###其他的行,直接插入新文件### server_flag = False print('\033[33m server更新成功\033[0m') os.system('mv %s %s.bak' % (file,file)) ###對源配置文件進行備份### os.system('mv %s %s' % (newfile,file)) ###對新生成的配置文件進行改名### ##################################主程序開始################################## if __name__ == '__main__': flag = True haproxy_file = 'haproxy.cfg' ###指定haproxy配置文件### backend_name = '' haproxy_name_show_dict = {} ###初始化backend顯示字典### haproxy_server_show_dict = {} ###初始化server顯示字典### while flag: os.system('clear') ###清屏### print('\n================================================================') print('\033[33m 歡迎訪問haproxy配置文件管理平台:\033[0m') print('\nbackend列表信息如下 : ') (haproxy_name_show_dict,haproxy_server_show_dict) = backend_read(haproxy_file) print('\n================================================================') print ''' \033[31m 1. 查詢后端服務\033[0m \033[32m 2. 添加后端服務\033[0m \033[33m 3. 修改后端服務\033[0m \033[35m 4. 刪除后端服務\033[0m \033[36m 5. 退出\033[0m ''' print('\n================================================================') select_num = raw_input('\033[33m請選擇操作條目:\033[0m') #######################1. 查詢后端服務################################ if select_num == '1': query_flag = True ###初始化查詢循環標志### while query_flag: backend_index = raw_input('\033[32;1m請輸入查詢的backend編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,query_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) #######################2. 添加后端服務################################ if select_num == '2': add_flag = True ###初始化添加循環標志### while add_flag: backend_index = raw_input('\033[32;1m請輸入添加的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,add_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) add_server_dict = OrderedDict() print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m') add_server_dict['name'] = name_decide() ###對輸入的name有效性進行判斷### add_server_dict['address'] = ipaddress_decide() ###對輸入的IP有效性進行判斷### add_server_dict['weight'] = number_decide('權重值') ###對輸入的權重有效性進行判斷### add_server_dict['maxconn'] = number_decide('最大連接數') ###對輸入的連接數有效性進行判斷### print(add_server_dict['name'],add_server_dict['address'],add_server_dict['weight'],add_server_dict['maxconn']) #############對輸入的四個服務信息是否成功判斷############# if add_server_dict['name'] and add_server_dict['address'] and add_server_dict['weight'] and add_server_dict['maxconn']: add_commit = raw_input('請確認是否添加此條目(y | n):') if add_commit == 'y': ###確認添加服務條目,並回寫配置文件### haproxy_server_show_dict[backend_name].append(add_server_dict) backend_server_handle(haproxy_file,haproxy_server_show_dict) else: add_flag = False ###否則退出本次循環### else: print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m') #######################3. 修改后端服務################################# if select_num == '3': backend_modify_flag = True ###初始化修改循環標志### while backend_modify_flag: backend_index = raw_input('\033[32;1m請輸入修改的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,backend_modify_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) server_modify_flag = True ###初始化server條目修改標志位### while server_modify_flag: server_index = raw_input('\033[32;1m請輸入修改的server的編號(返回上層菜單,請輸入b):\033[0m') if len(server_index) != 0: server_index = input_handle(server_index) if server_index == 'b': ###輸入b,返還上一層### server_modify_flag = False #####################指定具體的server編號進行判斷##### elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]): modify_server_dict = OrderedDict() print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m') modify_server_dict['name'] = name_decide() ###對輸入的四個信息有效性進行判斷### modify_server_dict['address'] = ipaddress_decide() modify_server_dict['weight'] = number_decide('權重值') modify_server_dict['maxconn'] = number_decide('最大連接數') print(modify_server_dict['name'],modify_server_dict['address'],modify_server_dict['weight'],modify_server_dict['maxconn']) ######對輸入的四個服務信息是否成功判斷############# if modify_server_dict['name'] and modify_server_dict['address'] and modify_server_dict['weight'] and modify_server_dict['maxconn']: modify_commit = raw_input('請確認是否修改此條目(y | n):') if modify_commit == 'y': ###確認修改服務條目,並回寫配置文件### haproxy_server_show_dict[backend_name][server_index - 1] = modify_server_dict backend_server_handle(haproxy_file,haproxy_server_show_dict) modify_server_flag = False else: ###否則退出本次循環### modify_server_flag = False else: print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m') else: print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m') #######################4. 刪除后端服務################################ if select_num == '4': backend_delete_flag = True ###初始化刪除循環標志### while backend_delete_flag: backend_index = raw_input('\033[32;1m請輸入刪除的backend下條目編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,backend_delete_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) server_delete_flag = True ###初始化server條目刪除標志位### while server_delete_flag: server_index = raw_input('\033[32;1m請輸入刪除的server的編號(返回上層菜單,請輸入b):\033[0m') if len(server_index) != 0: server_index = input_handle(server_index) if server_index == 'b': ###輸入b,返還上一層### server_delete_flag = False #####################指定具體的server編號進行判斷##### elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]): print(haproxy_server_show_dict[backend_name][server_index - 1]) delete_commit = raw_input('請確認是否刪除此條目(y | n):') if delete_commit == 'y': ###確認刪除服務條目,並回寫配置文件### del haproxy_server_show_dict[backend_name][server_index - 1] backend_server_handle(haproxy_file,haproxy_server_show_dict) delete_server_flag = False else: ###否則退出本次循環### delete_server_flag = False else: print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m') #######################5. 退出程序###################### if select_num == '5': sys.exit('\033[32m 退出程序,歡迎下次光臨,謝謝\033[0m')
六、python3.4代碼:

#!/usr/bin/python34 ''' Created on 2016年1月17日 @author: 王凱 ''' import os,sys,re,time from collections import defaultdict,OrderedDict ######################input輸入字符類型轉化函數####################### def input_handle(s): if str.isdigit(s): ###對輸入是否是數字進行判斷### s = int(s) ###如果輸出的是個數字,則轉化為整數類型### return s ###返回輸入字符### #####################名稱或變量名輸入判斷函數############################# def name_decide(): (name,name_flag) = ('',True) ###初始化返回的名稱和判斷標志位### while name_flag: name_input = input('\033[32m請輸入新服務名:(退出輸入q)\033[0m') if len(name_input) == 0: ###如果輸入為空則直接下一次循環### continue elif name_input == 'q': ###輸入q,退出本次輸入### name_flag = False elif re.match('[0-9a-zA-Z\_]+',name_input): ###匹配輸入是否以字符、數字或下划線開頭### name = name_input name_flag = False ###輸入成功后退出循環### else: print('\033[31m名稱輸入錯誤,請重新輸入!!!\033[0m') return(name) ###返回輸入的結果### #####################IP地址及端口輸入判斷函數############################# def ipaddress_decide(): (address,address_flag) = ('',True) ###初始化返回的IP地址和判斷標志位### while address_flag: address_input = input('\033[32m請輸入新地址(IP哦):(退出輸入q)\033[0m') if len(address_input) == 0: ###如果輸入為空則直接下一次循環### continue elif address_input == 'q': ###輸入q,退出本次輸入### address_flag = False ##################匹配輸入是否是ip:port的格式###################### elif re.match('(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(\:\d{1,5})?$',address_input): address = address_input address_flag = False ###輸入成功后退出循環### else: print('\033[31m地址輸入錯誤,請重新輸入!!!\033[0m') return(address) ###返回輸入的結果### ####################數字輸入判斷函數###################################### def number_decide(name): (number,number_flag) = ('',True) ###初始化返回的數字和判斷標志位### while number_flag: number_input = input('\033[32m請輸入 %s (數字哦):(退出輸入q)\033[0m' % name) if len(number_input) == 0: ###如果輸入為空則直接下一次循環### continue elif number_input == 'q': ###輸入q,退出本次輸入### number_flag = False else: try: int(number_input) ###匹配輸入是否是數字### except: print('\033[31m %s 輸入錯誤,請重新輸入!!!\033[0m' % name) else: number = number_input number_flag = False ###輸入成功后退出循環### return(number) ###返回輸入的結果### #############################backend輸入判斷函數########################## def backend_input_if(input_index,input_dict): (input_name,input_flag) = ('',True) ###初始化返回的名稱和判斷標志位### ###############如果輸入非空,對輸入進行判斷並轉化類型################# if len(input_index) != 0: input_index = input_handle(input_index) if input_index == 'b': ###如果輸入為b,則退出程序### input_flag = False elif input_index in input_dict.keys(): ###如果輸入為數字編號,則從字典中獲取具體backend名稱### input_name = input_dict[input_index] elif input_index in input_dict.values(): ###如果輸入為backend名稱,則直接獲取### input_name = input_index else: input_name = '' ###輸入其他字符,賦值變量為空### return(input_name,input_flag) ###返回輸入的結果和循環標志位### ###########################backend列表展示函數############################ def backend_read(file): backend_list = [] ###初始化backend的列表### show_dict = {} ###初始化要返回的顯示字典### backend_name_dict = defaultdict(list) ###定義一個value為列表的字典,用來存放server### server_flag = False ###初始化server判斷標志位### with open(file,'r') as ha: ###打開haproxy配置文件### for line in ha: server_dict = OrderedDict() ###定義一個有序字典### line = line.strip('\n') if re.match('backend',line): ###匹配配置文件以backend開頭的行### backend_name = re.split('\s+',line)[1] backend_list.append(backend_name) ###將配置到的backend的名稱插入到列表### server_flag = True ###賦值標志位為真,用來與server關聯### elif server_flag and re.match('\s+server',line): ###匹配配置文件以server開頭的行### server_info = re.split('\s+',line) ###對server進行分隔### server_dict['name'] = server_info[2] ###對server的具體信息進行字典賦值### server_dict['address'] = server_info[3] server_dict['weight'] = server_info[5] server_dict['maxconn'] = server_info[7] backend_name_dict[backend_name].append(server_dict) ###將server字典與backend的名稱進行關聯### else: server_flag = False ###當server沒匹配到,賦值標志位為假,結束關聯### for k,v in enumerate(backend_list,1): show_dict[k] = v ###對backend名稱進行新字典賦值,方便查詢和展示### print('%d . %s' % (k,v)) ###輸出backend列表### return(show_dict,backend_name_dict) ###返回顯示的字典和backend-server字典### ########################顯示backend后端服務器函數############################# def backend_server_show(backend_show_value,server_show_dict): ############對backend名稱進行遍歷並加上數字編號########################### print('\n================================================================') print('后端服務器(%s)信息如下 : ' % backend_show_value) print('%-5s %-20s %-20s %-20s %-20s' % ('id','name','address','weight','maxconn')) server_list = server_show_dict[backend_show_value] for k,v in enumerate(server_list,1): ###用enumerate進行server展示### print('%-5s ' % k,end='') for kk,vv in v.items(): print('%-20s ' % vv,end='') print() print('\n================================================================') ########################backend后端服務操作並回寫配置文件函數################# def backend_server_handle(file,handle_dict): newfile = '%s.new' % file ###定義回寫的新文件### server_flag = False with open(file,'r') as read_file,open(newfile,'w') as write_file: ###同時打開二文件,一個讀,一個寫### for line in read_file: if re.match('backend',line): ###匹配到backend行時進行server信息插入### write_file.write(line) backend_name = re.split('\s+',line)[1] for server_dict in handle_dict[backend_name]: ###對backend-server字典進行遍歷### server_line = '\tserver {name} {address} weight {weight} maxconn {maxconn}\n' write_file.write(server_line.format(**server_dict)) ###將指定的backend下的server條目插入文件### server_flag = True ###指定標志位為真,方便server判斷### elif server_flag and re.match('\s+server',line): ###匹配server開頭的行,跳過不做任何操作### pass else: write_file.write(line) ###其他的行,直接插入新文件### server_flag = False print('\033[33m server更新成功\033[0m') os.system('mv %s %s.bak' % (file,file)) ###對源配置文件進行備份### os.system('mv %s %s' % (newfile,file)) ###對新生成的配置文件進行改名### ##################################主程序開始################################## if __name__ == '__main__': flag = True haproxy_file = 'haproxy.cfg' ###指定haproxy配置文件### backend_name = '' haproxy_name_show_dict = {} ###初始化backend顯示字典### haproxy_server_show_dict = {} ###初始化server顯示字典### while flag: os.system('clear') ###清屏### print('\n================================================================') print('\033[33m 歡迎訪問haproxy配置文件管理平台:\033[0m') print('\nbackend列表信息如下 : ') (haproxy_name_show_dict,haproxy_server_show_dict) = backend_read(haproxy_file) print('\n================================================================') print(''' \033[31m 1. 查詢后端服務\033[0m \033[32m 2. 添加后端服務\033[0m \033[33m 3. 修改后端服務\033[0m \033[35m 4. 刪除后端服務\033[0m \033[36m 5. 退出\033[0m ''') print('\n================================================================') select_num = input('\033[33m請選擇操作條目:\033[0m') #######################1. 查詢后端服務################################ if select_num == '1': query_flag = True ###初始化查詢循環標志### while query_flag: backend_index = input('\033[32;1m請輸入查詢的backend編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,query_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) #######################2. 添加后端服務################################ if select_num == '2': add_flag = True ###初始化添加循環標志### while add_flag: backend_index = input('\033[32;1m請輸入添加的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,add_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) add_server_dict = OrderedDict() print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m') add_server_dict['name'] = name_decide() ###對輸入的name有效性進行判斷### add_server_dict['address'] = ipaddress_decide() ###對輸入的IP有效性進行判斷### add_server_dict['weight'] = number_decide('權重值') ###對輸入的權重有效性進行判斷### add_server_dict['maxconn'] = number_decide('最大連接數') ###對輸入的連接數有效性進行判斷### print(add_server_dict['name'],add_server_dict['address'],add_server_dict['weight'],add_server_dict['maxconn']) #############對輸入的四個服務信息是否成功判斷############# if add_server_dict['name'] and add_server_dict['address'] and add_server_dict['weight'] and add_server_dict['maxconn']: add_commit = input('請確認是否添加此條目(y | n):') if add_commit == 'y': ###確認添加服務條目,並回寫配置文件### haproxy_server_show_dict[backend_name].append(add_server_dict) backend_server_handle(haproxy_file,haproxy_server_show_dict) else: add_flag = False ###否則退出本次循環### else: print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m') #######################3. 修改后端服務################################# if select_num == '3': backend_modify_flag = True ###初始化修改循環標志### while backend_modify_flag: backend_index = input('\033[32;1m請輸入修改的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,backend_modify_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) server_modify_flag = True ###初始化server條目修改標志位### while server_modify_flag: server_index = input('\033[32;1m請輸入修改的server的編號(返回上層菜單,請輸入b):\033[0m') if len(server_index) != 0: server_index = input_handle(server_index) if server_index == 'b': ###輸入b,返還上一層### server_modify_flag = False #####################指定具體的server編號進行判斷##### elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]): modify_server_dict = OrderedDict() print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m') modify_server_dict['name'] = name_decide() ###對輸入的四個信息有效性進行判斷### modify_server_dict['address'] = ipaddress_decide() modify_server_dict['weight'] = number_decide('權重值') modify_server_dict['maxconn'] = number_decide('最大連接數') print(modify_server_dict['name'],modify_server_dict['address'],modify_server_dict['weight'],modify_server_dict['maxconn']) ######對輸入的四個服務信息是否成功判斷############# if modify_server_dict['name'] and modify_server_dict['address'] and modify_server_dict['weight'] and modify_server_dict['maxconn']: modify_commit = input('請確認是否修改此條目(y | n):') if modify_commit == 'y': ###確認修改服務條目,並回寫配置文件### haproxy_server_show_dict[backend_name][server_index - 1] = modify_server_dict backend_server_handle(haproxy_file,haproxy_server_show_dict) modify_server_flag = False else: ###否則退出本次循環### modify_server_flag = False else: print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m') else: print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m') #######################4. 刪除后端服務################################ if select_num == '4': backend_delete_flag = True ###初始化刪除循環標志### while backend_delete_flag: backend_index = input('\033[32;1m請輸入刪除的backend下條目編號或名稱(返回上層菜單,請輸入b):\033[0m') ##############################對輸入值進行判斷################ (backend_name,backend_delete_flag) = backend_input_if(backend_index,haproxy_name_show_dict) if backend_name: ###顯示對應backend下的server列表### backend_server_show(backend_name,haproxy_server_show_dict) server_delete_flag = True ###初始化server條目刪除標志位### while server_delete_flag: server_index = input('\033[32;1m請輸入刪除的server的編號(返回上層菜單,請輸入b):\033[0m') if len(server_index) != 0: server_index = input_handle(server_index) if server_index == 'b': ###輸入b,返還上一層### server_delete_flag = False #####################指定具體的server編號進行判斷##### elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]): print(haproxy_server_show_dict[backend_name][server_index - 1]) delete_commit = input('請確認是否刪除此條目(y | n):') if delete_commit == 'y': ###確認刪除服務條目,並回寫配置文件### del haproxy_server_show_dict[backend_name][server_index - 1] backend_server_handle(haproxy_file,haproxy_server_show_dict) delete_server_flag = False else: ###否則退出本次循環### delete_server_flag = False else: print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m') #######################5. 退出程序###################### if select_num == '5': sys.exit('\033[32m 退出程序,歡迎下次光臨,謝謝\033[0m')
七、效果圖:
1、 初始菜單直接顯示backend列表,並列出選擇菜單:
2、 輸入1,選擇查詢菜單,並輸入backend的名稱或編號,均可,並展示對應名稱下的server信息:
3、 輸入b可以返回上層菜單,輸入2進入添加server條目:
4、 輸入server對應的name,address,weight,maxconn,並對有效性進行判斷:
添加成功后查看結果:
注:
name以數字、字母、下划線開頭(其中包含數字的原因是可以輸入ip地址)
address可以是單獨的ip地址,也可以是ip加端口的形式,例:192.168.100.3或192.168.100.3:8080
weight和maxconn必須輸入數字,大小暫時沒有限制
5、 輸入b可以返回上層菜單,輸入3進入修改server條目,並對www.oldboy.org下的sky條目進行修改:
同樣對輸入的server有效性進行判斷,最后確認回寫配置文件,查看修改結果:
6、 輸入b可以返回上層菜單,輸入4進入刪除server條目,並對指定條目進行修改:
7、輸入b可以返回上層菜單,輸入5,即可退出程序。
八、針對python2.7和python3.4的代碼區別:
1、print的使用。
2、python2.7下使用raw_input,python3.4下使用input。