• Python 修改ha配置文件


    任务要求:

    1、用户输入字符串
        {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
        
    
    2、在对应的backend下,添加一条新记录 
        backend不存在时,创建
    
    
    3、删除一条记录
        backend没有值时,删除    
    
    4、查询一个backend记录  

    流程图: 

    代码:

      1、主文件

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/10/12 16:26
    # @Author  : evescn
    # @Site    : edit haproxy.cfg file
    # @File    : hp_new.py
    # @Software: PyCharm
    
    import json
    import os
    import sys
    
    
    def login(func):
        def loginning(*args,**kwargs):
            # 验证用户帐号和密码函数
            # global name
            lock = "lock.txt"
            loginfile = "password.txt"
            login_info = 0
            i = 0
    
            while i < 3 and login_info == 0:
                name = input("Please input your name: ")
                with open(lock, "r") as f:
                    for line in f:
                        # if name in line:
                        if name == line.strip():
                            sys.exit('33[32:1m用户 %s 已经被锁定33[0m' % name)
                password = input("Please input password: ")
                with open(loginfile, "r") as f:
                    for line in f:
                        user_file, pass_file = line.split()
                        if user_file == name and pass_file == password:
                            # print("Bingo!")
                            login_info = 1
                            continue
                    else:
                        if login_info != 1:
                            print("You name or password is error!")
                            i += 1
            else:
                if i == 3 and login_info == 0:
                    f = open(lock, "a")
                    f.write(name + "
    ")
                    f.close()
                    print('33[32:1m用户 %s 已经被锁定33[0m' % name)
            return func(*args, **kwargs)
        return loginning
    
    
    def fetch(backend):
        backend_title = 'backend %s' % backend
        record_list = []
        with open('ha') as obj:
            flag = False
            for line in obj:
                line = line.strip()
                if line == backend_title:
                    flag = True
                    continue
                if flag and line.startswith('backend'):
                    flag = False
                    break
    
                if flag and line:
                    record_list.append(line)
    
        return record_list
    
    
    def add(dict_info):
        backend = dict_info.get('backend')
        record_list = fetch(backend)
        # print(record_list)
        sign = 1
        backend_title = "backend %s" % backend
        current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn'])
        if not record_list:
            record_list.append(backend_title)
            record_list.append(current_record)
            with open('ha') as read_file, open('ha.new', 'w') as write_file:
                flag = False
                for line in read_file:
                    write_file.write(line)
                for i in record_list:
                    if i.startswith('backend'):
                        write_file.write(i + '
    ')
                    else:
                        write_file.write("%s%s
    " % (8 * " ", i))
        else:
            record_list.insert(0, backend_title)
            # print(record_list)
            if current_record not in record_list:
                record_list.append(current_record)
                with open('ha') as read_file, open('ha.new', 'w') as write_file:
                    flag = False
                    has_write = False
                    for line in read_file:
                        line_strip = line.strip()
                        if line_strip == backend_title:
                            flag = True
                            continue
                        if flag and line_strip.startswith('backend'):
                            flag = False
                        if not flag:
                            write_file.write(line)
                        else:
                            if not has_write:
                                for i in record_list:
                                    if i.startswith('backend'):
                                        write_file.write(i + '
    ')
                                    else:
                                        write_file.write("%s%s
    " % (8 * " ", i))
                            has_write = True
            else:
                sign = 0
                print("该IP记录已存在,请重新确认信息")
        if sign == 1:
            move_filename()
    
    
    def remove(dict_info):
        backend = dict_info.get('backend')
        record_list = fetch(backend)
        backend_title = "backend %s" % backend
        current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn'])
        if not record_list:
            print("该backend记录不在配置文件中,请检测后重新输入!")
            return
        else:
            if current_record not in record_list:
                print("该主机配置记录不正确,请检测后重新输入!")
                return
            else:
                del record_list[record_list.index(current_record)]
                if len(record_list) > 0:
                    record_list.insert(0, backend_title)
            with open('ha') as read_file, open('ha.new', 'w') as write_file:
                flag = False
                has_write = False
                for line in read_file:
                    line_strip = line.strip()
                    if line_strip == backend_title:
                        flag = True
                        continue
                    if flag and line_strip.startswith('backend'):
                        flag = False
                    if not flag:
                        write_file.write(line)
                    else:
                        if not has_write:
                            for i in record_list:
                                if i.startswith('backend'):
                                    write_file.write(i + '
    ')
                                else:
                                    write_file.write("%s%s
    " % (8 * " ", i))
                        has_write = True
        move_filename()
    
    
    def move_filename():
        for file in os.listdir('.'):
            if file == "ha.bak":
                os.remove(file)
        os.rename('ha', 'ha.bak')
        os.rename('ha.new', 'ha')
        print("操作成功")
    
    
    def show():
        # 显示信息函数
        print("*****************************")
        print("1、获取ha记录")
        print("2、增加ha记录")
        print("3、删除ha记录")
        print("4、退出系统")
        print("*****************************")
        return
    
    @login
    def main():
        while True:
            # 输出显示信息
            show()
    
            num = input('请输入序号:')
    
            if num == '1':
                data = input('请输入内容:')
                ret = fetch(data)
                for i in ret:
                    print(i)
            elif num == '4':
                sys.exit("欢迎再次使用haproxy修改系统")
            else:
                data = input('请输入内容:')
                dict_data = json.loads(data)
                if num == '2':
                    add(dict_data)
                elif num == '3':
                    remove(dict_data)
                else:
                    print("你输入的操作系列号有误!请重新输入。")
    
    
    if __name__ == '__main__':
        main()  

      2、用户帐号密码文件

    # password.txt
    evescn gmkk
    gmkk 12321  

      3、ha配置文件

    # ha配置文件
    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.119 100.1.7.119 weight 20 maxconn 30
            server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
            server 100.1.7.19 100.1.7.19 weight 20 maxconn 30
            server 100.1.7.12 100.1.7.12 weight 20 maxconn 30
    
    backend buy.oldboy.org
            server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000  

    运行结果:

      1、查询记录

    Please input your name: evescn
    Please input password: gmkk
    *****************************
    1、获取ha记录
    2、增加ha记录
    3、删除ha记录
    4、退出系统
    *****************************
    请输入序号:1
    请输入内容:www.oldboy.org
    server 100.1.7.119 100.1.7.119 weight 20 maxconn 30
    server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
    server 100.1.7.19 100.1.7.19 weight 20 maxconn 30
    server 100.1.7.12 100.1.7.12 weight 20 maxconn 30
    *****************************  

      2、增加记录

    *****************************
    1、获取ha记录
    2、增加ha记录
    3、删除ha记录
    4、退出系统
    *****************************
    请输入序号:2
    请输入内容:{"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
    操作成功
    *****************************
    
    # ha配置文件
    .......
    backend buy.oldboy.org
            server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
    
    backend test.oldboy.org
            server 100.1.7.9 100.1.7.9 weight 20 maxconn 30  

      3、删除记录

    *****************************
    1、获取ha记录
    2、增加ha记录
    3、删除ha记录
    4、退出系统
    *****************************
    请输入序号:3
    请输入内容:{"backend": "buy.oldboy.org","record":{"server": "100.1.7.90","weight": 20,"maxconn": 3000}}
    操作成功
    *****************************
    
    
    # ha配置文件
    ......
    backend www.oldboy.org
            server 100.1.7.119 100.1.7.119 weight 20 maxconn 30
            server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
            server 100.1.7.19 100.1.7.19 weight 20 maxconn 30
            server 100.1.7.12 100.1.7.12 weight 20 maxconn 30
    
    backend test.oldboy.org
            server 100.1.7.9 100.1.7.9 weight 20 maxconn 30  
  • 相关阅读:
    laravel phpstorm IDE 代码提示
    vue的样式绑定
    asp.net mvc视图中使用entitySet类型数据时提示出错
    Linq to SQL 中将数字转换为字符串
    jquery submit()不能提交表单的解决方法
    命名空间“System.Web”中不存在类型或命名空间名称“Optimization”(是否缺少程序集引用?)
    没有为扩展名“.cshtml”注册的生成提供程序
    WP REST API: 设置和使用OAuth 1.0a Authentication(原文)
    解决"要执行请求的操作,WordPress需要访问您网页服务器的权限"
    Mysql添加用户错误:ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value解决方法
  • 原文地址:https://www.cnblogs.com/evescn/p/7659389.html
Copyright © 2020-2023  润新知