在生成acl_rule的时候,需要根据j2模板来生成具体的json格式内容。下面这个例子涉及到了一些需要注意的点
先给实现代码
$ cat add_acl_rule.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from jinja2 import Template
import json
tmpl_str=\
'''{
"ACL_RULE":{
{% for ACL_RULE in ACL_RULES %}"EF_INGRESS|{{ACL_RULE['NAME']}}": {
"MIRROR_INGRESS_ACTION": "{{SESSION_NAME}}",{% for key,value in ACL_RULE['CONTENT'].items() %}
{% if value is string %}"{{key}}": "{{value}}"{% if not loop.last %},{% endif %}{% elif value is sequence %}"{{key}}":[
{% for item in value %}"{{item}}"{% if not loop.last %},{% endif %}
{% endfor %}]{% if not loop.last %},{% endif %}{% endif %}{% endfor %}
}{% if not loop.last %},{% endif %}{% endfor %}
}
}'''
if __name__ == '__main__':
acl_rule1 = {'NAME':'RULE_1','CONTENT':{'PRIORITY':'9999','SRC_IP':'10.0.0.2/32','IN_PORT':['eth1','eth2']}}
acl_rule2 = {'NAME':'RULE_2','CONTENT':{'PRIORITY':'9998','DST_IP':'10.0.0.3/32','IN_PORT':['eth1','eth2']}}
acl_rules = [acl_rule1,acl_rule2]
acl_rule_templ = Template(tmpl_str)
acl_rule_content = acl_rule_templ.render(SESSION_NAME='ABCD',ACL_RULES=acl_rules)
print acl_rule_content
运行效果
$ python add_acl_rule.py
{
"ACL_RULE":{
"EF_INGRESS|RULE_1": {
"MIRROR_INGRESS_ACTION": "ABCD",
"PRIORITY": "9999",
"SRC_IP": "10.0.0.2/32",
"IN_PORT":[
"eth1",
"eth2"
]
},"EF_INGRESS|RULE_2": {
"MIRROR_INGRESS_ACTION": "ABCD",
"PRIORITY": "9998",
"DST_IP": "10.0.0.3/32",
"IN_PORT":[
"eth1",
"eth2"
]
}
}
}
其中涉及到的点包括
- 传入的key/value,其中的value有可能是string,也可能是sequence(或叫list),需要先判断
- json文件同级的最后一项不需要逗号,统一用下面这个来判断
{% if not loop.last %},{% endif %}
- 如果打印的结果多了一些不期望的换行,需要核对一下末班中哪里多了换行,改为紧接着上文
体验下来,用jinja2定义模板,就像按照一定的规则做填字游戏,多试几次就熟悉了。
加个jinja2的文档链接,戳这里。