第三周作业 修改配置文件

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
View Code

代码如下:

#!/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!')
View Code

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。

 
 
原文地址:https://www.cnblogs.com/ld1977/p/6019073.html