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

修改haproxy配置文件

border 包含 list [] ror 是否 .com text d參數

運用的知識點:

  1.python簡單數據結構的使用:列表、字典等

  2.python兩個模塊的使用:os和json

      1.os.rename(‘文件1‘,‘文件2‘)

      2.json完成自動識別字典、列表,並識別後進行自動轉換

  3.python函數的定義和調用

  4.標誌位的靈活運用:flag和haswrite分別用於找backend的record和判斷是否已經將記錄寫入到文件

  5.python基本語法的使用:for循環、if...else....判斷

  6.python文件的操作的基本使用:with open(‘文件1‘,‘模式‘) as obj1,open(‘文件2‘,‘模式‘) as obj2

  

代碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 #!/usr/bin/env python # -*- coding:utf-8 -*- #導入2個模塊json和os import json,os #定義fetch函數,並同時傳入我們指定backend參數,此參數代表backend名 def fetch(backend): flag = False #定義flag,目的是為了後面是否取可用的backend fetch_list=[] #定義空列表,目的是為了後面將取出的backend信息存儲在此列表裏面 #以讀的形式打開‘ha‘文件,一行一行讀,然後將我們指定backend讀取到列表裏面 #最後返回裝有我們指定backend信息的列表
with open(‘ha‘) as obj: for line in obj: if line.strip() == "backend %s" %(backend): flag = True continue if line.strip().startswith(‘backend‘): flag=False if flag and line.strip(): fetch_list.append(line.strip()) return fetch_list #定義add1函數,並同時傳入參數dict_info,此字典參數裏面包含我們要傳入的server相關信息 def add1(dict_info): backend_title = dict_info.get("backend") #要插入的backend的名稱 context_title = "backend %s" %(backend_title) #要插入backend整個字段 record_title = dict_info["record"] #要插入的記錄信息 context_record = "server %s %s weight %s maxconn %s" %(record_title["server"],record_title["server"],record_title["weight"],record_title["maxconn"]) #將backend獲取,並存儲在fetch_list列表裏面 fetch_list=fetch(backend_title) #如果要插入的backend存在 #1.首先設定2個標誌:flag和has_write #flag:用於找到要添加的backend下的內容 #has_write:用於判斷fetch_list中的內容是否重新寫入到了文件 #2.遍歷源文件ha: #1首先逐行讀取,並同時進行判斷, # 1.判斷backend是否已經找到,先把backend寫入文件,然後找到後將flag設置為True,最後跳出本次循環 # 2.判斷找到的backend裏面的record是否為空,若為空將flag設置為False # 3.對flag進行判斷 #1.將flag為True的record從fetch_list寫入到文件中,在這裏面同時要進行是否已經寫入的判斷,即定義has_write的作用 #2.若flag為False,就直接寫入新文件,即將非列表裏的內容直接寫入 if fetch_list: flag=False has_write = False with open(‘ha‘) as read_obj,open(‘ha.new‘,‘w‘) as write_obj: for line in read_obj: if line.strip() == context_title: write_obj.write("\n"+line) flag=True continue if flag and line.startswith(‘backend‘): flag = False if flag: for new_line in fetch_list: if not has_write: temp = "%s%s" %(" "*8,new_line) write_obj.write(temp) has_write=True else: write_obj.write(line) else: #如果要插入的backend不存在 #分2部分寫入: # 1部分.從ha文件裏面直接讀取,並同時將讀取的內容寫入新的文件ha.new # 2部分.將新的backend和context信息,直接寫到新的文件ha.new的文件尾部 with open(‘ha‘) as read_obj,open(‘ha.new‘,‘w‘) as write_obj: for line in read_obj: write_obj.write(line) write_obj.write("\n"+context_title+"\n") temp=" "*8+context_record+"\n" write_obj.write(temp) #將原文件ha改名備用文件為ha.bak,即將ha下線 #將新文件ha.new改名為線上文件ha,即將ha.new上線 os.rename(‘ha‘,‘ha.bak‘) os.rename(‘ha.new‘,‘ha‘) #刪除函數 def delete(dict_info): #1.首先獲取用戶的記錄並以列表的形式存儲,以便於我們調用 del_backend = dict_info["backend"] del_record = dict_info["record"] context_title = "backend %s" %(del_backend) context_record = "server %s %s weight %s maxconn %s" %(del_record["server"],del_record["server"],del_record["weight"],del_record["maxconn"]) #調用上面定義的fetch()函數,得到包含backend內容的列表 fetch_list = fetch(del_backend) #判斷1:若列表為空:直接返回 if not fetch_list: return #判斷2:否則不為空 else: #判斷1:若用戶輸入的server信息不在fetch_list裏面,直接返回 if context_record not in fetch_list: print "your server message is not exists" return #判斷2:若輸入的server在fetch_list裏面,就將此server信息從列表中移除 else: fetch_list.remove(context_record) #逐行從ha文件中讀取,並同時進行判斷 #核心思想: #首先邊讀取、邊判斷、邊寫入, # 判斷其實就是我們自己輸入的backend,找到後將列表fetch_list信息寫入到新的文件裏面。 # 其余的非列表的內容直接從源文件ha寫到新文件ha.new即可 with open(‘ha‘,‘r‘) as read_obj,open(‘ha.new‘,‘w‘) as write_obj: flag = False has_write = False for line in read_obj: if line.strip() == context_title: write_obj.write(line) flag = True continue if flag and line.startswith(‘backend‘): flag = False if flag: if not has_write: print fetch_list for new_line in fetch_list: temp = "%s%s\n" %(" "*8,new_line) write_obj.write(temp) has_write = True else: write_obj.write(line) #將原文件ha改名備用文件為ha.bak,即將ha下線 #將新文件ha.new改名為線上文件ha,即將ha.new上線 os.rename(‘ha‘,‘ha.bak‘) os.rename(‘ha.new‘,‘ha‘) """ s=‘{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}‘ data_info=json.loads(s) add1(data_info) #delete(data_info) """ #主函數 if __name__ == "__main__": #獲取用戶的操作選擇 print u"1.獲取記錄\n2.添加記錄\n3.刪除記錄\n" select_num=raw_input("plz input number:") #根據用戶的選擇,進行調用函數 if select_num == "1": backend = raw_input("plz input backend:") fetch_list = fetch(backend) for i in fetch_list: print i else: print "plz input like this example:" print ‘{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}‘ data_str = raw_input("plz input record>>>") data_dict = json.loads(data_str) if select_num == "2": add1(data_dict) elif select_num == "3": delete(data_dict) else: print "input error"

修改haproxy配置文件