广泛的网络自动化工具集
superloop的Python项目详细描述
超级循环
由于一家领先的网络自动化技术公司使用和开发了大量的工具集(unamed),我试图创建自己的版本。
先决条件:
- netmiko-非常感谢柯克·拜尔斯开发图书馆! < > >
- nodes.yaml
- templates.yaml < > >
- 14400秒=4小时
- (无)表示无差异。
- 注意'ssh'后面需要一个位置参数(hostname)。
- 注意到"core.sw.superloop.sfran"节点是如何从数据库中删除的。
在我们开始之前,我已经构建了这个应用程序,通过利用yaml文件的强大功能来简化数据库管理。有两个需要管理的yaml文件组合:
nodes.yaml充当所有网络设备的资源清册。当应用程序以特定方法读取时,它必须遵循下面定义的格式。
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
除了密码之外,大多数字段都是自解释的。密码以base64格式加密,因此在明文中不可见。生成这个散列的最简单方法是通过python解释器。假设您的密码是"password":
root@jumpbox:~/superloop# python
Python 2.7.6 (default, Nov 23 2017, 15:49:48)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> password = 'password'
>>> encode = base64.b64encode(password)
>>> encode
'cGFzc3dvcmQ='
>>>
密码仅在应用程序连接到您的设备时解密。目前,我只建立了对思科ios的支持,因为这些是我测试的唯一设备。随着时间的推移,我将整合更多的供应商。
templates.yaml是由所有jinja2模板组成的数据库文件。您需要包含完整路径。下面是它的外观示例。在应用程序以特定方法读取格式时,不要更改格式。只更改属性。
root@jumpbox:~/superloop# cat templates.yaml
---
- platform: cisco
type: firewall
os: ios
templates:
- /templates/cisco/ios/firewall/snmp.jinja2
- /templates/cisco/ios/firewall/base.jinja2
- platform: cisco
type: router
os: ios
templates:
- /templates/cisco/ios/router/base.jinja2
- platform: cisco
type: switch
os: ios
templates:
- /templates/cisco/ios/switch/access.jinja2
- /templates/cisco/ios/switch/services.jinja2
- /templates/cisco/ios/switch/snmp.jinja2
- /templates/cisco/ios/switch/hostname.jinja2
- /templates/cisco/ios/switch/dhcp.jinja2
我已经根据供应商、操作系统和类型构建了层次结构。为了保持模板的有序性,您也应该这样做。无论您选择什么层次结构,都需要在directory.py文件中更新/修改才能反映出来。
以一个简单的jinja2模板为例。
root@jumpbox:~/superloop# cat /templates/cisco/ios/switch/base.jinja2
{# audit_filter = ['hostname.*'] #}
hostname {{ nodes.hostname }}
注意,文件顶部有一个名为"audit_filter"的部分。此审核筛选器应包含在所有模板中。这告诉superloop在呈现配置时要查找和比较哪些行。换句话说,superloop将只查找以"hostname"开头的行。如果您想让superloop查看其他行,可以使用逗号分隔简单的附加字符串…
['hostname.*','service.*','username.*']
您还可以有一个模板,该模板由一个或多个深度类似的级别组成。
root@jumpbox:~/superloop# cat /templates/cisco/ios/switch/dhcp.jinja2
{# audit_filter = ['ip dhcp.*'] #}
ip dhcp excluded-address 10.50.80.1
ip dhcp ping packets 5
!
ip dhcp pool DATA
network 10.10.20.0 255.255.255.0
default-router 10.10.20.1
dns-server 8.8.8.8
查看"IP DHCP池数据"。下一行配置有缩进。SuperLoop足够智能,可以呈现剩余的3行配置,而无需将其包含到审核过滤器中。
现在我已经解释了基本的操作,关于有趣的东西!
超级循环审核差异
首先,我想向您介绍"审计差异"功能。此函数的设计目的是将jinja2模板与运行配置进行比较,以查看它们是否符合标准。你可以想象,如果你有数百台甚至数千台设备需要维护,如果没有某种形式的审计/自动化工具,标准化将是一场噩梦。举个例子,比方说有一天,小阿米特决定在交换机上进行未经授权的手动配置更改。没人知道他做了什么。superloop将能够深入到设备中,查看模板中是否存在任何差异,因为模板被视为可信源。如果superloop感知到差异,它将为您提供补救的选项。无论小阿米特决定配置什么,基本上都可以不费吹灰之力地删除。这也能起到相反的作用。如果设备上的配置没有模板中的标准呈现配置(已删除配置),则超级循环将确定这些配置是否丢失,您可以通过推送呈现配置继续进行修正。审核差异'将再次审核查询中属于匹配设备的一个或所有模板。如果要根据一个模板进行审核,只需包含选项"-f<;template_name>;"(不包括extension.j注射剂2)。如果要根据属于匹配设备查询的所有模板进行审核,请不要包含'-f'选项。
超级环路审计爬行器
通过利用auditdiff引擎的强大功能,我可以通过创建爬行程序来扩展它的功能。"audit爬行程序"基本上会按照设置的时间间隔根据templates.yaml文件中指定的所有模板审核nodes.yaml文件中的所有设备。例如,我可以将"audit爬行程序"设置为每4小时检查一次,以确保标准化。您可以在auditgroper.py文件的第二秒内修改计时。查找:
线程化.timer(14400,audit爬行程序).start()
为了这个例子,我缩小到5秒来加快速度,这样您就知道它是如何工作的了。
在这个演示中,只有一个设备得到修正。已删除配置并添加随机配置。SuperLoop检测到差异并继续修正:
- ip dhcp excluded-address 10.50.40.4
+ ip dhcp excluded-address 10.10.10.10
"-"表示已删除配置 "+"表示已添加配置
如果特定模板没有差异,您应该看到如下内容:
/templates/cisco/ios/switch/service.jinja2 (none)
/templates/cisco/ios/switch/hostname.jinja2 (none)
/templates/cisco/ios/switch/dhcp.jinja2 (none)
/templates/cisco/ios/switch/snmp.jinja2 (none)
如果有多个设备需要修正,SuperLoop将同时处理修正-这意味着,SuperLoop通过多线程并行连接到所有设备。
超循环推动
我开发的下一组功能是"推"和"屏幕上"。"推"就是简单地将模板推送到设备上。可以在查询中使用正则表达式来匹配多个节点。事实证明,在一个有组织的环境中,这是非常强大和有用的。"屏幕"功能允许您在设备上执行命令,而无需登录。
屏幕上的超级循环
在下面的示例中,右边的屏幕使用"push",左边的屏幕使用"on screen"检查之后的更改。
超级循环ssh
用户现在可以利用"ssh"菜单屏幕。此功能允许用户通过主机名(不必是完整或完全匹配的字符串)快速搜索设备并建立ssh会话。这是一个非常强大的工具,因为它支持正则表达式从大规模网络中筛选出某些所需的主机。
下面是一个如何使用它的示例:
root@jumpbox:~/superloop# python superloop ssh core.*
ID name address platform
1 core-fw-superloop-toron 10.10.10.10 cisco
2 core.sw.superloop.sfran 20.20.20.20 cisco
3 core.rt.superloop.sjose 30.30.30.30 cisco
Enter ID to SSH to:
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
0
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
1
如果搜索结果返回一个主机,superloop将自动建立一个ssh会话。
超级循环主机添加/删除
当我第一次构建这个应用程序时,期望手动填充nodes.yaml文件,以便执行superloop。这已不再是一项要求。介绍"主机添加"。此函数允许您通过cli(单行)将主机添加到数据库文件中,而无需手动更新nodes.yaml文件。它的工作原理如下:当执行"superloop host add<;management ip address>;"命令时,superloop将通过SNMP连接到设备。它将提取必要的信息,如主机名,以将其填充到nodes.yaml中。因为需要一些有意义的信息,比如用户名和密码o对于设备,我决定创建一个"encrypted.yaml"文件。此文件将以加密格式存储所有敏感信息。让我们仔细看看:
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
2
"username"和"password"是节点的凭据。snmp'是用于轮询设备信息的团体字符串。它使用的默认snmp端口是udp 161。可在"snmp_port=161"变量下的"snmp.py"文件中进行修改。
现在让我们看看"主机删除"功能。与"add"一样,"remove"允许您从数据库中删除节点,而无需手动编辑nodes.yaml文件。使用方法如下:
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
3
假设我们想炸掉节点"core.sw.superloop.sfran"。只需使用以下命令"superloop host remove core.sw.superloop.sfran"或"superloop host remove 20.20.20.20"。它同时支持主机名和IP地址。
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
4
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
5
超级循环节点列表
现在,我们可以利用"superloop host add"的功能,让snmp轮询节点上的更多属性,如软件版本、位置、序列号等。一旦在数据库文件中包含这些详细信息,我们就可以在cli中列出它们。这将为我们提供有关特定节点的所有详细信息。要使用此选项,只需键入"superloop node list<;hostname>;"。此功能支持正则表达式,因此如果您有多个要查看的主机,可以通过正则表达式进行匹配。
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
6
或特定节点…
root@jumpbox:~/superloop# cat nodes.yaml
---
- hostname: core-fw-superloop-toron
ip: 10.10.10.10
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: firewall
- hostname: core.sw.superloop.sfran
ip: 20.20.20.20
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: switch
- hostname: core.rt.superloop.sjose
ip: 30.30.30.30
username: admin
password: cGFzc3dvcmQ=
platform: cisco
os: ios
type: router
7