1.需求
HAproxy配置文件操作
根据用户输入,输出对应的backend下的server信息
可添加backend 和sever信息
可修改backend 和sever信息
可删除backend 和sever信息
操作配置文件前进行备份
2.流程图
3.代码
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author Kevin Liu import json import shutil def input_check(s): """ 检查用户输入是否是数字 :param s:用户输入 :return:返回用户选择 """ if str.isdigit(s): s = int(s) return s def fetch(backend): #取出配置文件的匹配信息 result = [] #把返回值取到这个列表 with open("conf","r") as f: flag = False for line in f: #一次读取一行文件内容 #如果找到的不是空行而且是以"backend"开头,而且内容是"backend +用户输入,就是找到了配置项,"backend "这里有个空格 if line.strip().startswith("backend") and line.strip() == "backend " + backend: flag = True #找到了backend 可以跳出本次循环,需要取出backend后面的配置项 continue if flag and line.strip().startswith("backend"): #找到第二个backend,则可以退出了 flag = False break if flag and line.strip(): #如果flag是真,并且不是空行,就把内容写入result result.append(line.strip()) #print(result) return result def delete(backend,record): """ 删除函数 :param backend:需要删除的配置项 :param record: 需要删除的记录 :return: """ global delete_flag #删除标记,用户控制是否删除 record_list = fetch(backend) #先用fetch找到需要删除的地方 if not record_list: print(("没有找到需要删除的项。").center(50,"*")) delete_flag = False #没有找到需要删除的对象,所以标记为假 else: if record in record_list: #找到了删除的backend和record,执行删除 record_list.remove(record) print("\033[31;已经删除完成\033[0m") delete_flag = True #删除标记设为真 else: print(("配置项下没有没有可以删除的记录").center(50,"*")) #找到了backend,但是没有找到record,也不删除 delete_flag = False return delete_flag #返回是否删除 def modify(backend,record_list): """ 修改配置文件函数 :param backend:需要修改的配置项 :param record_list: 需要修改的记录 :return: 没有返回值 """ with open("conf",'r') as old,open("new",'w') as new: #打开2个配置文件,把修改record写入新配置文件 flag = False for line in old: #找到需要修改的配置项 if line.strip().startswith("backend") and line.strip() == "backend " + backend: flag = True new.write(line) #先写入record for new_line in record_list: #写入需要修改的recored new.write(" " * 6 + new_line + "\n") continue #跳出本次循环,继续查找下一个backend下面的record #找到下一个backend if flag and line.strip().startswith("backend"): #写入backend后面的record flag = False new.write(line) continue if not flag and line.strip(): #写入配置文件剩下的内容 new.write(line) def add(backend,record): """ 增加函数 :param backend:需要增加的配置项 :param record: 需要增加的record :return: 没有返回值 """ #先找到需要增加的配置项backend record_list = fetch(backend) #如果record不存在,而且backend也不存在 if not record_list: with open("conf","r") as old,open("new","w")as new: for line in old: #备份配置文件 new.write(line) #写入配置项和record new.write("\nbackend " + backend + "\n") new.write(" " * 6 + record + "\n") print("\033[32;1m添加完成\033[0m") else: #backend 存在 record也存在 if record in record_list: print("\033[31;1m记录已经存在,无需添加\033[0m") else: #backend存在,record不存在,则追加记录,并调用modify函数修改完成 record_list.append(record) modify(backend,record_list) print("\033[32;1m添加完成\033[0m") def input_json(): """ 判断用户输入是否是json格式 :return: 返回配置项的字典值 """ flag = False while flag is not True: backend = input("输入配置文件信息").strip() try: backend_dict = json.loads(backend) except Exception as e: print("请输入json格式") continue flag = True return backend_dict def input_judge(): """ 用户输入判断函数 :return: 根据用户输入返回对应的函数值 """ input_str = input("输入数字选择:").strip() if input_str == "1": func = "fetch" elif input_str == "2": func = "add" elif input_str == "3": func = "delete" elif input_str == "q" or input_str == "quit": exit(("拜拜!").center(50,'*')) else: print("输入有误,再来") func = None return func def operation(action): """ 操作函数,再用户输入完成后调用对应的函数 :param action: 根据input_judge的返回值输入 :return: 没有返回值 """ global change_flag if action == "fetch": backend_info = input("输入需要操作的配置项").strip() #查找配置项信息 result = fetch(backend_info) #找到了 if result: output(result) else: print("没有找到匹配项") elif action is None: print("没有任何输入!") else: #获取输入字典值 backend_record_dict = input_json() #对输入是不是json格式判断 for key in backend_record_dict: backend = key record = backend_record_dict[key] if action == "add": add(backend,record) elif action == "delete": delete(backend,record) if change_flag is True: shutil.copy("conf","old") shutil.copy("new","conf") result = fetch(backend) output(result) def list(): """ 用户ui接口函数 :return: 没有返回值 """ print("选择一个需要的操作".center(60,"*")) print("【1】查找配置项信息") print("【2】增加配置项信息") print("【3】删除配置项信息") print("-".center(60,"-")) def output(servers): """ 输出record的内容信息 :param servers: record列表 :return: """ print("匹配到的配置项信息:".center(60,"*")) for server in servers: print("%s" % server) print("*".center(60,"*")) def main(): """ 主函数入口 :return: """ exit_flag = False while exit_flag is not True: global change_flag change_flag = False list() action = input_judge() operation(action) main()