HAproxy配置文件操作
1. 根据用户输入输出对应的backend下的server信息
2. 可添加backend 和sever信息
3. 可修改backend 和sever信息
4. 可删除backend 和sever信息
5. 操作配置文件前进行备份
6 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作
流程图:
配置文件信息如下
global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option dontlognull listen stats :8888 stats enable stats uri /admin stats auth admin:1234 frontend oldboy.org bind 0.0.0.0:80 option httplog option httpclose option forwardfor log global acl www hdr_reg(host) -i www.oldboy.org use_backend www.oldboy.org if www backend www.oldboy.org server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 server 100.1.9.9 100.1.9.9 weight 20 maxconn 3000 backend buy.oldboy.org server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
代码如下:
#!/usr/bin/env python3 # -*-conding:utf-8-** # __Author__:'liudong' import json, shutil def fetch(backend): """ 根据用户输入站点查找对应配置项目 :param backend: 从主程序读取的用户输入的站点配置条目 :return: 返回配置的值 """ config_list = [] with open('ha.conf', 'r', encoding='utf-8') as f: flag = False # 用于标志所读内容是否为需要的数据 for line in f: if line.strip().startswith('backend') and line.strip() == "backend " + backend: # 判断以backend开始,且后面内容和用户输入的域名相同,即所需要查询的配置条目 flag = True continue if line.strip().startswith('backend'): # 判断以backend开头,与用户输入域名不相同、即不是要查询的配置项目 flag = False # break if flag and line.strip(): config_list.append(line.strip()) # print(confg_list) return config_list def add(backend, record): """ 用于增加用户输入的配置项目 :param backend: 用户输入的要增加的backend和域名 :param record: 用户输入的服务器记录 :return: """ record_list = fetch(backend) if not record_list: # backend不存在,没找到要修改的backend with open('ha.conf', 'r') as old, open("new.conf", 'w') as new: for line in old: new.write(line) new.write(" backend " + backend + " ") new.write(" " * 8 + record + " ") # print('Added sucessed!') else: # 用户输入的backend存在 if record in record_list: # 用户输入的backend项和record均已经存在 shutil.copy('ha.conf', 'new.conf') # 复制配置文件到新文件中 print('The config list you added is exits,No configure file was changed!') else: # 用户输入的backend已经存在,record不存在 record_list.append(record) # 把用户输入的配置记录内容,添加到列表record_list中 with open('ha.conf', 'r') as old, open('new.conf', 'w') as new: flag = False # 判断是否读取到backend开关的标识符 for line in old: # 一行一行读取原配置文件 if line.strip().startswith("backend ") and line.strip() == "backend " + backend: # 如果该行以backend开始并且等于用户输入的backend域名 flag = True new.write(line) for new_line in record_list: new.write(" " * 8 + new_line) continue if flag and line.strip().startswith("backend"): flag = False new.write(line) continue if line.strip() and not flag: new.write(line) print('modified successed! new record is %s %s' % (backend, record)) shutil.copy('ha.conf', 'ha.bak') # /备份原文件 shutil.copy('new.conf', 'ha.conf') # 把新修改好的文件改成正式文件 def del_Item(backend): """ 用于删除用户输入的配置项目 :param backend: 用户输入的要删除的backend和域名 :param record: 用户输入的要删除的服务器记录 :return: """ record_list = fetch(backend) print(record_list) if not record_list: # 没找到要删除的配置项目 with open('ha.conf', 'r') as old, open("new.conf", 'w') as new: for line in old: new.write(line) print('There is no item, No need to delete!') else: # 用户输入的backend存在 with open('ha.conf', 'r') as old, open('new.conf', 'w') as new: flag = False # 判断是否读取到backend开关的标识符 for line in old: # 一行一行读取原配置文件 if line.strip().startswith("backend ") and line.strip() == "backend " + backend: # 如果该行以backend开始并且等于用户输入的backend域名 flag = True continue # new.write(line) # for new_line in record_list: # new.write(" " * 8 + new_line + " ") # continue if flag and line.strip().startswith("backend"): flag = False new.write(line) continue if line.strip() and not flag: new.write(line) print('%s is deleted!' % backend) shutil.copy('ha.conf', 'ha.bak') # /备份原文件 shutil.copy('new.conf', 'ha.conf') # 把新修改好的文件改成正式文件 if __name__ == '__main__': while True: print('Welcome to ha config tools'.center(50, '-')) # 读取用户第一项选择内容 start_choice = input('1.获取ha记录 2.增加ha记录 3.删除ha记录 Please input what you want to do:[q=quit]') print(''.center(50, '-')) if start_choice == 'q': exit() elif start_choice == '1': option1_choice = input('1.查询配置,请输入backend项目域名:') # 用户输入要查询的域名 print_conf = fetch(option1_choice) # 保存返回的内容 print('你要查询的配置为:') print(print_conf) # 打印返回的配置内容:列表形式 # print(''.center(50, '-')) elif start_choice == '2': str_exa = '{"backend":"ttt.jachy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":3000}}' mod_config = input('2.选择要修改的配置项目及配置条目,格式%s:' % str_exa) dic = json.loads(mod_config) bk = dic["backend"] rd = "server %s %s weight %s maxconn %s" % (dic['record']['server'], dic['record']['server'], dic['record']['weight'], dic['record']['maxconn']) # print(bk + ' ') # print(rd) add(bk, rd) elif start_choice == '3': str_del = '{"backend":"ttt.jachy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":3000}}' del_config = input('2.选择要删除的配置项目及配置条目,格式%s:' % str_del) del_dic = json.loads(del_config) del_bk = del_dic["backend"] # del_rd = "server %s %s weight %s maxconn %s" % (dic['record']['server'], # dic['record']['server'], # dic['record']['weight'], # dic['record']['maxconn']) del_Item(del_bk) else: print('input error!')
readme
作者:liudong
程序实现查询、增加、删除backend项目中域名和服务器信息的功能。
1.查询时,输入域名查询该backend域名对应的服务器配置信息。
2.增加域名和服务器配置信息:
用户输入增加的信息时需要按{"backend":"ttt.jachy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":3000}}格式输入,
程序使用json数据流转换为字典处理。
2.1已经存在相关信息时,直接写入新文件new.conf。
2.2已经存在域名,没有服务器信息时,增加至该域名配置下一行,并写入新配置文件new.conf。
2.3如果域名和服务器信息均不存在,末尾追加backend和域名服务器信息至新配置文件new.conf。
备份原文件ha.conf到ha.bak,把new.conf更名为ha.conf。
3.删除域名和服务器配置信息:
域名不存在时,直接把原配置文件ha.conf内容写入新文件new.conf。
域名存在时,跳过该行及该项目配置信息,把其余的内容从原文件ha.conf写入新配置文件new.conf。
备份原文件ha.conf到ha.bak,把new.conf更名为ha.conf。