• 第三周作业 修改配置文件


    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。

     
     
  • 相关阅读:
    Androidproject文件下assets目录与res目录的差别
    tomcat 实现域名crm.test.com訪问
    全文索引--自己定义chinese_lexer词典
    Elasticsearch 之 慘痛部署(分片移位)
    iOS开发核心语言Objective C —— 全部知识点总结
    [LeedCode OJ]#28 Implement strStr()
    【Django】 gunicorn部署纪要
    PKI(公钥基础设施)基础知识笔记
    Cocoapods Undefined symbols for architecture armv7sarm64
    Android开发Tips(3)
  • 原文地址:https://www.cnblogs.com/ld1977/p/6019073.html
Copyright © 2020-2023  润新知