2019独角兽企业重金招聘Python工程师标准>>>
Python days3作业
作业需求 HAproxy配置文件操作
- 根据用户输入,输出对应的backend下的server信息
- 可添加backend 和sever信息
- 可修改backend 和sever信息
- 可删除backend 和sever信息
- 操作配置文件前进行备份
- 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作
- [x] 博客
- [x] 查询backend下的server信息
- [x] 添加backend和server信息
- [ ] 修改backend 和sever信息
- [x] 删除backend和server信息
博客地址
ygqygq2的博客地址
基本流程图
程序代码
#!/usr/bin/env python
# _*_coding:utf-8_*_
'''* Created on 2016/11/7 21:24.* @author: Chinge_Yang.
'''import shutil
import jsondef list_function():print("Please choice the ID of a action.".center(50, "#"))print("【1】.Fetch haproxy.cfg backend infomation.")print("【2】.Add haproxy.cfg backend infomation.")print("【3】.Delete haproxy.cfg backend infomation.")print("End".center(50, "#"))def fetch(backend):# 取出backend相关server信息result = [] # 定义结果列表with open("haproxy.cfg", "r", encoding="utf-8") as f: # 循环读取文件flag = False # 标记为假for line in f:# 以backend开头line = line.strip()if line.startswith("backend") and line == "backend " + backend:flag = True # 读取到backend开头的信息,标记为真continue# 下一个backend开头if flag and line.strip().startswith("backend"):flag = Falsebreak# server信息添加到result列表if flag and line.strip():result.append(line.strip())return resultdef writer(backend, record_list):with open("haproxy.cfg", "r") as old, open("new.cfg", "w") as new:flag = Falsefor line in old:if line.strip().startswith('backend') and line.strip() == "backend " + backend:flag = Truenew.write(line)for new_line in record_list:new.write(" " * 4 + new_line + "\n")continue # 跳到下一次循环,避免下一个backend写二次if flag and line.strip().startswith("backend"): # 下一个backendflag = Falsenew.write(line)continue # 退出此循环,避免server信息二次写入if line.strip() and not flag:new.write(line)def add(backend, record):global change_flagrecord_list = fetch(backend) # 查找是否存在记录if not record_list: # backend不存在, record不存在with open('haproxy.cfg', 'r') as old, open('new.cfg', 'w') as new:for line in old:new.write(line)# 添加新记录new.write("\nbackend " + backend + "\n")new.write(" " * 4 + record + "\n")print("\033[32;1mAdd done\033[0m")change_flag = Trueelse: # backend存在,record存在if record in record_list:print("\033[31;1mRecord already in it,Nothing to do!\033[0m")change_flag = Falseelse: # backend存在,record不存在record_list.append(record)writer(backend, record_list)print("\033[32;1mAdd done\033[0m")change_flag = Truedef delete(backend, record):global change_flagrecord_list = fetch(backend) # 查找是否存在记录if not record_list: # backend不存在, record不存在print("Not match the backend,no need delete!".center(50, "#"))change_flag = Falseelse: # backend存在,record存在if record in record_list:record_list.remove(record) # 移除元素writer(backend, record_list) # 写入print("\033[31;1mDelete done\033[0m")change_flag = Trueelse: # backend存在,record不存在print("Only match backend,no need delete!".center(50, "#"))change_flag = Falsereturn change_flagdef output(servers):# 输出指定backend的server信息print("Match the server info:".center(50, "#"))for server in servers:print("\033[32;1m%s\033[0m" % server)print("#".center(50, "#"))def input_json():# 判断输入,要求为json格式continue_flag = Falsewhile continue_flag is not True:backend_record = input("Input backend info(json):").strip()try:backend_record_dict = json.loads(backend_record)except Exception as e:print("\033[31;1mInput not a json data type!\033[0m")continuecontinue_flag = Truereturn backend_record_dictdef operate(action):global change_flagif action == "fetch":backend_info = input("Input backend info:").strip()result = fetch(backend_info) # 取出backend信息if result:output(result) # 输出获取到的server信息else:print("\033[31;1mNot a match is found!\033[0m")elif action is None:print("\033[31;1mNothing to do!\033[0m")else:backend_record_dict = input_json() # 要求输入json格式for key in backend_record_dict:backend = keyrecord = backend_record_dict[key]if action == "add":add(backend, record)elif action == "delete":delete(backend, record)if change_flag is True: # 文件有修改,才进行文件更新# 将操作结果生效shutil.copy("haproxy.cfg", "old.cfg")shutil.copy("new.cfg", "haproxy.cfg")result = fetch(backend)output(result) # 输出获取到的server信息def judge_input():# 判断输入功能编号,执行相应步骤input_info = input("Your input number:").strip()if input_info == "1": # 查询指定backend记录action = "fetch"elif input_info == "2": # 添加backend记录action = "add"elif input_info == "3": # 删除backend记录action = "delete"elif input_info == "q" or input_info == "quit":exit("Bye,thanks!".center(50, "#"))else:print("\033[31;1mInput error!\033[0m")action = Nonereturn actiondef main():exit_flag = Falsewhile exit_flag is not True:global change_flagchange_flag = Falselist_function()action = judge_input()operate(action)if __name__ == '__main__':main()
HAproxy配置文件操作
1.程序说明
实现功能如下
- [x] 查询backend下的server信息
- [x] 添加backend和server信息
- [ ] 修改backend 和sever信息
- [x] 删除backend和server信息
2.程序测试配置文件
cat haproxy.cfg
globallog 127.0.0.1 local2daemonmaxconn 256log 127.0.0.1 local2 info
defaultslog globalmode httptimeout connect 5000mstimeout client 50000mstimeout server 50000msoption dontlognull
listen stats :8888stats enablestats uri /adminstats auth admin:1234
frontend 51cto.combind 0.0.0.0:80option httplogoption httpcloseoption forwardforlog globalacl www hdr_reg(host) -i test01.example.comuse_backend test01.example.com if www
backend test01.example.comserver 100.1.7.10 100.1.7.10 weight 20 maxconn 3000
backend test.comserver 100.1.7.90 100.1.7.90 weight 20 maxconn 3000server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000server 100.1.7.13 100.1.7.13 weight 20 maxconn 3000backend www.test.comserver 100.1.7.13 100.1.7.13 weight 20 maxconn 3000
3.程序测试
python config_haproxy.py
执行结果:
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:1
Input backend info:test.com
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:2
Input backend info(json):{"test.com":"testtest.com"}
Add done
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
testtest.com
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:1
Input backend info:test.com
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
testtest.com
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:3
Input backend info(json):{"test.com":"testtest.com"}
Delete done
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:4
Input error!
Nothing to do!
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:3
Input backend info(json):d
Input not a json data type!
Input backend info(json):{"test01.example.com":"server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000"}
########Only match backend,no need delete!########
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:q
###################Bye,thanks!####################Process finished with exit code 1