实现功能
1 backend记录查询
2 增加backend记录
1)若backend记录不存在,则添加backend及ha记录
2)若backend存在,要添加的记录存在,则返回提示已存在
3)若backend存在,要添加的记录不存在,则添加记录
3 删除backend记录
1)若backend不存在则返回提示不存在
2)若backend存在,根据显示的backend记录,选择序号删除,若删除指定后记录为空则连backend行同时删除,若删除指定后记录不为空则返回当前backend记录
Haproxy文件ha
1 global
2 log 127.0.0.1 local2
3 daemon
4 maxconn 256
5 log 127.0.0.1 local2 info
6 defaults
7 log global
8 mode http
9 timeout connect 5000ms
10 timeout client 50000ms
11 timeout server 50000ms
12 option dontlognull
13
14 listen stats :8888
15 stats enable
16 stats uri /admin
17 stats auth admin:1234
18
19 frontend oldboy.org
20 bind 0.0.0.0:80
21 option httplog
22 option httpclose
23 option forwardfor
24 log global
25 acl www hdr_reg(host) -i www.oldboy.org
26 use_backend www.oldboy.org if www
27
28 backend www.oldboy.org
29 server 100.1.7.99 weight 20 maxconn 3000
30
31 backend buy.oldboy.org
32 server 100.1.7.9 weight 20 maxconn 3000
流程图
python实现代码
1 #!/usr/bin/env python3
2
3 # 获取指定backend的记录
4 def show_ha_record(ha_backend):
5 flag = False
6 record_list=[]
7 with open(‘ha‘,‘r+‘) as ha_file:
8 # 拼接完整的backend行记录
9 backend = ‘backend‘+‘ ‘+ha_backend
10 for line in ha_file:
11 # 当匹配时将标志位flag置为True,并直接进入下一个循环
12 if line.strip() == backend:
13 flag = True
14 continue
15 # 判断第一个匹配bakend后的循环中,当前line中的字符串是否以“backend”开头,若是则终止循环,代表着循环到了下一个backend
16 elif flag and line.strip().startswith(‘backend‘):
17 break
18 # 判断第一个匹配bakend后的循环中,line记录存在且不为空,则将该记录添加到列表record_list
19 elif flag and line.strip():
20 record_list.append(line)
21 return record_list
22
23
24 # 增加ha记录
25 def ha_add_record(ha_backend,backend_record):
26 flag = False
27 a=0
28 backend_line = ‘backend ‘ + ha_backend
29 record_line = ‘\t\t‘+backend_record+‘\n‘
30 if not show_ha_record(ha_backend):
31 with open(‘ha‘,‘a+‘) as ha_file:
32 ha_file.write(‘\n‘)
33 ha_file.write(backend_line+‘\n‘)
34 ha_file.write(record_line)
35 print(‘添加成功!\n‘)
36 elif show_ha_record(ha_backend):
37 for line_record in show_ha_record(ha_backend):
38 if backend_record.strip().split()[1] == line_record.strip().split()[1]:
39 print(‘您要增加ip在当前backend已经存在!\n‘)
40 break
41 else:
42 with open(‘ha‘, ‘r+‘) as ha_file:
43 ha_file_list = ha_file.readlines()
44 for n,line in enumerate(ha_file_list):
45 # 当匹配时将标志位flag置为True,并直接进入下一个循环
46 if line.strip() == backend_line:
47 flag = True
48 continue
49 # 判断第一个匹配bakend后的循环中,当前line中的字符串是否以“backend”开头,若是则终止循环
50 elif flag and line.strip().startswith(‘backend‘):
51 break
52 # 判断第一个匹配bakend后的循环中,循环当前backend的记录,将最后一个记录的位置记录到b
53 elif flag and line.strip():
54 a = n
55 # 在当前backend的最后一条记录添加新记录
56 ha_file_list.insert(a+1,record_line)
57 ha_file.seek(0)
58 ha_file.truncate()
59 for record in ha_file_list:
60 ha_file.write(record)
61 print(‘添加成功!\n‘)
62 backend_list = show_ha_record(ha_backend)
63 return backend_list
64
65
66 #删除ha记录
67 def ha_del_record(ha_backend,del_num):
68 # 拼接backend
69 backend_line = ‘backend ‘ + ha_backend
70 with open(‘ha‘, ‘r+‘) as ha_file:
71 # 将文件读入列表
72 ha_file_list = ha_file.readlines()
73 # 当前backend下的ha记录
74 ha_backend_list = show_ha_record(ha_backend)
75 # ha_backend_list列表中的记录也存在于文件中,所以从ha_file_list列表删除选中的记录,
76 ha_file_list.remove(ha_backend_list[int(del_num) - 1])
77 # 将选中的记录也从 ha_backend_list列表中移除
78 del ha_backend_list[int(del_num) - 1]
79 # 如果ha_backend_list列表为空,将当前backend的行也删除
80 if not ha_backend_list:
81 ha_file_list.remove(backend_line+‘\n‘)
82 # 文件处理,将新的文件列表重写到文件中
83 ha_file.seek(0)
84 ha_file.truncate()
85 for ha_line in ha_file_list:
86 ha_file.write(ha_line)
87 return ha_backend_list
88
89
90 menu = ‘‘‘ 1、获取ha记录
91 2、增加ha记录
92 3、删除ha记录‘‘‘
93
94
95 def main():
96 print(‘欢迎来到ha配置文件管理系统‘)
97 while True:
98 print(40 * ‘*‘)
99 print(menu)
100 print(40 * ‘*‘)
101 menu_input = input(‘请输入序号,退出请输入q :‘)
102 if menu_input == ‘1‘:
103 ha_backend = input(‘请输入backend,例"www.zhy.com":‘)
104 while True:
105 ha_record_list = show_ha_record(ha_backend)
106 # 当返回的列表不为空
107 if ha_record_list:
108 print(‘当前backend:%s的记录如下‘ % ha_backend)
109 for n,line in enumerate(ha_record_list):
110 print(‘%d- %s‘ % (n+1, line.strip()))
111 input("按任意键返回主菜单:")
112 break
113 else:
114 ha_backend=input("您输入的backend不存在,请重新输入:")
115
116 elif menu_input == ‘2‘:
117 add_backend = input(‘请输入要添加记录的backend,例"www.zhy.com":‘)
118 add_backend_record = input(‘请输入要添加的记录,例"server 1.1.1.1 weight 20 maxconn 3000":‘)
119 # 调用函数添加记录
120 backend_record=ha_add_record(add_backend,add_backend_record)
121 print(‘当前backend:%s的记录如下‘ % add_backend)
122 # 显示添加后backend记录
123 for n, line in enumerate(backend_record):
124 print(‘%d- %s‘ % (n + 1, line.strip()))
125 print(‘\n‘)
126 input("按任意键返回主菜单:")
127 elif menu_input == ‘3‘:
128 del_backend = input(‘请输入将删除记录所属的backend:‘)
129 # 调用显示输入backend记录函数
130 del_record_list = show_ha_record(del_backend)
131 # 判断输入的backend不存在
132 if not del_record_list:
133 print(‘您输入的backend不存在!‘)
134 # 判断输入的backend存在
135 elif del_record_list:
136 print(‘当前backend:%s的记录如下‘ % del_backend)
137 # 显示backend的ha记录
138 for n, line in enumerate(del_record_list):
139 print(‘%d- %s‘ % (n + 1, line.strip()))
140 print(‘\n‘)
141 del_num = input(‘请输入要删除记录的序号:‘)
142 # 调用删除记录函数
143 del_backend_list = ha_del_record(del_backend, del_num)
144 # 执行完删除记录操作后,当前backend的ha记录不为空
145 if del_backend_list:
146 print(‘当前backend:%s的记录如下‘ % del_backend)
147 for n, line in enumerate(del_backend_list):
148 print(‘%d- %s‘ % (n + 1, line.strip()))
149 print(‘\n‘)
150 #执 行完删除记录操作后,当前backend的ha记录为空
151 else:
152 print(‘您的backend已经完全清除!‘)
153 input("按任意键返回主菜单:")
154
155 elif menu_input == ‘q‘:
156 exit()
157 else:
158 print(‘\033[1;31m输入错误,请重新输入\033[0m‘)
159
160
161 if __name__ == ‘__main__‘:
162 main()