Python 修改ha配置文件

本文介绍了一个使用Python编写的HAProxy配置管理系统,支持增删改查等操作,通过用户输入实现对HAProxy配置文件的自动化管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务要求:

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('\033[32:1m用户 %s 已经被锁定\033[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 + "\n")
                f.close()
                print('\033[32:1m用户 %s 已经被锁定\033[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 + '\n')
                else:
                    write_file.write("%s%s\n" % (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 + '\n')
                                else:
                                    write_file.write("%s%s\n" % (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 + '\n')
                            else:
                                write_file.write("%s%s\n" % (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  

 

转载于:https://www.cnblogs.com/python-gm/p/7659389.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值