Python-day3作业-haproxy配置文件管理脚本

#!/usr/bin/env python

import os,sys,time,re,prettytable,json

from collections import defaultdict,OrderedDict

conf=‘haproxy.cfg‘  ###指定haproxy配置文件###

jgf=‘‘

######################1.input输入字符类型转化函数#######################

def input_handle(s):

if str.isdigit(s):                                                     ###对输入是否是数字进行判断###

s = int(s)                                                         ###如果输出的是个数字,则转化为整数类型###

return s                                                              ###返回输入字符###

###########################2.backend列表展示函数############################

def backend_read(conf):

backend_list = []                                                       ###初始化backend的列表###

show_dict = {}                                                          ###初始化要返回的显示字典###

backend_name_dict = defaultdict(list)                                   ###定义一个value为列表的字典,用来存放server###

server_flag = False                                                     ###初始化server判断标志位###

with open(conf,‘r‘) as ha:                                             ###打开haproxy配置文件###

for line in ha:

server_dict = OrderedDict()                                      ###定义一个有序字典###

line = line.strip(‘\n‘)

#情况1

if re.match(‘backend‘,line):                                    ###匹配配置文件以backend开头的行###

backend_name = re.split(‘\s+‘,line)[1]

backend_list.append(backend_name)                            ###将配置到的backend的名称插入到列表###

server_flag = True                                           ###赋值标志位为真,用来与server关联###

#情况2

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字典###

########################3.显示server服务器函数#############################

def backend_server_show(backend_show_value,server_show_dict):

############对backend名称进行遍历并加上数字编号###########################

print(jgf.center(70,‘=‘))

print(‘\033[1m后端服务器(%s)信息如下:\033[0m‘%backend_show_value)

print(‘%-20s %-20s %-20s %-20s‘%(‘name‘,‘address‘,‘weight‘,‘maxconn‘))

server_list = server_show_dict[backend_show_value]

for v in server_list:                                     ###用enumerate进行server展示###

n=list(v.values())

print(‘\033[32;40m%-5s%20s%15s%25s\033[1m‘%(n[0],n[1],n[2],n[3]))

print(jgf.center(60, ‘=‘))

#####################4.名称输入判断函数#############################

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

sys.exit(‘\033[32;1m脚本已退出!\033[1m‘)

elif re.match(‘[0-9a-zA-Z\_]+‘,name_input):                       ###匹配输入是否以字符、数字或下划线开头###

name = name_input

name_flag = False                                              ###输入成功后退出循环###

else:

print(‘\033[31m名称输入错误,请重新输入!!!\033[0m‘)

break

return(name)                                                          ###返回输入的结果###

#####################5.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

sys.exit(‘\033[32;1m脚本已退出!\033[1m‘)

##################匹配输入是否是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)                                                       ###返回输入的结果###

####################6.数字输入判断函数######################################

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

sys.exit(‘\033[32;1m脚本已退出!\033[32;1m‘)

else:

try:

int(number_input)                                         ###匹配输入是否是数字###

except:

print(‘\033[31;1m%s输入类型错误,请重新输入!!!\033[0m‘%name)

else:

number = number_input

number_flag = False                                       ###输入成功后退出循环###

return(number)                                                       ###返回输入的结果###

#############################7.节点输入判断函数##########################

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)                                         ###返回输入的结果和循环标志位###

########################8.配置文件操作函数#################

def backend_server_handle(conf,handle_dict):

newfile = ‘%s.new‘%conf                                                ###定义回写的新文件###

server_flag = False

with open(conf,‘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[33;1m server更新成功\033[0m‘)

os.system(‘mv %s %s.bak‘%(conf,conf))                                  ###对源配置文件进行备份###

os.system(‘mv %s %s‘%(newfile,conf))                                   ###对新生成的配置文件进行改名###

##################################主程序开始##################################

if __name__ == ‘__main__‘:

flag = True

backend_name = ‘‘

haproxy_name_show_dict = {}                                                ###初始化backend显示字典###

haproxy_server_show_dict = {}                                              ###初始化server显示字典###

while flag:

print(jgf.center(60,‘=‘))

hy=‘\033[36m欢迎访问haproxy配置文件管理脚本\033[0m‘

print(hy.center(60,‘*‘))

print(‘\033[1mbackend列表信息如下:‘)

(haproxy_name_show_dict,haproxy_server_show_dict) = backend_read(conf)

print(jgf.center(50,‘=‘))

time.sleep(1)

print(‘‘‘

\033[35;1m1.查询后端服务\033[0m

\033[35;1m 2.添加后端服务\033[0m

\033[35;1m 3.修改后端服务\033[0m

\033[31;1m 4.删除后端服务\033[0m

\033[32;1m 5.退出\033[0m ‘‘‘)

print(jgf.center(60,‘=‘))

select_num = input(‘\033[35;1m请选择操作条目:\033[0m‘)

#######################1. 查询后端服务################################

if select_num == ‘1‘:

query_flag = True                                                 ###初始化查询循环标志###

while query_flag:

backend_index =input(‘\033[31;1m请输入需要查询的backend编号或名称(返回上级菜单输入b,退出输入q):\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)

elif backend_index==‘b‘:

break

elif backend_index==‘q‘:

sys.exit(‘\033[35;1m脚本退出!\033[0m‘)

else:

query_flag=False

print(‘\033[31;1m您输入的节点不存在!请重新输入!‘)

time.sleep(1)

#######################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(‘\033[31;1m请确认是否添加此条目(y | n):\033[0m‘)

if add_commit == ‘y‘:                                 ###确认添加服务条目,并回写配置文件###

haproxy_server_show_dict[backend_name].append(add_server_dict)

backend_server_handle(conf,haproxy_server_show_dict)

else:

add_flag = False                                  ###否则退出本次循环###

else:

print(‘\033[1;31m server信息输入有误,请重新输入!!!\033[0m‘)

time.sleep(2)

#######################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(‘\033[32;1m请确认是否修改此条目(y|n):\033[1m‘)

if modify_commit == ‘y‘:                      ###确认修改服务条目,并回写配置文件###

haproxy_server_show_dict[backend_name][server_index - 1] = modify_server_dict

backend_server_handle(conf,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(conf,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‘:

print(‘\033[31;1m程序将在两秒后退出,欢迎再次使用,谢谢!\033[0m‘)

time.sleep(1)

print(‘\033[32;1m1s\033[0m‘)

time.sleep(1)

print(‘\033[32;1m2s\033[0m‘)

print(‘\033[31;1m程序退出‘)

sys.exit()

时间: 2024-08-10 16:56:59

Python-day3作业-haproxy配置文件管理脚本的相关文章

Python学习day3作业

Python学习day3作业 days3作业 作业需求     HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除backend 和sever信息 操作配置文件前进行备份 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建:若信息与已有信息重复则不操作 [x] 博客 [x] 查询backend下的server信息 [x] 添加backend和se

Windows下的用户配置文件管理(二)

续Windows下的用户配置文件管理(一) 三.强制用户配置文件 强制用户配置文件也于漫游用户配置文件,不过它是只读的,用户不可以修改. 一般来说,此设置文件的内容由系统管理员事先设置好. 创建过程: 在实际生产环境,系统管理一般会建立一个临时用户登录后,按实际需要修改其工作环境,注销这个用户后,以这个用户的配置文件为模板,复制到所需要设置强制用户配置文件的用户使用. 为了简化操作操作,下面直接用管理的配置文件来复制. 在Windows 2008以前操作系统中,下图的"复制到"按钮是可

Haproxy配置http模式负载均衡

环境准备: 主机名 角色 IP地址 mylinux1.contoso.com haproxy服务器 eth0:192.168.100.121 eth1:172.16.100.121 mylinux3.contoso.com web服务器1 eth0:192.168.100.181 mylinux4.contoso.com web服务器2 eth0:192.168.100.182 一.准备工作 在mylinux3和mylinux4上安装http服务,并启动. yum -y install http

Atitit.python&#160;web环境的配置&#160;attilax&#160;总结

Atitit.python web环境的配置 attilax 总结 1. 下载modpython/1 1.1. 安装python2.5.11 1.2. 安装modpython1 2. 设置py文件的url请求器2 3. www/py/t.py2 4. 访问url  http://localhost/py/t.py/handler2 5. 高级知识2 5.1. 原生(native)mod_python处理器 2 5.2. 那么mod_python到底做了些什么呢?3 6. 参考5 1. 下载mod

openstack API部分(Keystone) HAProxy配置(二)

openstack API部分(Keystone) HAProxy配置 廖杰 一.概况与原理 1)所需要的配置组件有:pacemaker+corosync+HAProxy 2)主要原理:HAProxy作为负载均衡器,将对openstack api服务的请求分发到两个镜像的控制节点上,由于openstack api服务是无状态的服务,所以不存在数据同步的问题.具体为在pacemaker中配置一个VIP,HAProxy负责监听这个VIP,将对这个VIP的请求分发到两台控制节点上,同时HAProxy本

【Python】Windows版本的Python开发环境的配置,Helloworld,Python中文问题,输入输出、条件、循环、数组、类

Python这东西似乎很有用的样子,但不知道为何一直火不起来, 有可能是因为这东西太难读~读作什么,派神.英语不好的人,第一眼看上去就懵了,还经常拼错,呵呵! 不过怎么说都好关键是要会. 一.Python开发环境的配置 1.首先打开Python的官网https://www.python.org/downloads/下载(点击打开链接)Python的开发环境.这东西是基础的基础,相当于JDK在Java的地位.值得注意的是,Python这小子又不老实了,又开始把自身的语法改到面目全非,在强推Pyth

python的开发环境配置-Eclipse-PyDev插件安装

安装PyDev插件的两种安装方法: 1.百度搜索PyDev 2.4.0.zip,下载后解压,得到Plugins和Feature文件夹,复制两文件夹到Eclipse目录,覆盖即可. 完成后重启Eclipse,若在Eclipse菜单Help->About Eclipse->Installation Detail->Plug-ins,能看到PyDev组件,则表示安装成功. 2.直接在Eclipse中选择菜单:Help-Install New Software..-Add,输入http://py

免安装方式的Python之VSCode环境配置

概述 本文旨在介绍免安装方式,在VSCode中搭建Python(3.73)的配置环境.至于Python是什么.它能做些什么,诸如此类的介绍均不在此文中介绍,相信能看此文的人,多多少少都会有些了解. VSCode 是款十分轻便的IDE,在用它开发 nodejs 项目时,开发体验十分不错,因此就想用它来替代 PyCharm IDE 来编写 Python 脚本. 注:虽说 PyCharm 强大,但毕竟笨重又收费,最最最主要的是本人喜欢系统干净的系统环境,对于能免安装的工具一律优先考虑免安装.因此经过一

mysql复制+keepalived+haproxy配置(负载均衡)

双主+keepalived+haproxy配置(负载均衡) 实验系统:CentOS 6.5_x86_64实验前提:防火墙和selinux都关闭实验软件:keepalived-1.2.13 haproxy-1.8.13 mysql—5.7.21主1 ip:192.168.226.134主2 ip:192.168.226.135vip 192.168.226.150 一.安装mysql 获取mysql安装包:wget https://dev.mysql.com/get/Downloads/MySQL