初学 python 之 HAproxy配置文件操作
HAproxy配置文件操作:
1. 根据用户输入输出对应的backend下的server信息
2. 可添加backend 和sever信息
3. 可修改backend 和sever信息
4. 可删除backend 和sever信息
5. 操作配置文件前进行备份
6 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作
配置文件 参考 http://www.cnblogs.com/alex3714/articles/5717620.html
目标:
练习文件读写,列表和列表解析,函数使用,循环表达式,if...else流程控制表达式.
程序流程:
1.开始,读取配置文件,用f.readlins()生成一个内容列表,列表元素按顺序依次与文本各行内容一一对应!
2.输入操作符
输入是c,进入21
21.输入网址, 网址不存在则返回2; 网址存在,则显示该网址的server信息,进入211 # 查看信息
211.输入ip,则删除该ip的server信息,备份和更新文件,显示新信息,然后返回2;输入b则直接返回2 # 删除server或返回不操作
输入m,进入22 # 添加修改信息
22.按格式输入网址以及server信息,网址存在则进入221,网址不存在则添加网址以及server信息,备份和更新文件,显示新信息,然后返回2 # 网址不存在则添加
221.ip存在,则进入2211;ip不存在就添加server信息,备份和更新文件,显示新信息,然后返回2 # ip不存在则添加
2211.weight 或 maxconn 的值相同,则显示网址和server信息,然后返回2;值不同,则修改值,备份和更新文件,显示新信息,然后返回2 # 输入信息已存在则显示信息,返回不操作
输入q,直接退出
重点:
利用列表有序特性,定位文本内容,实现查询,重点是,实现修改,插入添加等文本文件操作!
因为列表元素按顺序依次与文本各行内容一一对应,所以提取列表元素下标即可定位内容在文本位置,对列表的查询,修改,添加,然后写入文件即可!
使用函数处理 多处文件备份和更新等写入操作和多处显示列表信息操作 优化代码
代码:
1 # Author:Jay He 2 3 # 整个程序围绕data = f.readlines()列表做处理! 4 5 6 def get_server_list(net): 7 index_st = data.index(net) 8 index_follow = [data.index(i) for i in data[index_st+1:] if i[0] == 'b'] 9 # 把net往后的顶格字母是b的所有行下标放入index_follow 10 if index_follow: # 空列表本身就是False 11 index_end = min(index_follow) 12 # 是非空列表,就提取下标最小来截取ip下的server信息 13 get_list = [i.strip() for i in data[index_st+1:index_end]] 14 # 截取ip下包含的所有server信息,传递给列表get_list 15 else: 16 get_list = [i.strip() for i in data[index_st+1:]] 17 # 是空列表,直接截取net往后的所有信息,传递给列表get_list 18 return get_list 19 # 提取网址下server信息列表函数 20 21 22 def show_info(): 23 print('\t%s' % add_info[0]) 24 for j in search_get: 25 if j == add_info[1]: 26 print('\t\t\033[1;31m%s\033[0m' % j) 27 else: 28 print('\t\t%s' % j) 29 # 显示server信息函数 30 31 32 def output_write(): 33 with open('profile_bak', 'w', encoding='utf-8') as f_backup,\ 34 open('profile', 'w', encoding='utf-8') as f_new: 35 for line in data_bak: 36 f_backup.write(line) 37 # 原内容备份到profile_bak 38 for line in data: 39 f_new.write(line) 40 # 更新修改过的内容到profile 41 # 备份和更新 42 43 44 while True: 45 with open('profile', 'r', encoding='utf-8') as f: 46 data = f.readlines() 47 input_choice = input('''输入c查询和删除,输入m添加和修改;输入q退出>>>''') 48 if input_choice == 'q': 49 break 50 elif input_choice == 'c': 51 input_net = input('请输入需要查询的网址,例如:www.baidu.com>>>') 52 add_info = ['backend '+input_net, 'none'] # 按统一格式处理输入信息 53 check_net = '%s\n' % add_info[0] # 调整输入信息为data列表元素格式 54 if check_net in data: 55 search_get = get_server_list(check_net) # 获取server列表 56 print('参看网址的server信息如下:') 57 show_info() # 显示server信息 58 input_del = input('输入ip,删除server,例如:100.1.7.9;输入b返回>>>') 59 server_list = [k.split() for k in search_get if k != ''] # 调整server列表,可读取ip 60 ip_list = [k2[1] for k2 in server_list if k2 != ''] # 提取ip列表 61 if input_del in ip_list: 62 index_del = data.index(check_net)+ip_list.index(input_del)+1 # 定位输入ip在data中的位置 63 add_info[1] = search_get[ip_list.index(input_del)] # 把定位好的server信息传递给add_info方便下面用 64 del data[index_del] # 在data中删除server信息,准备输出 65 del search_get[ip_list.index(input_del)] # 在search_get中删除server信息,准备显示 66 data_bak = data # 设置备份列表data_bak,准备输出 67 output_write() # 输出 68 print('\033[1;31m%s %s ip已删除!\033[0m当前server信息如下:' % (add_info[0], add_info[1])) 69 show_info() # 显示 70 else: 71 continue 72 else: 73 print('没有网址%s的server信息' % input_net) 74 continue 75 # 查看功能,方便删除server 76 elif input_choice == 'm': 77 input_info = input(''' 78 请输入需要添加或者修改的信息, 79 例如:backend www.oldboy.org,server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 80 >>>''') 81 add_info = input_info.split(',') # 按统一格式处理输入信息 82 add_net = '%s\n' % add_info[0] # 调整输入信息为data列表元素格式 83 add_server = ' %s\n' % add_info[1] # 调整输入信息为data列表元素格式 84 if add_net in data: 85 search_get = get_server_list(add_net) # 获取server列表 86 begin = data.index(add_net) # 提取网址在data中的位置 87 server_list = [k.split() for k in search_get if k != ''] # 调整server列表,可读取ip 88 ip_list = [k2[1] for k2 in server_list if k2 != ''] # 提取ip列表 89 server_info = add_info[1].split() # 调整输入信息各元素可提取 90 ip = server_info[1] # 提取输入ip值 91 weight = server_info[4] # 提取输入weight值 92 maxconn = server_info[6] # 提取输入maxconn值 93 if ip in ip_list: 94 index_ip = ip_list.index(ip) 95 # 确定ip在ip_list的位置,对应的也是ip在server_list的位置,同时也是ip在search_get的位置 96 if weight == server_list[index_ip][4] and maxconn == server_list[index_ip][6]: 97 print('需添加的\033[1;31m%s %s ip已存在!各值无变化!\033[0m当前server信息如下:' 98 % (add_info[0], add_info[1])) 99 show_info() # 显示 100 continue 101 # 网址以及ip都存在,weight和maxconn值无变化,则显示ip信息 102 else: 103 the_ip = begin+index_ip+1 # 确定需要修改的ip在data的位置,由于server_list和server_get位置顺序一致 104 data_bak = data # 设置备份列表data_bak,准备输出 105 data[the_ip] = add_server # 修改内容,准备输出 106 search_get[index_ip] = add_info[1] # 更新显示列表search_get,准备显示 107 output_write() # 输出 108 print('需添加的\033[1;31m%s %s ip已存在!各值已更新!\033[0m当前server信息如下:' 109 % (add_info[0], add_info[1])) 110 show_info() # 显示 111 continue 112 # 网址以及ip都存在,weight或maxconn的值有变化,更新值并显示ip信息 113 else: 114 data_bak = data # 设置备份列表data_bak,准备输出 115 insert_index = begin+len(search_get) # 在data中设置插入位置 116 data = data[:insert_index]+[add_server]+data[insert_index:] # data中插入内容,准备输出 117 search_get = search_get[:-1]+[add_info[1]]+search_get[-1:] # 更新显示列表search_get,准备显示 118 output_write() # 输出 119 print('需添加的\033[1;31m%s %s 已加入配置!\033[0m当前IP信息如下:' % (add_info[0], add_info[1])) 120 show_info() # 显示 121 continue 122 # 网址存在,ip不存在,则添加ip信息 123 else: 124 data_bak = data # 设置备份列表data_bak 125 data.append(add_net) # 更新输出列表data 126 data.append(add_server) # 更新输出列表data 127 search_get = [add_info[1]] # 更新显示列表search_get 128 output_write() # 输出 129 print('需添加的\033[1;31m%s %s 已加入配置!\033[0m当前IP信息如下:' % (add_info[0], add_info[1])) 130 show_info() # 显示 131 continue 132 # 网址不存在,添加网址及ip信息