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()

浙公网安备 33010602011771号