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 3000
下面是主要程序代码,
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函数调用其他几个函数,分别为查询记录,增加记录和删除记录
定义查询函数
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_list
定义增加函数
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 {} '.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+' ') #将数据插入 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 return
定义删除函数
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_list
由于本次为手动输入记录,对格式有严格的要求,所以定义一个检查输入的函数。实际环境中应该是从其他地方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 True