Python-Day5修改haproxy配置文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-Day5修改haproxy配置文件相关的知识,希望对你有一定的参考价值。

需求:

1、查
输入:www.oldboy.org
获取当前backend下的所有记录

2、新建
输入: {‘backend‘: ‘www.oldboy‘,‘record‘: {‘server‘: ‘100.1.7.9‘,‘weight‘: 20,‘maxconn‘: 30}}
arg = {
‘backend‘: ‘www.oldboy.org‘,
‘record‘:{
‘server‘: ‘100.1.7.9‘,
‘weight‘: 20,
‘maxconn‘: 30
}
}

3、删除
输入:
arg = {
‘bakend‘: ‘www.oldboy.org‘,
‘record‘:{
‘server‘: ‘100.1.7.9‘,
‘weight‘: 20,
‘maxconn‘: 30
}
}

 

 

文件:(configuration)

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

 

code:

  1 # Author:P J J
  2 import os
  3 
  4 #查询
  5 def select(domain):
  6     result_list = [] #存放查询的结果
  7     flag = False  # 定义flag,目的是为了判断是否查到了backend
  8 
  9     with open("configuration",r,encoding=utf-8) as f:
 10         for line in f:
 11             if line.strip() == "backend %s" % domain:
 12                 flag = True #表示找到了
 13                 continue
 14             if line.strip().startswith(backend):
 15                 flag = False
 16             if flag:
 17                 result_list.append(line.strip()) #line.strip()这步很关键,不然删除的时候根本就不匹配!
 18         print(result_list)
 19     return result_list #一定要返回,不然删除的时候 fetch_list为空
 20 
 21 #新增
 22 def add(infor):
 23     backend_title = arg.get("backend")  # 要插入的backend的名称
 24     context_title = "backend %s" % (backend_title)  # 要插入backend整个字段
 25     record_title = arg["record"]
 26     context_record = "server %s %s weight %s maxconn %s" % (record_title["server"],
 27                      record_title["server"], record_title["weight"],record_title["maxconn"])
 28 
 29     find_flag = False
 30     # 查找是否存输入已存在
 31     with open(configuration, r, encoding=utf-8) as f:
 32         for line in f:
 33             if line.strip() == "backend %s" % backend_title:
 34                 find_flag = True
 35                 continue
 36             if line.strip().startswith("backend"):
 37                 flag = False
 38 
 39     # 新建的时候判断是否已经存在
 40     if find_flag:
 41         print(已经存在!)
 42     else:
 43         with open(configuration, r, encoding=utf-8) as f, open(configuration_new, w+,
 44                                                                      encoding=utf-8) as f_new:
 45             for line in f:
 46                 f_new.write(line)
 47             f_new.write(\n + context_title + "\n")
 48             new_backend = " " * 8 + context_record + "\n"
 49             f_new.write(new_backend)
 50             print("新建成功!")
 51         os.rename(configuration, configuration.bak)
 52         os.rename(configuration_new, configuration)
 53         os.remove(configuration.bak)
 54 
 55 #删除
 56 def delete(dict_info):
 57     # 1.首先获取用户的记录并以列表的形式存储,以便于我们调用
 58     del_backend = dict_info["backend"]
 59     del_record = dict_info["record"]
 60     context_title = "backend %s" % (del_backend)
 61     context_record = "server %s %s weight %s maxconn %s" % (
 62     del_record["server"], del_record["server"], del_record["weight"], del_record["maxconn"])
 63 
 64     # 调用上面定义的fetch()函数,得到包含backend内容的列表
 65     fetch_list = select(del_backend)
 66     # 判断1:若列表为空:直接返回
 67     if not fetch_list:
 68         return
 69     # 判断2:否则不为空
 70     else:
 71         # 判断1:若用户输入的server信息不在fetch_list里面,直接返回
 72         if context_record not in fetch_list:
 73             print("你输入的信息不存在!")
 74             return
 75         # 判断2:若输入的server在fetch_list里面,就将此server信息从列表中移除
 76         else:
 77             fetch_list.remove(context_record)
 78         with open(configuration, r) as read_obj, open(configuration.new, w) as write_obj:
 79             flag = False
 80             has_write = False
 81             for line in read_obj:
 82                 if line.strip() == context_title:
 83                     flag = True
 84                     continue
 85                 if flag and line.startswith(backend):
 86                     flag = False
 87                 if flag:
 88                     if not has_write:
 89                         print(fetch_list)
 90                         for new_line in fetch_list:
 91                             temp = "%s%s\n" % (" " * 8, new_line)
 92                             write_obj.write(temp)
 93                         has_write = True
 94                 else:
 95                     write_obj.write(line)
 96         os.rename(configuration, configuration.bak)
 97         os.rename(configuration.new, configuration)
 98         os.remove(configuration.bak)
 99         print("已经删除!")
100 
101 
102 
103 
104 #保证别人想用时,不会执行后面的东西
105 if __name__ == __main__:
106     #得到用户的输入信息
107     chooses = ‘‘‘
108 1 》》》》》查找
109 2 》》》》》新建
110 3 》》》》》删除
111 ‘‘‘
112     print(chooses)
113     while True:
114         user_choose = input(请输入:)
115         #根据用户的输入调用不同函数
116         if user_choose.isdigit():
117             user_choose = int(user_choose)
118             if user_choose == 1:
119                 domain = input("请输入要查找的域名:")
120                 select(domain)
121             elif user_choose == 2:
122                 print("arg = {‘backend‘: ‘www.oldboy‘,‘record‘: {‘server‘: ‘100.1.7.9‘,‘weight‘: 20,‘maxconn‘: 30}}")
123                 arg = eval(input("新建arg:"))
124                 add(arg)
125             elif user_choose == 3:
126                 print("arg = {‘backend‘: ‘www.oldboy‘,‘record‘: {‘server‘: ‘100.1.7.9‘,‘weight‘: 20,‘maxconn‘: 30}}")
127                 arg = eval(input("删除arg:"))
128                 delete(arg)
129             else:
130                 print(输入的值不存在!)
131         elif user_choose ==q:
132             exit("程序已经退出!")
133         else:
134             print("输入错误!")

 

感想:

  编写这个配置文件有很多难点。查询是最容易实现的,接着是新建,新建中有一个点就是要判断是否已经存在,最后我个人认为最难的一点就是删除,删除要用到查询的方法,然后把查到的内容存到一个列表里面,因为在python中,列表的增删改查实现起来很容易。在删除会遇到很多坑。。我就不多说了,出现问题的话自己打断点调试。以后编写大概都是这个形式。从后面开始,就开始面向对象编程了,函数也会经常用了!自己建了一个学习群:625386800,适合新手学习Python,后面我会把我学习的资料上传到群文件,有兴趣的可以一起加群交流





















































以上是关于Python-Day5修改haproxy配置文件的主要内容,如果未能解决你的问题,请参考以下文章

修改haproxy配置文件

Python-Day3

修改haproxy配置文件

第三周:HAproxy配置文件操作

初学 python 之 HAproxy配置文件操作

HAproxy配置文件操作