Jinja2网络自动化-增加变量(子网+1)

问题描述 投票:0回答:1

首先,我是一名网络工程师,学习了一些编码,并尝试使用这项相对较新的技术进行发展。我已经就以下问题在互联网上搜索了许多小时,但大多数搜索结果都包含了我目前不想要的Ansible。

我正在使用python / jinja2脚本,该脚本基于称为confplate的VAR生成配置:请参阅https://github.com/verbosemode/confplate-我已经进行了一些测试,并且效果很好。超级简单,快速。

但是,我试图使用一个变量(网络地址)并在Jinja2模板中递增它来设置IP地址。

请参见下面的Jinja2代码段:

ip dhcp pool WLAN01
network {{ vlan400_network }} 255.255.255.0
domain-name abc.xyz
default-router {{ vlan400_network + 1 }}
lease 0 1

vlan400_network = 172.29.50.0

我希望默认路由器为172.29.50.1-当然我不能使用上面的代码片段来增加它。

我需要为此使用正则表达式吗?仅使用Jinja2似乎并不容易。我的偏好是仅使用Python / Jinja2完成此操作。这可能吗?预先感谢!

python templates networking jinja2 cisco
1个回答
0
投票

正如您所发现的,如果仅依靠Jinja2的默认过滤器,那么为网络设备生成配置就不会走得太远。

您必须编写自己的自定义过滤器(在Python中,并在模板文件中使用它们。

对于您拥有的示例,请执行以下操作:

步骤1:设计模板

我将提供VLAN网络作为CIDR规范:

./confplate.py template.txt vlan400_network=21.22.23.0/24

如您所见,这是直观且灵活的:如果您愿意,可以将网络更改为21.22.23.192/26,一切将继续正常运行,正如我们很快就会看到的。

此模板看起来像:

ip dhcp pool WLAN01
 network {{ vlan400_network | network_from_cidr }}
 domain-name abc.xyz
 default-router {{ vlan400_network | gateway_from_cidr }}
 lease 0 1

其中network_from_cidrgateway_from_cidr是我们不久将创建的自定义Jinja2过滤器。

[想法是network_from_cidr过滤器将采用字符串“ 21.22.23.0/24”,并返回字符串“ 21.22.23.0 255.255.255.0”。同样,gateway_from_cidr过滤器将使用字符串“ 21.22.23.0/24”并返回“ 21.22.23.1”(即,子网中的第一个非零主机地址)。

步骤2:为自定义过滤器编写Python代码

创建一个名为custom_filters.py的文件,并输入以下代码:

import ipaddress

def network_from_cidr (cidr):
    ipn = ipaddress.ip_network(unicode(cidr), strict=True)
    return '{} {}'.format(ipn.network_address, ipn.netmask)

def gateway_from_cidr (cidr):
    ipn = ipaddress.ip_network(unicode(cidr), strict=True)
    # By convention, the gateway has the first non-zero address in the subnet
    first_address = list(ipn.hosts())[0]
    return first_address

该代码使用ipaddress module。如您所见,我们定义了两个函数,一个用于我们要创建的每个自定义过滤器。这些函数采用一个参数,该参数是模板中|之前的字符串。

第3步:告诉confplate.py您的自定义过滤器

confplate.py开头的某个地方写import custom_filters

然后您必须说:

env = Environment(loader=FileSystemLoader(self.templatepath), undefined=StrictUndefined)

# Load our custom filters
env.filters['network_from_cidr'] = custom_filters.network_from_cidr
env.filters['gateway_from_cidr'] = custom_filters.gateway_from_cidr

在代码中的适当位置(在confplate.py中,您实际上必须执行两次,一次在get_template_vars函数中,一次在render_template中]

Test

./confplate.py template.txt vlan400_network=21.22.23.0/24
ip dhcp pool WLAN01
 network 21.22.23.0 255.255.255.0
 domain-name abc.xyz
 default-router 21.22.23.1
 lease 0 1

./confplate.py template.txt vlan400_network=21.22.23.192/26
ip dhcp pool WLAN01
 network 21.22.23.192 255.255.255.192
 domain-name abc.xyz
 default-router 21.22.23.193
 lease 0 1
© www.soinside.com 2019 - 2024. All rights reserved.