• [ python ] 项目:haproxy配置文件增删改查


    1. 开发要求

    实现对 haproxy.cfg 增删改查操作

    2. 程序介绍

    # 作者:hkey
    
    # 博客地址:https://www.cnblogs.com/hukey/p/9288279.html
    
    # 功能实现:对 haproxy.cfg 增删改查
    
    # 目录结构:
    haproxy/
    ├── haproxy.cfg     # haproxy 主配置文件
    └── ops.py            # 操作程序
    
    
    # 使用说明:
    
        1. 查询
        2. 新增
        3. 修改
        4. 删除
        5. 退出
    README

    3. 程序逻辑图

    4. 程序代码

    global
        log         127.0.0.1 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
    
        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats
    
    defaults
        mode                    http
        log                     global
        option                  httplog
        option                  dontlognull
        #option http-server-close
        #option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000
    
    backend www.super.com
        server 10.0.10.1 weight 20 maxconn 30
        server 10.0.10.2 weight 999 maxconn 20
    
    backend www.super1.com
        server 10.0.10.1 weight 20 maxconn 30
        server 10.0.10.2 weight 999 maxconn 20
        server 10.0.10.3 weight 999 maxconn 20
    
    backend www.super2.com
        server 10.0.10.2 weight 20 maxconn 21
        server 10.0.10.20 weight 30 maxconn 40
        server 10.0.10.3 weight 20 maxconn 21
    backend www.super20.com
        server 10.0.0.10 10.0.10.10 weight 20 maxconn 21
    haproxy.cfg
    # -*- coding: utf-8 -*-
    # Author: hkey
    import os
    
    def file_handle(backend_data, src=None, type='fetch'):
        '''解耦函数'''
        if type == 'fetch':
            with open('haproxy.cfg', 'r') as read_f:
                ret = []
                Flag = False
                for read_line in read_f:
                    if backend_data == read_line.strip():
                        Flag = True
                        continue
                    if Flag == True and read_line.startswith('backend'):
                        break
                    if Flag:
                        print('33[42;1m%s33[0m' % read_line, end='')
                        ret.append(read_line)
            return ret
    
        elif type == 'change':
            with open('haproxy.cfg', 'r') as read_f, open('haproxy.conf', 'w') as write_f:
                flag = False
                has_write = False
                for read_line in read_f:
                    if read_line.strip() == backend_data:
                        flag = True
                        continue
                    if flag and read_line.startswith('backend'):
                        flag = False
                    if not flag:
                        write_f.write(read_line)
                    else:
                        if not has_write:
                            for record in src:
                                write_f.write(record)
                            has_write = True
            os.rename('haproxy.cfg', 'haproxy.cfg_bak')
            os.rename('haproxy.conf', 'haproxy.cfg')
            os.remove('haproxy.cfg_bak')
    
    
    def fetch(find_str):
        '''查询功能'''
        backend_str = 'backend %s' % find_str
        return file_handle(backend_str)
    
    def add(backend):
        '''新增功能'''
        print('这是新增功能.')
        backend_list = fetch(backend)
        if not backend_list:
            return '33[41;1mbackend不存在。33[0m'
        new_server = input('输入新增server:')
        backend_data = 'backend %s' % backend
        backend_list.insert(0, '%s
    %s
    ' % (backend_data, new_server))
        return file_handle(backend_data, src=backend_list, type='change')
    
    
    def change(modify_data):
        '''修改功能'''
        print('这是修改功能.')
        modify_data = eval(modify_data)
        backend = modify_data[0]['backend']
        backend_data = 'backend %s' % backend
        backend_list = fetch(backend)
        old_server = '%sserver %s weight %s maxconn %s
    ' %(' ' *4, modify_data[0]['record']['server'],
                                               modify_data[0]['record']['weight'], modify_data[0]['record']['maxconn'])
        new_server = '%sserver %s weight %s maxconn %s
    ' %(' ' *4, modify_data[1]['record']['server'],
                                               modify_data[1]['record']['weight'], modify_data[1]['record']['maxconn'])
    
        if not backend_list and old_server not in backend_list:
            return '修改的记录不存在。'
        else:
            index = backend_list.index(old_server)
            backend_list[index] = new_server
            backend_list.insert(0, '%s
    ' % backend_data)
            return file_handle(backend_data, src=backend_list, type='change')
    
    def delete(backend):
        '''删除功能'''
        print('这是删除功能.')
        backend_list = fetch(backend)
        if not backend_list:
            return '33[41;1mbackend 【%s】不存在。33[0m' % backend
        del_server = input('输入要删除的server:') + '
    '
        if del_server not in backend_list:
            return '33[41;1m输入的server不存在。33[0m'
        else:
            backend_data = 'backend %s' % backend
            backend_list.insert(0, '%s
    ' %backend_data)
            backend_list.remove(del_server)
            return file_handle(backend_data, src=backend_list, type='change')
    
    
    if __name__ == '__main__':
        msg = '''
        1. 查询
        2. 新增
        3. 修改
        4. 删除
        5. 退出
        '''
    
        msg_dict = {
            '1': fetch,
            '2': add,
            '3': change,
            '4': delete,
        }
    
        while True:
            print(msg)
            choice = input('>>>').strip()
            if not choice: continue
            if choice == '5': break
            find_str = input('请输入你的数据:').strip()
            res = msg_dict[choice](find_str)
            print(res)
    ops.py

    5. 程序运行展示

    (1)查询

    (2)新增

        server 1.1.1.1 weight 1 maxconn 1(前面4个空格)

    (3)修改

    [{'backend': 'www.super2.com', 'record':{'server': '10.0.10.20', 'weight': 30, 'maxconn': 40}}, {'backend': 'www.super2.com', 'record':{'server': '10.0.10.200', 'weight': 100, 'maxconn': 100}}]

    (4)删除

        server 1.1.1.1 weight 1 maxconn 1(开头4个空格)

    (5)退出

  • 相关阅读:
    SQL Server的AlwaysOn错误19456和41158
    kvm上的Linux虚拟机使用virtio磁盘
    利用HAProxy代理SQL Server的AlwaysOn辅助副本
    KVM安装部署
    ola.hallengren的SQL Server维护脚本
    在单链表的第i个位置后插入一个节点(阿里+腾讯等面试题总结)
    怎么发现RAC环境中'library cache pin'等待事件的堵塞者(Blocker)?
    php unserialize 返回false的解决方法
    千万别让这些举动断送了你的职业前程-好文共分享
    Android开发:仿美团下拉列表菜单,帮助类,复用简单
  • 原文地址:https://www.cnblogs.com/hukey/p/9288279.html
Copyright © 2020-2023  润新知