基于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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何强制用户在允许访问活动之前处理对话框?我的许可证代码怎么了?   java ArraysList作为JSON   mysql如何在java中创建包含多个可选where子句的搜索语句?   java如何让Apache Camel在“直接”路径的末尾删除文件?   使用socket在两个Androids之间进行java实时数据传输。IO(websocket)和4G   如何在java中实现两个CORBA服务器之间的通信   会话树xml表示为java对象   java Skype4Java编号swtwin323325   java RecyclerView getAdapterPosition()不工作:第一次单击返回正确位置,第二次单击返回1   java在$TOMCAT/conf/context上为JNDI设置资源。xml   java为什么第二个矩形冲突在第一个矩形冲突时不起作用?   JScrollPane上的java JTextArea未出现在JPanel上   java如何将实现的PriorityQueue打印为字符串?   jpa使用Jersey更新用户角色RESTJava(JAXRS)