作业:

对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 == '':
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 == '':
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 == '':
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 == '':
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 == '':
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 == '':
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 == '':
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 == '':
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 == '':
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 == '':
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。

python之haproxy配置文件操作(第三天)的更多相关文章

  1. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

  2. s12-day03-work01 python修改haproxy配置文件(初级版本)

    #!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song ...

  3. python作业:HAproxy配置文件操作(第三周)

    一.作业需求: 1. 根据用户输入输出对应的backend下的server信息 2. 可添加backend 和sever信息 3. 可修改backend 和sever信息 4. 可删除backend ...

  4. python3 haproxy配置文件操作练习

    哈哈 老规矩 先来一个NLP第六条:咳咳! 六,重复旧的做法,只会得到旧的结果   做法有不同,结果才会有不同. 如果,你的事没有结果,改变你的做法.任何新的做法,都比旧的多一份成功的机会. 想明天比 ...

  5. 用python修改haproxy配置文件

    需求: 当用户输入域名的时候,显示出来下面的记录 当用户需要输入添加纪录的时候,添加到你需要的那个域名下面 global log 127.0.0.1 local2 daemon maxconn 256 ...

  6. HAproxy配置文件操作

    要求 1. 根据用户输入输出对应的backend下的server信息2. 可添加backend 和sever信息3. 可修改backend 和sever信息4. 可删除backend 和sever信息 ...

  7. 03 python学习笔记-文件操作(三)

    本文内容主要包括以下方面: 1. 文件操作基本认识2. 只读(r, rb)3. 只写(w, wb)4. 追加(a, ab)5. r+读写6. w+写读7. a+写读(追加写读)8. 文件的修改 一.文 ...

  8. 第三周作业HAproxy文件操作

    #coding:utf-8 #Author:Mr Zhi """ HAproxy配置文件操作: 1. 根据用户输入输出对应的backend下的server信息 2. 可添 ...

  9. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

随机推荐

  1. linux 关于session缓存丢失,自己掉坑里面了

    突然间session失效了,死活打不上缓存.顺着解决思路:程序--再检查程序--文件权限--查看服务器配置 我只想说一句,我操.尼玛,各种调试,各种自虐.毫无意义,三个钟头流失. 看看几点了,快凌晨两 ...

  2. 【5集iCore3_ADP演示视频】5-2 iCore3应用开发平台上电及注意事项

    iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视 ...

  3. oracle TBL$OR$IDX$PART$NUM BUG案例处理过程

    通过AWR报告发现数据库cpu告警的问题,定位产生问题的sql语句 首先查看SQL的执行计划 ) FROM cmds.psn_cntr_holder a ,cmds.pol_attrib c ,cmd ...

  4. C# 根据年月日获取星期几方法

    #region 根据年月日计算星期几(Label2.Text=CaculateWeekDay(2004,12,9);) /// <summary> /// 根据年月日计算星期几(Label ...

  5. Android 操作系统的内存回收机制(转载)

    Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...

  6. SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束

    SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主 ...

  7. target-densitydpi

    一个屏幕像素密度是由屏幕分辨率决定的,通常定义为每英寸点的数量(dpi).Android支持三种屏幕像素密度:低像素密度,中像素密度,高像素密度.一个低像素密度的屏幕每英寸上的像素点更少,而一个高像素 ...

  8. 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程

    在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...

  9. jsp中的form表单中的 id和name有什么区别了

    <form action="./system/WebServer_webServerLogin" method="post" id="login ...

  10. PythonNote01_HTML标签

    >头标签<head> >>位置 头标签要放在头部之间 >>种类 <title> : 指定整个网页的标题,在浏览器最上方显示. <meta&g ...