zoukankan      html  css  js  c++  java
  • [ 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)退出

  • 相关阅读:
    shell 字符串切分成数组
    RDD关键性能考量之 内存管理
    RDD关键性能考量之 序列化格式
    【转】Linux ln(link) 命令详解
    【转】redis配置认证密码
    【转】MongoDB 知识要点一览
    RDD关键性能考量之 并行度
    使用thumbnailator不按照比例,改变图片的大小
    Linux服务器redhat配置本地yum源
    Oracle表字段的增删改和重命名
  • 原文地址:https://www.cnblogs.com/hukey/p/9288279.html
Copyright © 2011-2022 走看看