通过SDN实现自动化网络设备的配置绿色数据中心
自动化是SDN迁移旅程的一个合乎逻辑的下一步骤。
现在,软件定义的网络(SDN)的功能继续扩大,包括,诸如配置的自动化和业务流程。而这些任务并不是严格意义上的SDN,但事实是软件已经被用来定义这两种情况下的网络基础设施的某些方面了,因此供应商们都积极的扩展到混合的SDN定义配置自动化和业务流程平台。在这一过程中,某些之前的界线也变得模糊,一些现代业务流程系统使用编程接口来代替传统的配置工具,如SSH或SNMP。
在许多企业中,自动化网络设备的配置是“SDN”最初被采用的驱动因素。这种驱动力很简单:配置网络设备非常复杂。由于供应商内置了更多的功能到他们的路由器,交换机,防火墙和应用交付控制器,用来配置这些设备的命令行语法和句法的载入选项变得越来越多。基于Web的GUI(图形用户界面)通常是CLI可替代的,但导航很慢。Web界面也有一种方式将其隐藏在不可见的网页来模糊功能,使他们能够访问到一系列的点击。
传统的网络设备配置的通用性问题是人为操作的问题:无论其使用的是CLI或是GUI。不管人为操作具备多少优点,我们人类都无法做到具备电脑一样的语法能力,能够完全输入一长串的数据,或记忆住一项复杂任务的每一步。在我的经验看来,人为操作是造成网络中断的头号原因。
让一名网络工作人员改变生产网络就类似于让一名汽车驾驶司机车上改变空气过滤器。此时汽车的发动机正在运行,而同时汽车又正以每小时70英里的速度行驶在公路上。
这能实现吗?是的,能实现。但我们应该这样做吗?嗯,似乎有点冒险。然而,相当一部分的企业每天都在经历着这些风险,他们经常通过定期维修来减轻风险。然而,即便是有定期的维护,也并不能改变面临相关风险的事实,现代网络预计将高达100%的正常运行时间。
多年来,服务器管理员已经用各种不同的工具实现了自动化,来代替可重复和复杂的任务。虽然网络设备不是服务器,但是近来,一些服务器领域的工具也正在被网络设备领域广泛使用。这些工具被用来解决设备配置过程中的复杂性和人为错误的问题。这些工具还可以进一步考虑用在部署SDN的过程中。虽然配置自动化并不是纯粹的SDN,但其可以让企业更接近于这种状态。下面,就让我们来看看这方面的一些工具,来介绍一下这一新兴的趋势吧。
Python。Python编程语言在此列表中位列第一,就是因为它是最被广泛使用的,最流行,且被许多人认为是容易使用的。此外,一些其他可用于网络配置的工具也是用Python编写的。因此,Python可以说是一个灵活的,多用途的工具,网络工程师已经在直接或间接的使用其帮助他们进行相关的网络配置。
使用编程语言来创建网络设备配置背后最大的理念是,一款程序既可以确保可预测的结果,又可以通过重复任务进行迭代。例如,假设一家企业需要配置100台交换机,除了诸如主机名,以及VLAN成员的详细信息之外,配置都是相同的。这样,一款程序可以用Python语言来编写,实现一遍又一遍的再次生成所需的配置,代以每次迭代的特定交换机的唯一要素。而无需让工程师手动进行每台交换机的创建,复制和粘贴的配置工作,并确保了根据需要独特的比特交换,一款程序就能够完成所有这些工作。
Python远非是能够执行这样的工作的唯一的编程语言。对于如上述那样的简单任务,可以有着各种选项。但是,Python的优势在于,其有一个强大的库来访问网络设备,并使得其能够以比较容易的方式不仅实现了创建配置,而且还能够应用这些配置。
值得注意的是,网络厂商正在为他们的设备编写API,以支持Python。例如,思科的onePK支持Python,Arista的EOS-API可以使用Python访问,Juniper发布了“PyEZ”库,允许通过Python访问Junos设备。
Jinja2。Python的扩展的一个例子便是jinja2。jinja2是一个Python库,作为一个模板引擎。模板是用于重复的比特代码,也许只是一些从设备到设备的变量的变化。在网络工程中,模板是用于配置大的代码块,以识别所有设备上的某一类是相同的代码,例如一个路由器,或描述代码段的设备接口,VLAN,VRF,等等。
jinja2添加了模板的功能到Python,使得网络工程师能够通过设备上的所有接口实现迭代,为每一个接口添加了独特的描述和VLAN分配,而无需分别手动配置每个接口。鉴于大多数数据中心都有一套标准的用于所有接口的命令,jinja2模板既节省时间,同时又减少了生成Python配置时潜在的错误。
Puppet。对于那些不想学一种编程语言的而言,在服务器领域也有几种相当流行的配置工具,可以考虑进行网络设备的配置。Puppet,Chef,Ansible和Salt是最常见的工具。在网络社区,Puppet和Ansible具有最多的粉丝。
Puppet是一种模型驱动的配置工具,依赖于一个客户端-服务器架构提供的配置来控制服务器向客户端设备的配置。
在网络世界里,Puppet服务器需要跟一个运行在客户端系统上的Puppet代理进行沟通是一个挑战。代理需要排除许多网络设备,这是由于Puppet代理不适用于大多数网络设备。在网络空间采用Puppet最初的驱动因素是为了能够延伸已经部署在许多企业以管理服务器的相关工具的功能。那么,既然企业已经有了Puppet,为什么还要使用不同的工具进行网络设备的配置呢?
Puppet使用其人性化的语言,允许人们描述他们希望一款设备如何配置。Puppet服务器将这些配置需求转换为适用于设备的配置,生成一个目录。Puppet代理会定期检索Puppet服务器是否有任何新的目录,并做出必要的更改。
Puppet可用于配置有限数量的思科设备,以及来自Juniper,F5,Mellanox,Arista等的某些设备。请注意,“Puppet支持”并不意味着Puppet必须支持每款网络设备的所有功能。事实上,大多数网络工程师们发现,其实他们可以通过Puppet实现的配置的功能是有限的。
Puppet可用于开源和商业化的变体。
Ansible。类似于Puppet可用于整个范围,Ansible越来越受欢迎的部分原因就在于其推送的无需代理的架构设计。Ansible通过SSH协议,NETCONF,或其他特定的远程设备写入模块实现远程设备的相互作用。SSH是最被经常使用的,虽然这并不是Ansible被消费者广泛关注的原因。该模块按照预期的配置对远程设备进行相关配置工作的处理。
网络工程师形容他们希望网络配置能够使用playbooks。Playbooks是用一种易于阅读的语言编写的,该语言被称为YAML。就像Puppet被局限于只能支持特定网络的功能一样,Ansible的功能也受到设备的模块的限制。
除了其无代理的性质,Ansible越来越受欢迎的原因还在于其易用性和灵活性。像Puppet一样,Ansible也同时具有开源和可商业化的特点。
网络工程师们找到的一些其他有用,能够帮助他们实现网络配置自动化的工具包括:
GitHub,一款免费的在线资源库代码,包括一个版本控制系统。最近,Github已经开始提供现场自动获取网络配置的相关代码。思科,Arista,Juniper,Mellanox和其他网络供应商维护并支持自由可用的代码,支持他妈的网络设备配置或整合到云计算平台如OpenStack。
Vagrant,被用来自动创建虚拟机。由于很多网络设备都可以作为虚拟机,Vagrant变成了在诸如VirtualBox,VMware和其他管理程序上自动化创建网络设备虚拟机的方法。Vagrant一旦被实例化,也可以让Ansible或Puppet提供虚拟机。
下一步如何发展?
那些对网络设备配置自动化感兴趣的网络消费者,需要密切关注SDN领域的新兴技术。API的重要性继续增长,提供对于SDN控制器的访问,软件模块插入控制器和网络设备,位于这些控制器的下面。配置工作可以由一个Python程序或完成(在某些情况下可以),通过软件定义的应用程序与网络控制器进行沟通,完成规定的网络设备。
事实上,一些SDN平台执行网络设备的配置工作完全不用人工手动操作。例如,网络工程师在NEC程序流上所做的唯一的工作便是将交换机指向控制器的IP地址。剩下的配置工作完全是交由控制器本身完成的。
换句话说,本文中所描述的自动化的网络设备的配置是真正使用增量工具的。人为操作仍然需要负责诸如阐明VLAN编号和路由的配置等细节问题,但可以比使用CLI或GUI工具能够更好的生成和安装所需的配置。
最终,SDN旨在满足企业各种各样的要求,允许企业表达他们在安全性和应用程序的重要性等相关政策需求。这些抽象的策略能够帮助企业实现软件定义的网络设备的配置,以满足业务需求,确保用户体验和合规性要求。而行业内目前的挑战在于抽象性的复杂度到底应该如何表现,并通过编程来实现。而现在,企业使用功能强大的工具实现自动化网络配置便是一个很好的开始。