ha_proxy配置文件修改程式ha_file 為存儲配置信息的文件。運行的時候對該文件進行操作。1.查詢信息:用戶輸入功能變數名稱,獲得功能變數名稱相關信息2.修改配置文件:用戶輸入的格式應該為 {"backend": "test.oldboy.org","record":{"server": "100.1.7. ...
ha_proxy配置文件修改程式
ha_file 為存儲配置信息的文件。運行的時候對該文件進行操作。
1.查詢信息:用戶輸入功能變數名稱,獲得功能變數名稱相關信息
2.修改配置文件:用戶輸入的格式應該為 {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
然後執行判斷,如果輸入的backend存在,則判斷對應的信息是否重覆,如果重覆,則提醒用戶,同時對配置文件不做更改。
如果輸入的信息與原配置信息不符,則追加到相應的backend下。
如果輸入的backend不存在,則追加到文件末尾。
3.刪除信息:用戶輸入存在的功能變數名稱,則刪除功能變數名稱和相應的配置文件。如果不存在,則提示錯誤。
下麵是ha_file文件信息
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 server 100.1.7.9 100.1.7.9 weight 20 maxconn 300 31 server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000ha_file
下麵是主要程式代碼,
1 #!/use/bin/env python 2 #_*_ coding:utf_8 _*_ 3 import json,time,os,sys 4 5 time_now=time.strftime('%Y-%m-%d %H:%M:%S') 6 time_flag=time.strftime('%Y-%m-%d-%H-%M-%S') 7 8 9 if __name__ =='__main__': 10 """ 11 主函數,通過判斷用戶輸入執行相應操作 12 :return: 13 """ 14 while True: 15 print( 16 ''' 17 --------------------------------------- 18 請輸入下列編號進行操作,按q退出: 19 1:獲取haproxy記錄 20 2:增加haproxy記錄 21 3: 刪除haproxy記錄 22 ---------------------------------------- 23 ''') 24 get_mun = input('請輸入操作序號:') 25 if get_mun == 'q': 26 exit('bye') 27 if get_mun.isdigit: 28 get_mun = int(get_mun) 29 if get_mun == 1: #如果選擇1,則執行get_ha() 30 read = input("請輸入backend:(例如:www.oldboy.org)") 31 ha_list = get_ha(read) 32 if len(ha_list)!= 0: 33 print(ha_list) 34 else: 35 print('沒有找到相應記錄,請檢查輸入是否正確') 36 elif get_mun == 2: 37 add_ha() 38 elif get_mun == 3: 39 del_domain = input('請輸入想要刪除的值:') 40 del_ha(del_domain)main()
main函數調用其他幾個函數,分別為查詢記錄,增加記錄和刪除記錄
定義查詢函數
1 def get_ha(get_read): 2 """ 3 定義查詢函數 4 :param get_read:用戶輸入想查詢的信息 5 :return:返回查詢結果 6 """ 7 get_flags = 0 #設置標識符,當匹配到輸入時置為1 8 get_list = [] #將匹配到的內容放在列表中 9 with open('ha_file','r',encoding='utf-8') as f: 10 for line in f.readlines(): 11 line = line.strip() #去掉多餘的空格和換行符 12 if line == 'backend %s'%get_read: 13 get_flags = 1 14 elif line.startswith('backend'): 15 get_flags = 0 16 elif get_flags == 1 and len(line)!= 0 : 17 get_list.append(line) 18 return get_listget_ha()
定義增加函數
1 def add_ha(): 2 while True: 3 add_resource_str = input('請輸入想要增加的記錄: ') 4 result_check = check_input(add_resource_str) 5 if result_check == False: 6 print('請輸入正確格式') 7 if result_check == True: 8 add_resource = json.loads(add_resource_str) #取得輸入的值 9 domain_info = add_resource['backend'] 10 server_info = add_resource['record']['server'] 11 weight_info = add_resource['record']['weight'] 12 maxcont_info = add_resource['record']['maxconn'] 13 match_info = ('server {} {} weight {} maxconn {}').format(server_info,server_info,weight_info,maxcont_info) 14 #match_info 判斷信息是否存在,不存在則添加進文件 15 # print(match_info,type(match_info)) 16 # print(domain_info) 17 get_match = get_ha(domain_info) #原文件已經存在的記錄 18 # print(get_match[0]) 19 if get_match != []:#功能變數名稱信息存在 20 if get_match[0] == match_info: 21 print('信息已存在,不做更改') 22 else: 23 #功能變數名稱信息存在,但是有更新,f1為原文件,f2為備份文件 24 with open('ha_file','r',encoding='utf-8') as f1: 25 all_config = f1.readlines() 26 match_item = 'backend {}\n'.format(domain_info) #獲得更新後的配置信息 27 #print(match_item) 28 if str(match_item) in all_config: 29 update_index = all_config.index(str(match_item)) 30 insert_record_index = int(update_index) +1 31 all_config.insert(int(insert_record_index),8*' '+match_info+'\n') #將數據插入 32 with open('ha_new','w',encoding='utf-8') as f2: 33 f2.writelines(all_config) 34 os.rename('ha_file','ha_bak%s'%(time_flag)) 35 os.rename('ha_new','ha_file') 36 else: #原文件不存在相同功能變數名稱,追加到文件末尾 37 with open('ha_file','r',encoding='utf-8') as f1,open('ha_new','w',encoding='utf-8') as f2: 38 all_config = f1.readlines() 39 str_append = (''' 40 backend %s 41 %s 42 '''%(domain_info,match_info))# 字元串預格式化 43 all_config.append(str_append) 44 f2.writelines(all_config) 45 os.rename('ha_file','ha_bak') 46 os.rename('ha_new','ha_file') 47 returnadd_ha
定義刪除函數
1 def get_ha(get_read): 2 """ 3 定義查詢函數 4 :param get_read:用戶輸入想查詢的信息 5 :return:返回查詢結果 6 """ 7 get_flags = 0 #設置標識符,當匹配到輸入時置為1 8 get_list = [] #將匹配到的內容放在列表中 9 with open('ha_file','r',encoding='utf-8') as f: 10 for line in f.readlines(): 11 line = line.strip() #去掉多餘的空格和換行符 12 if line == 'backend %s'%get_read: 13 get_flags = 1 14 elif line.startswith('backend'): 15 get_flags = 0 16 elif get_flags == 1 and len(line)!= 0 : 17 get_list.append(line) 18 return get_listdel_ha
由於本次為手動輸入記錄,對格式有嚴格的要求,所以定義一個檢查輸入的函數。實際環境中應該是從其他地方get到格式化好的值。
1 def check_input(check_dir): 2 """ 3 檢查輸入格式是否正確 4 :param check_str: 5 :return: 6 """ 7 try: 8 check = json.loads(check_dir) 9 domain_info = check['backend'] 10 server_info = check['record']['server'] 11 weight_info = check['record']['weight'] 12 maxcont_info = check['record']['maxconn'] 13 14 except: 15 return False 16 else: 17 return Truecheck_input