简介
利用Python的文件操作命令和函数功能,实现 :
1、获取ha记录
2、增加ha记录
3、删除ha记录
文件内容
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
server 100.1.7.10 100.1.7.9 weight 20 maxconn 3000
server 100.1.7.11 100.1.7.9 weight 20 maxconn 3000
backend buy.oldboy.org
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
原配置文件如上
现增加ha配置文件为:
实践一
import json
def read_haproxy(backend_str, f1):
"""
查找、获取记录
:param backend_str: 输入的backend
:param f1: 文件句柄
:return:
"""
backend_str = "backend " + backend_str
result = 0
for line in f1:
if backend_str.strip() == line.strip():
line_str = f1.readline()
result = 1
while line_str.startswith(" server"):
print(line_str)
line_str = f1.readline()
return result
def add_haproxy(str, f1, f2):
"""
增加记录
:param str: 记录语句
:param f1: 文件句柄
:param f2: 文件句柄
:return:
"""
read_dict = json.loads(str)
# n = json.loads(s) # 将一个字符串,转换成python的基本数据类型; 注意:字符串形式的字典'{"k1":"v1"}'内部的字符串必须是 双引号
backend_title = read_dict['backend']
server = read_dict['record']['server']
weight = read_dict['record']['weight']
maxconn = read_dict['record']['maxconn']
new_str = " server {} weight {} maxconn {}".format(server, weight, maxconn)
result = 0
for line in f1:
if ("backend " + backend_title).strip() == line.strip():
print("backend is already exist")
result = 1
# 针对已存在了的backend,如果下一级record也存在,则继续;如果不存在则追加新Node(record)
if result == 1 and new_str.strip() == line.strip():
print("record is already exist")
result = 2
if result == 1 and not len(line.strip()):
print("到了backend 的结尾")
if result != 2:
print("结尾追加新Node(record)")
f2.write("{}\n".format(new_str))
result = -1
f2.write(line)
return result, new_str
with open('haproxy', 'r+', encoding='utf-8')as f1, open('haproxy_change', 'w', encoding='utf-8')as f2:
input_code = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")
if input_code == "1":
back_end = input("请输入backend:")
acquire_result = read_haproxy(back_end, f1)
if acquire_result == 0:
print("没有该backend记录")
elif input_code == "2":
add_new_line = input("请输入要增加的新backend记录:")
# {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}}
# {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
# {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
# {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}}
# {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.90","weight": 20,"maxconn": 3000}}
add_result, new_str = add_haproxy(add_new_line, f1, f2)
if add_result == 0:
print("可以增加新backend记录")
read_dict = json.loads(add_new_line)
backend_title = read_dict['backend']
new_backend = "\nbackend {}".format(backend_title)
f2.write(new_backend)
f2.write("\n{}".format(new_str))
else:
pass
查询操作
增加操作
结果:
如果都已经存在:
如果下级record不存在:
增加后的文档:
实践二
特点在于只使用了两种状态的flag,先从简单逻辑写起,再复杂实现。使用了内存列表read_result,将record.strip() in read_result进行判断记录和复写。
import json
import shutil
def fetch(backend):
# backend = "www.oldboy.org"
with open("haproxy", 'r', encoding="utf-8") as f:
result = []
flag = False
for line in f:
if line.strip().startswith("backend") and line.strip() == "backend " + backend:
print("当前所在backend %s 开头" % backend)
flag = True
continue # 表示下面的不执行,进入下次迭代,不过修改了flag = True
if line.strip().startswith("backend") and flag:
print("读到下个backend了")
break
if not line.strip() and flag:
print("读到了空白行")
break
if flag and line.strip():
print("读到server了")
result.append(line.strip())
return result
def add_backend(backend, record):
read_result = fetch(backend)
# backend不存在
if not read_result:
print("正增加新backend...")
with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f:
for line in old_f:
new_f.write(line)
new_f.write("\n{}\n".format(backend))
new_f.write(record)
else:
# backend已存在
print("backend已存在")
if record.strip() in read_result:
# backend 和 record 都已存在
print("backend 和 record 都已存在")
shutil.copy("haproxy", 'haproxy_new') # 拷贝一份
else:
# backend存在,但record不存在
print("backend存在,但record不存在")
read_result.append(record.strip())
flag = False
with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f:
for line in old_f:
if line.strip() == "backend " + backend and line.strip().startswith("backend"):
print("-->>当前所在backend %s 开头" % backend)
flag = True
new_f.write(line)
for new_record in read_result:
new_f.write("{}{}\n".format(" " * 8, new_record))
continue # 表示记录了当前行,跳过下面语句,否则会重写一行
if flag and not line.strip():
flag = False
print("-->>读到空白了")
new_f.write(line)
continue
if not flag:
print("-->>读到其他")
new_f.write(line)
command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")
if command == "1":
put_backend = input("请输入要获取的backend:") # backend = "www.oldboy.org" "buy.oldboy.org"
ret = fetch(put_backend)
print("\n".join(ret))
elif command == "2":
# {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}}
# {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
# {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}}
# {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}}
# {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}}
put_backend = input("请输入要增加的backend:")
dict_backend = json.loads(put_backend) # str转换为字典
bk = dict_backend['backend']
rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'],
dict_backend['record']['weight'],
dict_backend['record']['maxconn'])
add_backend(bk, rd)
实践三
特点是,增加backend时不需要用到fecth进行全部的扫描,只需要读一行,判断一行,写一行。
import json
import shutil
def fetch(backend):
# backend = "www.oldboy.org"
with open("haproxy", 'r', encoding="utf-8") as f:
result = []
flag = False
for line in f:
if line.strip().startswith("backend") and line.strip() == "backend " + backend:
print("当前所在backend %s 开头" % backend)
flag = True
continue # 表示下面的不执行,进入下次迭代,不过修改了flag = True
if line.strip().startswith("backend") and flag:
print("读到下个backend了")
break
if not line.strip() and flag:
print("读到了空白行")
break
if flag and line.strip():
print("读到server了")
result.append(line.strip())
return result
def add2(backend, record):
with open('haproxy', 'r', encoding='utf-8') as old, open('new.conf', 'w', encoding='utf-8') as new:
in_backend = False
has_backend = False
has_record = False
for line in old:
if line.strip().startswith('backend') and line.strip() == "backend " + backend:
print("已存在backend")
has_backend = True
in_backend = True
new.write(line)
continue
if in_backend and not line.strip():
print("in_backend的结尾为空白行")
if not has_record:
print("没有record")
new.write(record + '\n') # 先写record,
new.write(line) # 再写当前的空白行
in_backend = False
continue
if in_backend and line.strip() == record.strip():
print("backend和record都已存在")
has_record = True
new.write(line)
continue
new.write(line)
if not has_backend:
# 写backend,写record
print("backend不存在,正在增加...")
new.write('\nbackend ' + backend + '\n')
new.write(record + '\n')
command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")
if command == "1":
put_backend = input("请输入要获取的backend:") # backend = "www.oldboy.org" "buy.oldboy.org"
ret = fetch(put_backend)
print("\n".join(ret))
elif command == "2":
# {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}}
# {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
# {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}}
# {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}}
# {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}}
put_backend = input("请输入要增加的backend:")
dict_backend = json.loads(put_backend) # str转换为字典
bk = dict_backend['backend']
rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'],
dict_backend['record']['weight'],
dict_backend['record']['maxconn'])
add2(bk, rd)