1. 程式人生 > >Python-Day5修改haproxy配置文件

Python-Day5修改haproxy配置文件

style conf time temp start 不同 退出 true server

需求:

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配置文件