我对python和mako很新,我可能在基本概念上遇到麻烦。我有工作模板,但是如果我可以使用netaddr模块来处理模板中的IP地址,我的CSV输入可以大大地清理干净。我想要做的是通过一个接口IP变量,如: LAN_IP ='192.168.1.1/24'(我从CSV做这个)到模板,然后以某种方式使用netaddr模块来填写IP,子网掩码(点分十进制和反掩码)和网络地址,以便我可以在同一配置中使用该CSV变量作为bgp网络语句,eigrp掩码和ACL等。我可以从Python shell执行以下操作:使用mako进行思科配置生成。是否可以在模板中使用netaddr模块(或任何模块)?
>>> from netaddr import *
>>> LAN_IP = '192.168.1.1/24'
>>> IP = IPNetwork(LAN_IP)
>>> print(IP.ip)
192.168.1.1
>>> print(IP.network)
192.168.1.0
>>> print(IP.netmask)
255.255.255.0
>>> print(IP.hostmask)
0.0.0.255
编辑。我被告知尝试使用构建功能的ipaddress。从Python提示符尝试这表明它可以工作:
MAKO_TEMPLATE_STRING = """\
<%def name="get_netmask(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).netmask
%></%def>
<%def name="get_address(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).ip
%></%def>
<%def name="get_subnet(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).network
%></%def>
<%def name="get_hostmask(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).hostmask
%></%def>
! Variable Input: ${data}
${get_address(data)} ${get_netmask(data)} ${get_subnet(data)} ${get_hostmask(data)}
"""
print(Template(MAKO_TEMPLATE_STRING).render(data="192.168.1.1/25"))
这给了我下面的输出: !可变输入:192.168.1.1/25 192.168.1.1 255.255.255.128 192.168.1.0/25 0.0.0.127
现在,一个新的问题是,ipaddress.IPv4Interface(ip_string)。网络定义返回网络PLUS子网netaddr没有做的“192.168.1.0/25”。我还没有找到任何方法让ipaddress只返回子网部分。
所以对于模板构建我有点远....如果我把只有这到模板,它证明:
<%def name="get_netmask(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).netmask
%></%def>
<%def name="get_address(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).ip
%></%def>
<%def name="get_network(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).network
%></%def>
但是当我尝试任何类型的引用,我得到一个错误。
! Variable Input: ${LAN_IP} <--I tried with and without this line
${get_address(LAN_IP)} <--The template does not seem to like these references.
${get_netmask(LAN_IP)}
${get_subnet(LAN_IP)}
在我看来,我错过了一些非常简单的东西,但也许我错误地接近了这个问题。任何帮助将不胜感激,因为Mako文档和谷歌已经很少说明如何做这样的事情。
仍在工作,但目前为止还没有任何帮助。 –
虽然我可能已经变得更远了。我试过这个模板: <%! ##蟒模块级代码 进口IPADDRESS %> <%DEF名称= “get_address(ip_string)”> <% 返回ipaddress.IPv4Interface(ip_string).IP %> %def> !变量输入:$ {LAN_IP} $ {get_address(LAN_IP)} 现在我得到无效的模板,请更正以下错误:模板属性错误:在“测试”应为4个字节 由于“测试”是没有在我的模板中,我认为这是前端代码中的一个错误。 –