• python练习_module013haproxy配置文件操作


    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()
  • 相关阅读:
    Jenkins tomcat 一键发布 (三)
    Jenkins docker 一键发布 (二)
    Jenkins docker 一键发布 (一)
    jenkins构建maven项目:找不到本地依赖包的解决办法
    Linux socket编程示例
    Linux虚拟机环境搭建
    Linux vim 配置
    vs2013 Qt5.7.0环境安装搭建
    Linux下如何生成core dump 文件
    QT5新建工程错误->无法打开源文件QtWidgets/QApplication
  • 原文地址:https://www.cnblogs.com/jailly/p/6786269.html
Copyright © 2020-2023  润新知