利用Python的文件操作命令和函数功能,实现 : 1、获取ha记录 2、增加ha记录 3、删除ha记录
结果:
如果都已经存在:
如果下级record不存在:
增加后的文档:
特点在于只使用了两种状态的flag,先从简单逻辑写起,再复杂实现。使用了内存列表read_result,将record.strip() in read_result进行判断记录和复写。
import json import shutil def fetch(backend): # backend = "www.oldboy.org" with open("haproxy", 'r', encoding="utf-8") as f: result = [] flag = False for line in f: if line.strip().startswith("backend") and line.strip() == "backend " + backend: print("当前所在backend %s 开头" % backend) flag = True continue # 表示下面的不执行,进入下次迭代,不过修改了flag = True if line.strip().startswith("backend") and flag: print("读到下个backend了") break if not line.strip() and flag: print("读到了空白行") break if flag and line.strip(): print("读到server了") result.append(line.strip()) return result def add_backend(backend, record): read_result = fetch(backend) # backend不存在 if not read_result: print("正增加新backend...") with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f: for line in old_f: new_f.write(line) new_f.write("\n{}\n".format(backend)) new_f.write(record) else: # backend已存在 print("backend已存在") if record.strip() in read_result: # backend 和 record 都已存在 print("backend 和 record 都已存在") shutil.copy("haproxy", 'haproxy_new') # 拷贝一份 else: # backend存在,但record不存在 print("backend存在,但record不存在") read_result.append(record.strip()) flag = False with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f: for line in old_f: if line.strip() == "backend " + backend and line.strip().startswith("backend"): print("-->>当前所在backend %s 开头" % backend) flag = True new_f.write(line) for new_record in read_result: new_f.write("{}{}\n".format(" " * 8, new_record)) continue # 表示记录了当前行,跳过下面语句,否则会重写一行 if flag and not line.strip(): flag = False print("-->>读到空白了") new_f.write(line) continue if not flag: print("-->>读到其他") new_f.write(line) command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录") if command == "1": put_backend = input("请输入要获取的backend:") # backend = "www.oldboy.org" "buy.oldboy.org" ret = fetch(put_backend) print("\n".join(ret)) elif command == "2": # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}} # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}} put_backend = input("请输入要增加的backend:") dict_backend = json.loads(put_backend) # str转换为字典 bk = dict_backend['backend'] rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'], dict_backend['record']['weight'], dict_backend['record']['maxconn']) add_backend(bk, rd)特点是,增加backend时不需要用到fecth进行全部的扫描,只需要读一行,判断一行,写一行。
import json import shutil def fetch(backend): # backend = "www.oldboy.org" with open("haproxy", 'r', encoding="utf-8") as f: result = [] flag = False for line in f: if line.strip().startswith("backend") and line.strip() == "backend " + backend: print("当前所在backend %s 开头" % backend) flag = True continue # 表示下面的不执行,进入下次迭代,不过修改了flag = True if line.strip().startswith("backend") and flag: print("读到下个backend了") break if not line.strip() and flag: print("读到了空白行") break if flag and line.strip(): print("读到server了") result.append(line.strip()) return result def add2(backend, record): with open('haproxy', 'r', encoding='utf-8') as old, open('new.conf', 'w', encoding='utf-8') as new: in_backend = False has_backend = False has_record = False for line in old: if line.strip().startswith('backend') and line.strip() == "backend " + backend: print("已存在backend") has_backend = True in_backend = True new.write(line) continue if in_backend and not line.strip(): print("in_backend的结尾为空白行") if not has_record: print("没有record") new.write(record + '\n') # 先写record, new.write(line) # 再写当前的空白行 in_backend = False continue if in_backend and line.strip() == record.strip(): print("backend和record都已存在") has_record = True new.write(line) continue new.write(line) if not has_backend: # 写backend,写record print("backend不存在,正在增加...") new.write('\nbackend ' + backend + '\n') new.write(record + '\n') command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录") if command == "1": put_backend = input("请输入要获取的backend:") # backend = "www.oldboy.org" "buy.oldboy.org" ret = fetch(put_backend) print("\n".join(ret)) elif command == "2": # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}} # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}} put_backend = input("请输入要增加的backend:") dict_backend = json.loads(put_backend) # str转换为字典 bk = dict_backend['backend'] rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'], dict_backend['record']['weight'], dict_backend['record']['maxconn']) add2(bk, rd)