广泛的网络自动化工具集

superloop的Python项目详细描述


超级循环

由于一家领先的网络自动化技术公司使用和开发了大量的工具集(unamed),我试图创建自己的版本。

先决条件:

  1. netmiko-非常感谢柯克·拜尔斯开发图书馆!
  2. < > >

    在我们开始之前,我已经构建了这个应用程序,通过利用yaml文件的强大功能来简化数据库管理。有两个需要管理的yaml文件组合:

    1. nodes.yaml
    2. templates.yaml
    3. < > >

      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()

      • 14400秒=4小时

      为了这个例子,我缩小到5秒来加快速度,这样您就知道它是如何工作的了。

      superloop audit爬行者演示

      在这个演示中,只有一个设备得到修正。已删除配置并添加随机配置。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"检查之后的更改。

      Superloop Push和屏幕上的演示

      超级循环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
      • 注意'ssh'后面需要一个位置参数(hostname)。

      如果搜索结果返回一个主机,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
      • 注意到"core.sw.superloop.sfran"节点是如何从数据库中删除的。

      超级循环节点列表

      现在,我们可以利用"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

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

      推荐PyPI第三方库


热门话题
java Eclipse内存分析器(MAT):不显示当前正在运行的进程   java Apache Velocity:转义字符不能作为关联数组键用于PHP   不截断零的java格式十进制输出   在另一个类文件中调用时返回空值的java getter   java集合获取连接   java解析json使用Gson登录系统应用程序强制关闭   java DelferredResult带有两个请求的ajax请求   java可降低功耗,同时应使用无线   java BoxLayout无法共享错误?   java如何使用计时器制作闹钟   java使用OAuth2保护RESTWeb服务:一般原则   java在一个jframe上显示多个图像和按钮