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信息

View Code

转载于:https://www.cnblogs.com/JayeHe/p/6554868.html

初学 python 之 HAproxy配置文件操作相关推荐

  1. 〖Demo〗-- HAproxy配置文件操作

    [HAproxy配置文件操作] 要求 1. 根据用户输入输出对应的backend下的server信息 2. 可添加backend 和sever信息 3. 可修改backend 和sever信息 4. ...

  2. 初学python的30个操作难点汇总(入门篇)希望对你有帮助

    初学Python的人总会遇到这样或者那样的问题,在我学习Python的这段时间我总结了自己的29个问题,具体如下: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的 ...

  3. python去除中间空格只留一个_汇总初学Python的21个操作难点,看完别再去踩坑了...

    初学Python时,不管是容易的操作难点,还是困难的操作难点,都是要一步步的去踩坑摸索得出结果,小编今天就给大家汇总初学时Python的21个操作难点,看完之后可别再去掉到同样的坑里去了. 1 查找当 ...

  4. Python初学——Python简易介绍及操作

    2019独角兽企业重金招聘Python工程师标准>>> 一.Python简介 Python可定义为面向对象的脚本语言.这个定义把面向对象的支持和全面的面向脚本语言的角度融合在一起.其 ...

  5. python读取配置文件获取所有键值对_Python读取properties配置文件操作示例

    本文实例讲述了Python读取properties配置文件操作.分享给大家供大家参考,具体如下: 工作需要将Java项目的逻辑改为python执行,Java的很多配置文件都是.properties的, ...

  6. 修改haproxy配置文件

    HAproxy配置文件操作: 1. 根据用户输入输出对应的backend下的server信息 2. 可添加backend 和sever信息 3. 可修改backend 和sever信息 4. 可删除b ...

  7. python操作haproxy配置文件实例

    2019独角兽企业重金招聘Python工程师标准>>> 配置文件模板: defaultslog globalmode httpoption httpcloseoption dontl ...

  8. python的难点_初学python的操作难点总结(新手必看篇)

    如下所示: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格目标文件 cd p 4 写文件的第一个字母 ...

  9. python新手入门总结_初学python的操作难点总结(新手必看篇)

    如下所示: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格目标文件 cd p 4 写文件的第一个字母 ...

  10. python读conf配置文件_python读写配置文件操作示例

    本文实例讲述了python读写配置文件操作.分享给大家供大家参考,具体如下: 在用编译型语言写程序的时候,很多时候用到配置文件,作为一个约定的规则,一般用 ini 文件作为配置文件,当然不是绝对的,也 ...

最新文章

  1. php标题 栏目不显示title,DEDECMS专题列表页不显示title的解决方法
  2. webpack构建vue项目
  3. 杂项-QRCode:ZXing
  4. web移动端性能调优及16ms优化
  5. java scavenge_请概述一下Java中都有哪些垃圾收集器
  6. linux服务器 版本 比例,Linux比例近半 服务器操作系统混战开始
  7. 数据增长浪潮下,PCIe 6.0的问与Rambus的答
  8. Redis工作笔记-主从复制Replication
  9. 重装Windows后修复Linux引导
  10. 利用scrapy框架爬取动态加载的数据
  11. python从html拿到数据,python - 使用BeautifulSoup和Python从HTML文件中提取数据 - 堆栈内存溢出...
  12. 微信小程序php java_PHP实现微信小程序用户授权的工具类示例
  13. 使用Adobe Acrobat为PDF文件添加签名(图片+签名)
  14. 【水果识别】基于matlab GUI苹果质量检测及分级系统(带面板)【含Matlab源码 1613期】
  15. 毕设题目:Matlab元胞自动机城市规划
  16. 微信商城的这六大优势,以及这些丰富的功能,你知道吗?
  17. MATLAB简单实现ID3算法
  18. 离散-如何确定哈斯图极大极小元、最大最小元、最大最小上下界
  19. 微信公众平台服务号配置JS接口安全域名
  20. 流媒体服务器使用手册

热门文章

  1. java session使用_Nginx+tomcat实现session共享
  2. 有多个script怎么放一起_在南方我们觉得儿菜的特种蔬菜,对它得如何处理?怎么做出美味?...
  3. thinkphp5---join联合查询
  4. dfs.datanode.directoryscan.throttle.limit.ms.per.
  5. java代码生成Excel文件3000条自定义属性的的域账户名
  6. 定时任务发展史(二)
  7. ExecuteReader在执行有输出参数的存储过程时拿不到输出参数
  8. Mysql 分组聚合实现 over partition by 功能
  9. Result Cache结果高速缓存 (转)
  10. ***_ha_高可用_链路备份