對haproxy配置文件進行操做python
要求:mysql
對haproxy配置文件中backend下的server實現增刪改查的功能git
1、這個程序有二個版本web
一、 python2.7版本見haproxy_python27.pysql
二、 python3.4版本見haproxy_python34.py後端
2、具體實現了以下功能:服務器
一、輸入1,進入backend菜單,查詢server信息app
二、輸入2,進入backend菜單,添加server條目frontend
三、輸入3,進入backend菜單,選擇server條目,進入修改環節python2.7
四、輸入4,進入backend菜單,選擇server條目,進入刪除環節
五、輸入5,退出程序
3、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 haproxy配置文件
4、流程圖以下:
5、python2.7代碼:
#!/usr/bin/python27
#_*_ coding=utf-8 _*_ 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 =