解析 keepalived.conf,转换为 JSON
有没有什么好的方法(最好是用Python)来解析keepalived.conf这个格式,并把它转换成json格式?我想自动化添加和删除虚拟服务器和真实服务器。
我第一反应是用pyparsing,参考了一些StackOverflow上的回答,但我就是搞不定!
keepalived.conf的格式是这样的:
virtual_server 192.168.1.1 80
{
lb_algo wrr
lb_kind DR
protocol TCP
ha_suspend
delay_loop 10
# server-01
real_server 192.168.1.100 80
{
weight 100
inhibit_on_failure
TCP_CHECK
{
connect_port 80
connect_timeout 5
}
}
# server-02
real_server 192.168.1.101 80
{
weight 100
inhibit_on_failure
TCP_CHECK
{
connect_port 80
connect_timeout 5
}
}
}
提前谢谢你们!
1 个回答
0
这是对解析这些数据的一个初步尝试:
from pyparsing import *
# basic punctuation - useful in parsing, but suppress from results
LBRACE,RBRACE = map(Suppress, "{}")
# some simple terminals
ipv4_address = Regex(r"\d{1,3}(\.\d{1,3}){3}")
ipv6_address = Regex(r"[0-9a-fA-F:]+")
ip_address = ipv4_address | ipv6_address
integer = Word(nums).setParseAction(lambda t:int(t[0]))
# config parameters that take 0 or 1 arguments
config_param0 = oneOf("ha_suspend inhibit_on_failure")
config_param1 = oneOf("""lb_algo b_kind protocol delay_loop weight
connect_port connect_timeout""")
param_arg = integer | Word(alphanums)
config_param = Group(config_param1 + param_arg) | config_param0
# definitions for a real_server
tcp_check = ("TCP_CHECK" + LBRACE +
OneOrMore(config_param) +
RBRACE)
real_defn = Group("real_server" +
ip_address("rip_address") +
integer("rport") + LBRACE +
ZeroOrMore(config_param)("params") +
tcp_check("tcp_check") + RBRACE
)
# definiton for a virtual_server
virtual_defn = ("virtual_server" +
ip_address("vip_address") +
integer("vport") + LBRACE +
ZeroOrMore(config_param)("params") +
OneOrMore(real_defn)("real_defns") + RBRACE
)
# skip over comments
comment = '#' + restOfLine
virtual_defn.ignore(comment)
# parse the input string and dump out the pieces
confdata = virtual_defn.parseString(conf)
print confdata.dump()
for rip in confdata.real_defns:
print
print rip.dump()
输出结果如下:
['virtual_server', '192.168.1.1', 80, ['lb_algo', 'wrrl'], ...
- params: [['lb_algo', 'wrrl'], ['b_kind', 'DR'], ['protocol', 'TCP'],
'ha_suspend', ['delay_loop', 10]]
- real_defns: [['real_server', '192.168.1.100', 80, ['weight', ...
- vip_address: 192.168.1.1
- vport: 80
['real_server', '192.168.1.100', 80, ['weight', 100], 'inhibit_on_fa...
- params: [['weight', 100], 'inhibit_on_failure']
- rip_address: 192.168.1.100
- rport: 80
- tcp_check: ['TCP_CHECK', ['connect_port', 80], ['connect_timeout', 5]]
['real_server', '192.168.1.101', 80, ['weight', 100], 'inhibit_on_fai...
- params: [['weight', 100], 'inhibit_on_failure']
- rip_address: 192.168.1.101
- rport: 80
- tcp_check: ['TCP_CHECK', ['connect_port', 80], ['connect_timeout', 5]]