python练习_module01-3-haproxy配置文件操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python练习_module01-3-haproxy配置文件操作相关的知识,希望对你有一定的参考价值。
haproxy配置文件操作
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.org
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.8 100.1.7.8 weight 20 maxconn 3000
backend www.tesla.com
server 100.1.7.19 100.1.7.19 weight 20 maxconn 3000
server 100.1.7.18 100.1.7.18 weight 20 maxconn 3000
backend www.51cto.com
server 100.1.7.29 100.1.7.29 weight 20 maxconn 3000
server 100.1.7.28 100.1.7.28 weight 20 maxconn 3000
backend www.baidu.com
server 100.1.7.39 100.1.7.39 weight 20 maxconn 3000
server 100.1.7.38 100.1.7.38 weight 20 maxconn 3000
1. 需求
- 根据用户输入输出对应的backend下的server信息
- 可添加backend 和sever信息
- 可修改backend 和sever信息
- 可删除backend 和sever信息
- 操作配置文件前进行备份
- 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作
2. 实现
- 达成6项作业需求
- 任何时候都可以退出
- 选择操纵类型后,再输入内容时,可输入 <font color=‘blue‘>*b*</font> 返回上一层
- 在添加、修改、删除操作时,会判断输入backend的格式是否正确
3. 代码
1 #! /usr/bin/env python3 2 # -*- coding:utf-8 -*- 3 # Author:Jailly 4 5 import re,os 6 7 # 以字典形式获取原配置文件中backend的相关数据 8 def get_backends(): 9 original_backends = {} 10 11 with open(‘haproxy.cfg‘, ‘r‘) as f: 12 for line in f: 13 m = re.search(r‘^backend\s+(?P<backend>.+)$‘, line.strip()) 14 if m: 15 original_backend_name = m.group(‘backend‘) 16 original_backends[original_backend_name] = {} 17 continue 18 19 if original_backends: 20 m2 = re.search(r‘‘‘ 21 server\s+(?P<server>.*)\s+\1\s+ 22 weight\s+(?P<weight>\d+)\s+ 23 maxconn\s+(?P<maxconn>\d+) 24 ‘‘‘,line.strip(),re.X) 25 if m2: 26 original_backends[original_backend_name][m2.group(‘server‘)] = {‘weight‘:int(m2.group(‘weight‘)), 27 ‘maxconn‘:int(m2.group(‘maxconn‘))} 28 29 return original_backends 30 31 # 修改指定backend下的server条目 32 def modify(update_backend,update_server,update_weight,update_maxconn): 33 with open(‘haproxy.cfg‘, ‘r‘) as f1,open(‘haproxy.cfg.temp‘, ‘w+‘) as f2: 34 search_flag = 0 35 36 for line in f1: 37 m = re.search(r‘^backend\s+(.*)$‘, line.strip()) 38 if m: 39 if m.group(1) == update_backend: 40 search_flag = 1 41 else: 42 if search_flag: 43 search_flag = 0 44 45 if search_flag: 46 if re.search(r‘^server\s+%s‘ % update_server, line.strip()): 47 line = ‘ server %s %s weight %d maxconn %d\n‘% 48 (update_server, update_server, update_weight, update_maxconn) 49 50 f2.write(line) 51 52 os.remove(‘haproxy.cfg‘) 53 os.rename(‘haproxy.cfg.temp‘, ‘haproxy.cfg‘) 54 55 56 # 查找backend配置信息 57 def search(): 58 59 while 1: 60 search_flag = 0 # 标记是否找到相应的backend 61 res = ‘‘ 62 63 kw = input(‘请输入您想要查询的backend(b:返回,q:退出):‘).strip() 64 if kw == ‘q‘: 65 exit() 66 elif kw == ‘b‘: 67 break 68 else: 69 with open(‘haproxy.cfg‘) as f: 70 for line in f: 71 if re.search(r‘^backend\s+%s‘ % kw.strip(), line.strip()): 72 search_flag = 1 73 continue 74 75 if search_flag == 1: 76 if re.search(r‘^backend\s+.*‘, line.strip()): 77 break 78 else: 79 res += line 80 if search_flag == 0: 81 print(‘\033[1;31m您输入的backend不存在!\033[0m‘) 82 else: 83 print(res) 84 85 # 添加backend配置信息 86 def add(): 87 88 while 1: 89 original_backends = get_backends() 90 # print(original_backends) 91 add_content = input(‘请输入您想要添加的backend配置(b:返回,q:退出):‘).strip() 92 93 if add_content == ‘b‘: 94 break 95 elif add_content == ‘q‘: 96 exit() 97 else: 98 try: 99 add_content = eval(add_content) 100 add_backend = add_content[‘backend‘] 101 add_record = add_content[‘record‘] 102 add_server = add_record[‘server‘] 103 add_weight = add_record[‘weight‘] 104 add_maxconn = add_record[‘maxconn‘] 105 except: 106 print(‘\033[1;31m格式错误,请重新输入!\033[0m‘) 107 continue 108 109 # 输入backend 在文件中存在的情况 110 if add_backend in original_backends: 111 112 # 输入backend的server条目 在文件中存在的情况 113 if add_server in original_backends[add_backend]: 114 115 # 输入backend的server条目 与 文件中该server条目的信息相同的情况 116 if {‘weight‘:add_weight,‘maxconn‘:add_maxconn} == original_backends[add_backend][add_server]: 117 print(‘\033[1;31m您输入的backend信息在配置文件中已存在!\033[0m‘) 118 119 # 输入backend的server条目 与 文件中该server条目的信息不同的情况 120 else: 121 confirm = input(‘该backend下的server条目已存在,要更新吗?(Y/N):‘) 122 if confirm.upper() == ‘Y‘: 123 modify(add_backend,add_server,add_weight,add_maxconn) 124 print(‘更新成功!‘) 125 else: 126 print(‘取消更新!‘) 127 128 # 输入backend的server条目 在文件中不存在的情况 129 else: 130 # add_to_the_bottom_of_the_backend 131 with open(‘haproxy.cfg‘,‘r‘) as f1,open(‘haproxy.cfg.temp‘,‘w‘) as f2: 132 search_flag = 0 133 134 for line in f1: 135 m = re.search(r‘^backend\s+(.*)$‘, line.strip()) 136 if m: 137 if m.group(1) == add_backend: 138 search_flag = 1 139 140 else: 141 if search_flag: 142 search_flag = 0 143 f2.write(‘ server %s %s weight %d maxconn %d\n‘% 144 (add_server,add_server,add_weight,add_maxconn)) 145 f2.write(line) 146 147 os.remove(‘haproxy.cfg‘) 148 os.renames(‘haproxy.cfg.temp‘,‘haproxy.cfg‘) 149 print(‘添加成功!‘) 150 151 # 输入backend 在文件中不存在的情况 152 else: 153 # add_to_the_bottom_of_the_file 154 with open(‘haproxy.cfg‘,‘a‘) as f: 155 f.write(‘‘‘ 156 backend %s 157 server %s %s weight %d maxconn %d 158 ‘‘‘ % (add_backend,add_server,add_server,add_weight,add_maxconn)) 159 print(‘添加成功!‘) 160 161 # 修改backend配置信息 162 def update(): 163 164 while 1: 165 original_backends = get_backends() 166 update_content = input(‘请输入您想要修改的backend配置(b:返回,q:退出):‘) 167 168 if update_content == ‘b‘: 169 break 170 elif update_content == ‘q‘: 171 exit() 172 else: 173 174 try: 175 update_content = eval(update_content) 176 update_backend = update_content[‘backend‘] 177 update_record = update_content[‘record‘] 178 update_server = update_record[‘server‘] 179 update_weight = update_record[‘weight‘] 180 update_maxconn = update_record[‘maxconn‘] 181 except: 182 print(‘\033[1;31m格式错误,请重新输入!\033[0m‘) 183 continue 184 185 # 输入的backend 在文件中存在的情况 186 if update_backend in original_backends: 187 188 # 输入backend的sever条目 在文件中存在的情况 189 if update_server in original_backends[update_backend]: 190 modify(update_backend,update_server,update_weight,update_maxconn) 191 print(‘修改成功!‘) 192 193 # 输入backend的sever条目 在文件中不存在的情况 194 else: 195 print(‘\033[1;31m该backend下的server在配置文件中不存在!如果想要添加server,请返回上一层选择\‘2\‘添加\033[0m‘) 196 197 # 输入的backend 在文件中不存在的情况 198 else: 199 print(‘\033[1;31m该backend在配置文件中不存在!如果想要添加backend,请返回上一层选择\‘2\‘添加\033[0m‘) 200 201 # 删除backend信息 202 def delete(): 203 204 while 1: 205 original_backends = get_backends() 206 del_content = input(‘请输入您想要删除的backen配置(b:返回,q:退出):‘) 207 208 if del_content == ‘b‘: 209 break 210 elif del_content == ‘q‘: 211 exit() 212 else: 213 try: 214 del_content = eval(del_content) 215 del_backend = del_content[‘backend‘] 216 del_record = del_content[‘record‘] 217 del_server = del_record[‘server‘] 218 del_weight = del_record[‘weight‘] 219 del_maxconn = del_record[‘maxconn‘] 220 except: 221 print(‘\033[1;31m格式错误,请重新输入!\033[0m‘) 222 continue 223 224 if del_backend in original_backends and del_server in original_backends[del_backend] and 225 original_backends[del_backend][del_server] == {‘weight‘:del_weight,‘maxconn‘:del_maxconn}: 226 with open(‘haproxy.cfg‘,‘r‘) as f1, open(‘haproxy.cfg.temp‘,‘w‘) as f2: 227 search_flag = 0 228 for line in f1: 229 if re.search(r‘^backend\s+%s‘%del_backend,line.strip()): 230 search_flag = 1 231 232 if search_flag: 233 re.search(r‘^server\s+%s‘%del_server,line.strip()) 234 search_flag = 0 235 continue 236 237 f2.write(line) 238 239 os.remove(‘haproxy.cfg‘) 240 os.rename(‘haproxy.cfg.temp‘,‘haproxy.cfg‘) 241 242 print(‘删除成功!‘) 243 244 else: 245 print(‘\033[1;31m您输入的backend信息不存在!\033[0m‘) 246 247 # 主程序 248 def main(): 249 print(‘欢迎进入HAProxy管理系统‘.center(50,‘-‘)) 250 251 while 1: 252 253 print(‘‘‘ 254 1. search 255 2. add 256 3. update 257 4. delete 258 ‘‘‘) 259 260 choice = input(‘请选择您想要进行的操作(q:退出):‘) 261 262 if choice == ‘1‘: 263 search() 264 265 elif choice == ‘2‘: 266 add() 267 268 elif choice == ‘3‘: 269 update() 270 271 elif choice == ‘4‘: 272 delete() 273 274 elif choice == ‘q‘: 275 exit() 276 277 else: 278 print(‘\033[1;31m请输入正确的指令!\033[0m‘) 279 280 if __name__ == ‘__main__‘: 281 main()
以上是关于python练习_module01-3-haproxy配置文件操作的主要内容,如果未能解决你的问题,请参考以下文章
python练习_module01-3-haproxy配置文件操作
python 错误 no module named _future_