基于jinja和yaml的模板生成工具
cfgtemplater的Python项目详细描述
cfgTemplater
cfgtemplater是一个jinja2模板cli呈现工具。它允许在一个yaml头中集成元数据和默认变量值。它还集成了基本的IP过滤器和测试,因为它的主要开发目的是生成网络设备配置文件。它还可以从其他python模块加载外部过滤器和测试。
安装
pip install cfgtemplater
用法
usage: cfgtemplater [-h] [-y YAML] [-p KEY=VALUE] [-e FILE] TEMPLATE
A simple YAML/Jinja2 config generator.
positional arguments:
TEMPLATE template
optional arguments:
-h, --help show this help message and exit
-y YAML YAML file
-p KEY=VALUE key/value pair
-e FILE Jinja2 extensions modules
用法示例
从yaml文件加载变量
cfgtemplater -y variables.yml template.j2
从多个yaml文件加载变量(按顺序合并)
cfgtemplater -y default_variables.yml -y instance_variables.yml template.j2
覆盖来自cli的变量
cfgtemplater -y default_variables -p 'variable1=value1' template.j2
从cli传递python文本
cfgtemplater -p "variable1=[{'name':'varx', 'value':'x'}, {'name':'vary', 'value':'y'}]" template.j2
模板
(主)模板可能如下:
---name: Example templatevariables: variable1: default: "example" description: "example variable" variable2: default: - value: 0 name: zero - value: 1 name: one---This is an {{variable1}} file.{%forvariableinvariable2%} This is a {{variable.name}} : {{variable.value}}{%endfor%}{{variable3}}
yaml头可能包含模板元数据(如名称、描述等)。它还可以包含默认变量、变量描述或任何变量元数据。默认值在呈现时注入模板中,可以使用cli或yaml文件重新定义。
扩展名
jinja2过滤器和测试可以从外部文件加载。
加载ansible ipaddr筛选器(ansible_ipaddr.py)
importnetaddrfromansible.plugins.filter.ipaddrimport*
使用ipaddr过滤器渲染模板
cfgtemplater -e ansible_ipaddr.py template.j2
基本模块用法
>>>fromcfgtemplater.config_templateimportConfigTemplate>>>t=ConfigTemplate('examples/example1.j2')>>>t.name'Example template'>>>t.variables{'variable1':{'default':'example','description':'example variable'},'variable2':{'default':[{'value':0,'name':'zero'},{'value':1,'name':'one'}]}}>>>t.content'This is an {{ variable1 }} file.\n\n{% for variable in variable2 %}\n This is a {{ variable.name }} : {{ variable.value }}\n{% endfor %}\n\n{{ variable3 }}\n'>>>print(t.render({'variable3':'TEST'}))Thisisanexamplefile.Thisisazero:0Thisisaone:1TEST
集成过滤器和测试
IP过滤器
第一个地址
{{ipv4_net|first_address}}{{ipv6_net|first_address}}
192.0.2.1/24
2001:db8::1/120
最后一个地址
{{ipv4_net|last_address}}{{ipv6_net|last_address}}
192.0.2.254/24
2001:db8::ff/120
地址
{{ipv4_net|address}}{{ipv6_net|address}}
192.0.2.0
2001:db8::
网络
{{ipv4_net|first_address|network}}{{ipv6_net|first_address|network}}
192.0.2.0/24
2001:db8::/120
广播
{{ipv4_net|broadcast}}{{ipv6_net|broadcast}}
192.0.2.255/24
2001:db8::ff/120
预驱动桥
{{ipv4_net|prefixlen}}{{ipv6_net|prefixlen}}
24
120
网络掩码
{{ipv4_net|netmask}}{{ipv6_net|netmask}}
255.255.255.0
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00
主机掩码
{{ipv4_net|first_address|hostmask}}{{ipv6_net|first_address|hostmask}}
0.0.0.255
::ff
压缩
{{'192.000.002.001'|compress}}{{'2001:0db8:0000:0000:0000:0000:0000:0001'|compress}}
192.0.2.1
2001:db8::1
解压缩
{{'192.0.2.1'|uncompress}}{{'2001:db8::1'|uncompress}}
192.000.002.001
2001:0db8:0000:0000:0000:0000:0000:0001
八位字节
{%foroctetinipv4_net|octets%}{{octet}}{%endfor%}
192
0
2
0
六角体
{%forhextetinipv6_net|hextets%}{{hextet}}{%endfor%}
2001
0db8
0000
0000
0000
0000
0000
0000
IP测试
是IP
{{ipv4_net|is_ip}}{{ipv6_net|is_ip}}{{'test'|is_ip
True
True
False
是IPv4
{{ipv4_net|is_ipv4}}{{ipv6_net|is_ipv4}}
True
False
是IPv6
{{ipv6_net|is_ipv6}}{{ipv4_net|is_ipv6}}
True
False
是IP网络
{{ipv4_net|is_ip_net}}{{ipv6_net|is_ip_net}}{{ipv6_net|first_address|is_ip_net}}{{ipv6_net|first_address|is_ip_net}}
True
True
False
False
是IPv4网络
{{ipv4_net|is_ipv4_net}}{{ipv6_net|is_ipv4_net}}{{ipv4_net|first_address|is_ipv4_net}}{{ipv6_net|first_address|is_ipv4_net}}
True
False
False
False
是IPv6网络
{{ipv6_net|is_ipv6_net}}{{ipv4_net|is_ipv6_net}}{{ipv6_net|first_address|is_ipv4_net}}{{ipv4_net|first_address|is_ipv4_net}}
True
False
False
False
是IPv4主机
{{ipv4_net|first_address|is_ipv4_host}}{{ipv4_net|is_ipv4_host}}
True
False
192.0.2.1/24
2001:db8::1/120
192.0.2.254/24
2001:db8::ff/120
192.0.2.0
2001:db8::
192.0.2.0/24
2001:db8::/120
{{ipv4_net|broadcast}}{{ipv6_net|broadcast}}
192.0.2.255/24
2001:db8::ff/120
预驱动桥
{{ipv4_net|prefixlen}}{{ipv6_net|prefixlen}}
24
120
网络掩码
{{ipv4_net|netmask}}{{ipv6_net|netmask}}
255.255.255.0
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00
主机掩码
{{ipv4_net|first_address|hostmask}}{{ipv6_net|first_address|hostmask}}
0.0.0.255
::ff
压缩
{{'192.000.002.001'|compress}}{{'2001:0db8:0000:0000:0000:0000:0000:0001'|compress}}
192.0.2.1
2001:db8::1
解压缩
{{'192.0.2.1'|uncompress}}{{'2001:db8::1'|uncompress}}
192.000.002.001
2001:0db8:0000:0000:0000:0000:0000:0001
八位字节
{%foroctetinipv4_net|octets%}{{octet}}{%endfor%}
192
0
2
0
六角体
{%forhextetinipv6_net|hextets%}{{hextet}}{%endfor%}
2001
0db8
0000
0000
0000
0000
0000
0000
IP测试
是IP
{{ipv4_net|is_ip}}{{ipv6_net|is_ip}}{{'test'|is_ip
True
True
False
是IPv4
{{ipv4_net|is_ipv4}}{{ipv6_net|is_ipv4}}
True
False
是IPv6
{{ipv6_net|is_ipv6}}{{ipv4_net|is_ipv6}}
True
False
是IP网络
{{ipv4_net|is_ip_net}}{{ipv6_net|is_ip_net}}{{ipv6_net|first_address|is_ip_net}}{{ipv6_net|first_address|is_ip_net}}
True
True
False
False
是IPv4网络
{{ipv4_net|is_ipv4_net}}{{ipv6_net|is_ipv4_net}}{{ipv4_net|first_address|is_ipv4_net}}{{ipv6_net|first_address|is_ipv4_net}}
True
False
False
False
是IPv6网络
{{ipv6_net|is_ipv6_net}}{{ipv4_net|is_ipv6_net}}{{ipv6_net|first_address|is_ipv4_net}}{{ipv4_net|first_address|is_ipv4_net}}
True
False
False
False
是IPv4主机
{{ipv4_net|first_address|is_ipv4_host}}{{ipv4_net|is_ipv4_host}}
True
False
24
120
255.255.255.0
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00
0.0.0.255
::ff
192.0.2.1
2001:db8::1
192.000.002.001
2001:0db8:0000:0000:0000:0000:0000:0001
192
0
2
0
2001
0db8
0000
0000
0000
0000
0000
0000
True
True
False
True
False
{{ipv6_net|is_ipv6}}{{ipv4_net|is_ipv6}}
True
False
是IP网络
{{ipv4_net|is_ip_net}}{{ipv6_net|is_ip_net}}{{ipv6_net|first_address|is_ip_net}}{{ipv6_net|first_address|is_ip_net}}
True
True
False
False
是IPv4网络
{{ipv4_net|is_ipv4_net}}{{ipv6_net|is_ipv4_net}}{{ipv4_net|first_address|is_ipv4_net}}{{ipv6_net|first_address|is_ipv4_net}}
True
False
False
False
是IPv6网络
{{ipv6_net|is_ipv6_net}}{{ipv4_net|is_ipv6_net}}{{ipv6_net|first_address|is_ipv4_net}}{{ipv4_net|first_address|is_ipv4_net}}
True
False
False
False
是IPv4主机
{{ipv4_net|first_address|is_ipv4_host}}{{ipv4_net|is_ipv4_host}}
True
False