python之haproxy配置文件操作(第三天)


作業:

對haproxy配置文件進行操作

要求:

     對haproxy配置文件中backend下的server實現增刪改查的功能

 

一、這個程序有二個版本

1、 python2.7版本見haproxy_python27.py

2、 python3.4版本見haproxy_python34.py

 

二、具體實現了如下功能:
     1、輸入1,進入backend菜單,查詢server信息
     2、輸入2,進入backend菜單,添加server條目
     3、輸入3,進入backend菜單,選擇server條目,進入修改環節
     4、輸入4,進入backend菜單,選擇server條目,進入刪除環節
     5、輸入5,退出程序

三、haproxy配置文件如下:

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
        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.7.10 100.1.7.10 weight 10 maxconn 2000

frontend mysql
        bind *:3306
        mode tcp
        log global
        default_backend mysqlserver

backend mysqlserver
        server mysql1 10.1.1.110:3306 weight 20 maxconn 300
        server mysql2 10.1.1.120:3306 weight 10 maxconn 200
haproxy配置文件

 

四、流程圖如下:

 

 

五、python2.7代碼:

#!/usr/bin/python27
#_*_ coding=utf-8 _*_
'''
Created on 2016年1月17日
@author: 王凱
'''
import os,sys,re,time
from collections import defaultdict,OrderedDict

######################raw_input輸入字符類型轉化函數#######################
def input_handle(s):
    if str.isdigit(s):                                                     ###對輸入是否是數字進行判斷###
        s = int(s)                                                         ###如果輸出的是個數字,則轉化為整數類型###
    return s                                                              ###返回輸入字符###

#####################名稱或變量名輸入判斷函數#############################
def name_decide():
    (name,name_flag) = ('',True)                                           ###初始化返回的名稱和判斷標志位###

    while name_flag:
        name_input = raw_input('\033[32m請輸入新服務名:(退出輸入q)\033[0m')
        if len(name_input) == 0:                                           ###如果輸入為空則直接下一次循環###
            continue
        elif name_input == 'q':                                           ###輸入q,退出本次輸入###
            name_flag = False
        elif re.match('[0-9a-zA-Z\_]+',name_input):                       ###匹配輸入是否以字符、數字或下划線開頭###
            name = name_input
            name_flag = False                                              ###輸入成功后退出循環###
        else:
            print('\033[31m名稱輸入錯誤,請重新輸入!!!\033[0m')
    return(name)                                                          ###返回輸入的結果###

#####################IP地址及端口輸入判斷函數#############################
def ipaddress_decide():
    (address,address_flag) = ('',True)                                     ###初始化返回的IP地址和判斷標志位###

    while address_flag:
        address_input = raw_input('\033[32m請輸入新地址(IP哦):(退出輸入q)\033[0m')
        if len(address_input) == 0:                                        ###如果輸入為空則直接下一次循環###
            continue
        elif address_input == 'q':                                        ###輸入q,退出本次輸入###
            address_flag = False
        ##################匹配輸入是否是ip:port的格式######################
        elif re.match('(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(\:\d{1,5})?$',address_input):
            address = address_input
            address_flag = False                                           ###輸入成功后退出循環###
        else:
            print('\033[31m地址輸入錯誤,請重新輸入!!!\033[0m')
    return(address)                                                       ###返回輸入的結果###

####################數字輸入判斷函數######################################
def number_decide(name):
    (number,number_flag) = ('',True)                                      ###初始化返回的數字和判斷標志位###

    while number_flag:
        number_input = raw_input('\033[32m請輸入 %s (數字哦):(退出輸入q)\033[0m' % name)
        if len(number_input) == 0:                                        ###如果輸入為空則直接下一次循環###
            continue
        elif number_input == 'q':                                        ###輸入q,退出本次輸入###
            number_flag = False
        else:
            try:
                int(number_input)                                         ###匹配輸入是否是數字###
            except:
                print('\033[31m %s 輸入錯誤,請重新輸入!!!\033[0m' % name)
            else:
                number = number_input
                number_flag = False                                       ###輸入成功后退出循環###

    return(number)                                                       ###返回輸入的結果###

#############################backend輸入判斷函數##########################
def backend_input_if(input_index,input_dict):

    (input_name,input_flag) = ('',True)                                   ###初始化返回的名稱和判斷標志位###

    ###############如果輸入非空,對輸入進行判斷並轉化類型#################
    if len(input_index) != 0:
        input_index = input_handle(input_index)
    if input_index == 'b':                                                ###如果輸入為b,則退出程序###
        input_flag = False
    elif input_index in input_dict.keys():                                ###如果輸入為數字編號,則從字典中獲取具體backend名稱###
        input_name = input_dict[input_index]
    elif input_index in input_dict.values():                              ###如果輸入為backend名稱,則直接獲取###
        input_name = input_index
    else:
        input_name = ''                                                    ###輸入其他字符,賦值變量為空###

    return(input_name,input_flag)                                         ###返回輸入的結果和循環標志位###


###########################backend列表展示函數############################
def backend_read(file):
    backend_list = []                                                       ###初始化backend的列表###
    show_dict = {}                                                          ###初始化要返回的顯示字典###
    backend_name_dict = defaultdict(list)                                   ###定義一個value為列表的字典,用來存放server###

    server_flag = False                                                     ###初始化server判斷標志位###

    with open(file,'r') as ha:                                             ###打開haproxy配置文件###
        for line in ha:
            server_dict = OrderedDict()                                      ###定義一個有序字典###
            line = line.strip('\n')

            if re.match('backend',line):                                    ###匹配配置文件以backend開頭的行###
                backend_name = re.split('\s+',line)[1]
                backend_list.append(backend_name)                            ###將配置到的backend的名稱插入到列表###

                server_flag = True                                           ###賦值標志位為真,用來與server關聯###
            elif server_flag and re.match('\s+server',line):               ###匹配配置文件以server開頭的行###

                server_info = re.split('\s+',line)                          ###對server進行分隔###

                server_dict['name'] = server_info[2]                        ###對server的具體信息進行字典賦值###
                server_dict['address'] = server_info[3]
                server_dict['weight'] = server_info[5]
                server_dict['maxconn'] = server_info[7]

                backend_name_dict[backend_name].append(server_dict)          ###將server字典與backend的名稱進行關聯###
            else:
                server_flag = False                                          ###當server沒匹配到,賦值標志位為假,結束關聯###

    for k,v in enumerate(backend_list,1):
        show_dict[k] = v                                                     ###對backend名稱進行新字典賦值,方便查詢和展示###
        print('%d . %s' % (k,v))                                             ###輸出backend列表###

    return(show_dict,backend_name_dict)                                     ###返回顯示的字典和backend-server字典###


########################顯示backend后端服務器函數#############################
def backend_server_show(backend_show_value,server_show_dict):

    ############對backend名稱進行遍歷並加上數字編號###########################
    print('\n================================================================')
    print('后端服務器(%s)信息如下 : ' % backend_show_value)
    print('%-5s  %-20s  %-20s  %-20s  %-20s' % ('id','name','address','weight','maxconn'))

    server_list = server_show_dict[backend_show_value]
    for k,v in enumerate(server_list,1):                                      ###用enumerate進行server展示###
        print '%-5s' % k + ' ',
        for kk,vv in v.items():
            print '%-20s' % vv + ' ',
        print
    print('\n================================================================')

########################backend后端服務操作並回寫配置文件函數#################
def backend_server_handle(file,handle_dict):
    newfile = '%s.new' % file                                                ###定義回寫的新文件###
    server_flag = False

    with open(file,'r') as read_file,open(newfile,'w') as write_file:       ###同時打開二文件,一個讀,一個寫###
        for line in read_file:
            if re.match('backend',line):                                     ###匹配到backend行時進行server信息插入###
                write_file.write(line)

                backend_name = re.split('\s+',line)[1]
                for server_dict in handle_dict[backend_name]:                ###對backend-server字典進行遍歷###
                    server_line = '\tserver {name} {address} weight {weight} maxconn {maxconn}\n'
                    write_file.write(server_line.format(**server_dict))       ###將指定的backend下的server條目插入文件###

                server_flag = True                                           ###指定標志位為真,方便server判斷###
            elif server_flag and re.match('\s+server',line):                 ###匹配server開頭的行,跳過不做任何操作###
                pass
            else:
                write_file.write(line)                                        ###其他的行,直接插入新文件###
                server_flag = False
    print('\033[33m server更新成功\033[0m')    
    os.system('mv %s %s.bak' % (file,file))                                  ###對源配置文件進行備份###
    os.system('mv %s %s' % (newfile,file))                                   ###對新生成的配置文件進行改名###

##################################主程序開始##################################

if __name__ == '__main__':
    flag = True
    haproxy_file = 'haproxy.cfg'                                               ###指定haproxy配置文件###

    backend_name = ''
    haproxy_name_show_dict = {}                                                ###初始化backend顯示字典###
    haproxy_server_show_dict = {}                                              ###初始化server顯示字典###
    while flag:
        os.system('clear')                                                     ###清屏###
        print('\n================================================================')
        print('\033[33m 歡迎訪問haproxy配置文件管理平台:\033[0m')
        print('\nbackend列表信息如下 : ')
        (haproxy_name_show_dict,haproxy_server_show_dict) = backend_read(haproxy_file)
        print('\n================================================================')
        print '''
        \033[31m 1. 查詢后端服務\033[0m
        \033[32m 2. 添加后端服務\033[0m
        \033[33m 3. 修改后端服務\033[0m
        \033[35m 4. 刪除后端服務\033[0m
        \033[36m 5. 退出\033[0m '''
        print('\n================================================================')

        select_num = raw_input('\033[33m請選擇操作條目:\033[0m')

        #######################1. 查詢后端服務################################
        if select_num == '1':
            query_flag = True                                                 ###初始化查詢循環標志###
            while query_flag:
                backend_index = raw_input('\033[32;1m請輸入查詢的backend編號或名稱(返回上層菜單,請輸入b):\033[0m')

                ##############################對輸入值進行判斷################
                (backend_name,query_flag) = backend_input_if(backend_index,haproxy_name_show_dict)
                if backend_name:                                              ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

        #######################2. 添加后端服務################################
        if select_num == '2':
            add_flag = True                                                   ###初始化添加循環標志###
            while add_flag:
                backend_index = raw_input('\033[32;1m請輸入添加的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m')
                ##############################對輸入值進行判斷################
                (backend_name,add_flag) = backend_input_if(backend_index,haproxy_name_show_dict)

                if backend_name:                                              ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    add_server_dict = OrderedDict()
                    print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m')
                    add_server_dict['name'] = name_decide()                  ###對輸入的name有效性進行判斷###
                    add_server_dict['address'] = ipaddress_decide()          ###對輸入的IP有效性進行判斷###
                    add_server_dict['weight'] = number_decide('權重值')     ###對輸入的權重有效性進行判斷###
                    add_server_dict['maxconn'] = number_decide('最大連接數') ###對輸入的連接數有效性進行判斷###

                    print(add_server_dict['name'],add_server_dict['address'],add_server_dict['weight'],add_server_dict['maxconn'])

                    #############對輸入的四個服務信息是否成功判斷#############
                    if add_server_dict['name'] and add_server_dict['address'] and add_server_dict['weight'] and add_server_dict['maxconn']:
                        add_commit = raw_input('請確認是否添加此條目(y | n):')
                        if add_commit == 'y':                                 ###確認添加服務條目,並回寫配置文件###
                            haproxy_server_show_dict[backend_name].append(add_server_dict)
                            backend_server_handle(haproxy_file,haproxy_server_show_dict)
                        else:
                            add_flag = False                                  ###否則退出本次循環###
                    else:
                        print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m')

        #######################3. 修改后端服務#################################
        if select_num == '3':
            backend_modify_flag = True                                         ###初始化修改循環標志###
            while backend_modify_flag:
                backend_index = raw_input('\033[32;1m請輸入修改的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m')
                ##############################對輸入值進行判斷################
                (backend_name,backend_modify_flag) = backend_input_if(backend_index,haproxy_name_show_dict)

                if backend_name:                                               ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    server_modify_flag = True                                  ###初始化server條目修改標志位###
                    while server_modify_flag:

                        server_index = raw_input('\033[32;1m請輸入修改的server的編號(返回上層菜單,請輸入b):\033[0m')
                        if len(server_index) != 0:
                            server_index = input_handle(server_index)
                        if server_index == 'b':                               ###輸入b,返還上一層###
                            server_modify_flag = False
                        #####################指定具體的server編號進行判斷#####
                        elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):
                            modify_server_dict = OrderedDict()
                            print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m')
                            modify_server_dict['name'] = name_decide()        ###對輸入的四個信息有效性進行判斷###
                            modify_server_dict['address'] = ipaddress_decide()
                            modify_server_dict['weight'] = number_decide('權重值')
                            modify_server_dict['maxconn'] = number_decide('最大連接數')

                            print(modify_server_dict['name'],modify_server_dict['address'],modify_server_dict['weight'],modify_server_dict['maxconn'])

                            ######對輸入的四個服務信息是否成功判斷#############
                            if modify_server_dict['name'] and modify_server_dict['address'] and modify_server_dict['weight'] and modify_server_dict['maxconn']:
                                modify_commit = raw_input('請確認是否修改此條目(y | n):')
                                if modify_commit == 'y':                      ###確認修改服務條目,並回寫配置文件###
                                    haproxy_server_show_dict[backend_name][server_index - 1] = modify_server_dict
                                    backend_server_handle(haproxy_file,haproxy_server_show_dict)
                                    modify_server_flag = False

                                else:                                         ###否則退出本次循環###
                                    modify_server_flag = False
                            else:
                                print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m')
                        else:
                            print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m')

        #######################4. 刪除后端服務################################
        if select_num == '4':
            backend_delete_flag = True                                        ###初始化刪除循環標志###
            while backend_delete_flag:
                backend_index = raw_input('\033[32;1m請輸入刪除的backend下條目編號或名稱(返回上層菜單,請輸入b):\033[0m')
                ##############################對輸入值進行判斷################
                (backend_name,backend_delete_flag) = backend_input_if(backend_index,haproxy_name_show_dict)

                if backend_name:                                              ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    server_delete_flag = True                                 ###初始化server條目刪除標志位###
                    while server_delete_flag:

                        server_index = raw_input('\033[32;1m請輸入刪除的server的編號(返回上層菜單,請輸入b):\033[0m')
                        if len(server_index) != 0:
                            server_index = input_handle(server_index)
                        if server_index == 'b':                               ###輸入b,返還上一層###
                            server_delete_flag = False
                        #####################指定具體的server編號進行判斷#####
                        elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):

                            print(haproxy_server_show_dict[backend_name][server_index - 1])
                            delete_commit = raw_input('請確認是否刪除此條目(y | n):')
                            if delete_commit == 'y':                          ###確認刪除服務條目,並回寫配置文件###
                                del haproxy_server_show_dict[backend_name][server_index - 1]
                                backend_server_handle(haproxy_file,haproxy_server_show_dict)
                                delete_server_flag = False

                            else:                                             ###否則退出本次循環###
                                delete_server_flag = False
                        else:
                            print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m')

        #######################5. 退出程序######################
        if select_num == '5':
           sys.exit('\033[32m 退出程序,歡迎下次光臨,謝謝\033[0m')
haproxy_python27

 

六、python3.4代碼:

#!/usr/bin/python34
'''
Created on 2016年1月17日
@author: 王凱
'''
import os,sys,re,time
from collections import defaultdict,OrderedDict

######################input輸入字符類型轉化函數#######################
def input_handle(s):
    if str.isdigit(s):                                                     ###對輸入是否是數字進行判斷###
        s = int(s)                                                         ###如果輸出的是個數字,則轉化為整數類型###
    return s                                                              ###返回輸入字符###

#####################名稱或變量名輸入判斷函數#############################
def name_decide():
    (name,name_flag) = ('',True)                                           ###初始化返回的名稱和判斷標志位###

    while name_flag:
        name_input = input('\033[32m請輸入新服務名:(退出輸入q)\033[0m')
        if len(name_input) == 0:                                           ###如果輸入為空則直接下一次循環###
            continue
        elif name_input == 'q':                                           ###輸入q,退出本次輸入###
            name_flag = False
        elif re.match('[0-9a-zA-Z\_]+',name_input):                       ###匹配輸入是否以字符、數字或下划線開頭###
            name = name_input
            name_flag = False                                              ###輸入成功后退出循環###
        else:
            print('\033[31m名稱輸入錯誤,請重新輸入!!!\033[0m')
    return(name)                                                          ###返回輸入的結果###

#####################IP地址及端口輸入判斷函數#############################
def ipaddress_decide():
    (address,address_flag) = ('',True)                                     ###初始化返回的IP地址和判斷標志位###

    while address_flag:
        address_input = input('\033[32m請輸入新地址(IP哦):(退出輸入q)\033[0m')
        if len(address_input) == 0:                                        ###如果輸入為空則直接下一次循環###
            continue
        elif address_input == 'q':                                        ###輸入q,退出本次輸入###
            address_flag = False
        ##################匹配輸入是否是ip:port的格式######################
        elif re.match('(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(\:\d{1,5})?$',address_input):
            address = address_input
            address_flag = False                                           ###輸入成功后退出循環###
        else:
            print('\033[31m地址輸入錯誤,請重新輸入!!!\033[0m')
    return(address)                                                       ###返回輸入的結果###

####################數字輸入判斷函數######################################
def number_decide(name):
    (number,number_flag) = ('',True)                                      ###初始化返回的數字和判斷標志位###

    while number_flag:
        number_input = input('\033[32m請輸入 %s (數字哦):(退出輸入q)\033[0m' % name)
        if len(number_input) == 0:                                        ###如果輸入為空則直接下一次循環###
            continue
        elif number_input == 'q':                                        ###輸入q,退出本次輸入###
            number_flag = False
        else:
            try:
                int(number_input)                                         ###匹配輸入是否是數字###
            except:
                print('\033[31m %s 輸入錯誤,請重新輸入!!!\033[0m' % name)
            else:
                number = number_input
                number_flag = False                                       ###輸入成功后退出循環###

    return(number)                                                       ###返回輸入的結果###

#############################backend輸入判斷函數##########################
def backend_input_if(input_index,input_dict):

    (input_name,input_flag) = ('',True)                                   ###初始化返回的名稱和判斷標志位###

    ###############如果輸入非空,對輸入進行判斷並轉化類型#################
    if len(input_index) != 0:
        input_index = input_handle(input_index)
    if input_index == 'b':                                                ###如果輸入為b,則退出程序###
        input_flag = False
    elif input_index in input_dict.keys():                                ###如果輸入為數字編號,則從字典中獲取具體backend名稱###
        input_name = input_dict[input_index]
    elif input_index in input_dict.values():                              ###如果輸入為backend名稱,則直接獲取###
        input_name = input_index
    else:
        input_name = ''                                                    ###輸入其他字符,賦值變量為空###

    return(input_name,input_flag)                                         ###返回輸入的結果和循環標志位###


###########################backend列表展示函數############################
def backend_read(file):
    backend_list = []                                                       ###初始化backend的列表###
    show_dict = {}                                                          ###初始化要返回的顯示字典###
    backend_name_dict = defaultdict(list)                                   ###定義一個value為列表的字典,用來存放server###

    server_flag = False                                                     ###初始化server判斷標志位###

    with open(file,'r') as ha:                                             ###打開haproxy配置文件###
        for line in ha:
            server_dict = OrderedDict()                                      ###定義一個有序字典###
            line = line.strip('\n')

            if re.match('backend',line):                                    ###匹配配置文件以backend開頭的行###
                backend_name = re.split('\s+',line)[1]
                backend_list.append(backend_name)                            ###將配置到的backend的名稱插入到列表###

                server_flag = True                                           ###賦值標志位為真,用來與server關聯###
            elif server_flag and re.match('\s+server',line):               ###匹配配置文件以server開頭的行###

                server_info = re.split('\s+',line)                          ###對server進行分隔###

                server_dict['name'] = server_info[2]                        ###對server的具體信息進行字典賦值###
                server_dict['address'] = server_info[3]
                server_dict['weight'] = server_info[5]
                server_dict['maxconn'] = server_info[7]

                backend_name_dict[backend_name].append(server_dict)          ###將server字典與backend的名稱進行關聯###
            else:
                server_flag = False                                          ###當server沒匹配到,賦值標志位為假,結束關聯###

    for k,v in enumerate(backend_list,1):
        show_dict[k] = v                                                     ###對backend名稱進行新字典賦值,方便查詢和展示###
        print('%d . %s' % (k,v))                                             ###輸出backend列表###

    return(show_dict,backend_name_dict)                                      ###返回顯示的字典和backend-server字典###


########################顯示backend后端服務器函數#############################
def backend_server_show(backend_show_value,server_show_dict):

    ############對backend名稱進行遍歷並加上數字編號###########################
    print('\n================================================================')
    print('后端服務器(%s)信息如下 : ' % backend_show_value)
    print('%-5s %-20s %-20s %-20s %-20s' % ('id','name','address','weight','maxconn'))

    server_list = server_show_dict[backend_show_value]
    for k,v in enumerate(server_list,1):                                      ###用enumerate進行server展示###
        print('%-5s ' % k,end='')
        for kk,vv in v.items():
            print('%-20s ' % vv,end='')
        print()
    print('\n================================================================')

########################backend后端服務操作並回寫配置文件函數#################
def backend_server_handle(file,handle_dict):
    newfile = '%s.new' % file                                                ###定義回寫的新文件###
    server_flag = False

    with open(file,'r') as read_file,open(newfile,'w') as write_file:       ###同時打開二文件,一個讀,一個寫###
        for line in read_file:
            if re.match('backend',line):                                     ###匹配到backend行時進行server信息插入###
                write_file.write(line)

                backend_name = re.split('\s+',line)[1]
                for server_dict in handle_dict[backend_name]:                ###對backend-server字典進行遍歷###
                    server_line = '\tserver {name} {address} weight {weight} maxconn {maxconn}\n'
                    write_file.write(server_line.format(**server_dict))       ###將指定的backend下的server條目插入文件###

                server_flag = True                                           ###指定標志位為真,方便server判斷###
            elif server_flag and re.match('\s+server',line):                 ###匹配server開頭的行,跳過不做任何操作###
                pass
            else:
                write_file.write(line)                                        ###其他的行,直接插入新文件###
                server_flag = False
    print('\033[33m server更新成功\033[0m')    
    os.system('mv %s %s.bak' % (file,file))                                  ###對源配置文件進行備份###
    os.system('mv %s %s' % (newfile,file))                                   ###對新生成的配置文件進行改名###

##################################主程序開始##################################

if __name__ == '__main__':
    flag = True
    haproxy_file = 'haproxy.cfg'                                               ###指定haproxy配置文件###

    backend_name = ''
    haproxy_name_show_dict = {}                                                ###初始化backend顯示字典###
    haproxy_server_show_dict = {}                                              ###初始化server顯示字典###
    while flag:
        os.system('clear')                                                     ###清屏###
        print('\n================================================================')
        print('\033[33m 歡迎訪問haproxy配置文件管理平台:\033[0m')
        print('\nbackend列表信息如下 : ')
        (haproxy_name_show_dict,haproxy_server_show_dict) = backend_read(haproxy_file)
        print('\n================================================================')
        print('''
        \033[31m 1. 查詢后端服務\033[0m
        \033[32m 2. 添加后端服務\033[0m
        \033[33m 3. 修改后端服務\033[0m
        \033[35m 4. 刪除后端服務\033[0m
        \033[36m 5. 退出\033[0m ''')
        print('\n================================================================')

        select_num = input('\033[33m請選擇操作條目:\033[0m')

        #######################1. 查詢后端服務################################
        if select_num == '1':
            query_flag = True                                                 ###初始化查詢循環標志###
            while query_flag:
                backend_index = input('\033[32;1m請輸入查詢的backend編號或名稱(返回上層菜單,請輸入b):\033[0m')

                ##############################對輸入值進行判斷################
                (backend_name,query_flag) = backend_input_if(backend_index,haproxy_name_show_dict)
                if backend_name:                                              ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

        #######################2. 添加后端服務################################
        if select_num == '2':
            add_flag = True                                                   ###初始化添加循環標志###
            while add_flag:
                backend_index = input('\033[32;1m請輸入添加的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m')
                ##############################對輸入值進行判斷################
                (backend_name,add_flag) = backend_input_if(backend_index,haproxy_name_show_dict)

                if backend_name:                                              ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    add_server_dict = OrderedDict()
                    print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m')
                    add_server_dict['name'] = name_decide()                  ###對輸入的name有效性進行判斷###
                    add_server_dict['address'] = ipaddress_decide()          ###對輸入的IP有效性進行判斷###
                    add_server_dict['weight'] = number_decide('權重值')      ###對輸入的權重有效性進行判斷###
                    add_server_dict['maxconn'] = number_decide('最大連接數') ###對輸入的連接數有效性進行判斷###

                    print(add_server_dict['name'],add_server_dict['address'],add_server_dict['weight'],add_server_dict['maxconn'])

                    #############對輸入的四個服務信息是否成功判斷#############
                    if add_server_dict['name'] and add_server_dict['address'] and add_server_dict['weight'] and add_server_dict['maxconn']:
                        add_commit = input('請確認是否添加此條目(y | n):')
                        if add_commit == 'y':                                 ###確認添加服務條目,並回寫配置文件###
                            haproxy_server_show_dict[backend_name].append(add_server_dict)
                            backend_server_handle(haproxy_file,haproxy_server_show_dict)
                        else:
                            add_flag = False                                  ###否則退出本次循環###
                    else:
                        print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m')

        #######################3. 修改后端服務#################################
        if select_num == '3':
            backend_modify_flag = True                                         ###初始化修改循環標志###
            while backend_modify_flag:
                backend_index = input('\033[32;1m請輸入修改的backend的編號或名稱(返回上層菜單,請輸入b):\033[0m')
                ##############################對輸入值進行判斷################
                (backend_name,backend_modify_flag) = backend_input_if(backend_index,haproxy_name_show_dict)

                if backend_name:                                               ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    server_modify_flag = True                                  ###初始化server條目修改標志位###
                    while server_modify_flag:

                        server_index = input('\033[32;1m請輸入修改的server的編號(返回上層菜單,請輸入b):\033[0m')
                        if len(server_index) != 0:
                            server_index = input_handle(server_index)
                        if server_index == 'b':                               ###輸入b,返還上一層###
                            server_modify_flag = False
                        #####################指定具體的server編號進行判斷#####
                        elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):
                            modify_server_dict = OrderedDict()
                            print('\033[34;1m請依次輸入后端服務信息(name,address,weight,maxconn):\033[0m')
                            modify_server_dict['name'] = name_decide()        ###對輸入的四個信息有效性進行判斷###
                            modify_server_dict['address'] = ipaddress_decide()
                            modify_server_dict['weight'] = number_decide('權重值')
                            modify_server_dict['maxconn'] = number_decide('最大連接數')

                            print(modify_server_dict['name'],modify_server_dict['address'],modify_server_dict['weight'],modify_server_dict['maxconn'])

                            ######對輸入的四個服務信息是否成功判斷#############
                            if modify_server_dict['name'] and modify_server_dict['address'] and modify_server_dict['weight'] and modify_server_dict['maxconn']:
                                modify_commit = input('請確認是否修改此條目(y | n):')
                                if modify_commit == 'y':                      ###確認修改服務條目,並回寫配置文件###
                                    haproxy_server_show_dict[backend_name][server_index - 1] = modify_server_dict
                                    backend_server_handle(haproxy_file,haproxy_server_show_dict)
                                    modify_server_flag = False

                                else:                                         ###否則退出本次循環###
                                    modify_server_flag = False
                            else:
                                print('\033[31m server輸入信息有誤,請重新輸入!!!\033[0m')
                        else:
                            print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m')

        #######################4. 刪除后端服務################################
        if select_num == '4':
            backend_delete_flag = True                                        ###初始化刪除循環標志###
            while backend_delete_flag:
                backend_index = input('\033[32;1m請輸入刪除的backend下條目編號或名稱(返回上層菜單,請輸入b):\033[0m')
                ##############################對輸入值進行判斷################
                (backend_name,backend_delete_flag) = backend_input_if(backend_index,haproxy_name_show_dict)

                if backend_name:                                              ###顯示對應backend下的server列表###
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    server_delete_flag = True                                 ###初始化server條目刪除標志位###
                    while server_delete_flag:

                        server_index = input('\033[32;1m請輸入刪除的server的編號(返回上層菜單,請輸入b):\033[0m')
                        if len(server_index) != 0:
                            server_index = input_handle(server_index)
                        if server_index == 'b':                               ###輸入b,返還上一層###
                            server_delete_flag = False
                        #####################指定具體的server編號進行判斷#####
                        elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):

                            print(haproxy_server_show_dict[backend_name][server_index - 1])
                            delete_commit = input('請確認是否刪除此條目(y | n):')
                            if delete_commit == 'y':                          ###確認刪除服務條目,並回寫配置文件###
                                del haproxy_server_show_dict[backend_name][server_index - 1]
                                backend_server_handle(haproxy_file,haproxy_server_show_dict)
                                delete_server_flag = False

                            else:                                             ###否則退出本次循環###
                                delete_server_flag = False
                        else:
                            print('\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m')

        #######################5. 退出程序######################
        if select_num == '5':
           sys.exit('\033[32m 退出程序,歡迎下次光臨,謝謝\033[0m')
haproxy_python34

 

 七、效果圖:

1、  初始菜單直接顯示backend列表,並列出選擇菜單:

  

2、  輸入1,選擇查詢菜單,並輸入backend的名稱或編號,均可,並展示對應名稱下的server信息:

 

 

3、  輸入b可以返回上層菜單,輸入2進入添加server條目:

 

4、  輸入server對應的name,address,weight,maxconn,並對有效性進行判斷:

 

       添加成功后查看結果:

 

注:

name以數字、字母、下划線開頭(其中包含數字的原因是可以輸入ip地址)

address可以是單獨的ip地址,也可以是ip加端口的形式,例:192.168.100.3或192.168.100.3:8080

weight和maxconn必須輸入數字,大小暫時沒有限制

 

5、 輸入b可以返回上層菜單,輸入3進入修改server條目,並對www.oldboy.org下的sky條目進行修改:

 

          同樣對輸入的server有效性進行判斷,最后確認回寫配置文件,查看修改結果:

 

 

6、  輸入b可以返回上層菜單,輸入4進入刪除server條目,並對指定條目進行修改:

 

7、輸入b可以返回上層菜單,輸入5,即可退出程序。

 

八、針對python2.7和python3.4的代碼區別:

       1、print的使用。

       2、python2.7下使用raw_input,python3.4下使用input。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM