NetDevOps入门与实践
上QQ阅读APP看书,第一时间看更新

2.3 自动化工具的选择

对于大多数没有丰富编程经验的网络工程师来说,一开始就通过编程的方式来管理网络是一个不小的挑战,也许经过几个月的学习也无法开发出一个能用的小工具,这对初学者来说是一个不小的打击。那么如何能快速地开始NetDevOps的相关工作呢?选择一个相对成熟的自动化工具是一个不错的选择。自动化工具有很多,这里笔者将给大家介绍四个常见的工具。

2.3.1 Ansible

Ansible(https://www.ansible.com)是RedHat旗下的一个自动化运维工具平台,可以用来做系统配置管理,批量对远程主机执行操作指令。其通过SSH协议实现远程节点和管理节点之间的通信。因此,只要是管理员通过SSH登录到一台远程主机上能做的操作,Ansible都可以做到。现在Ansible是一个开源的软件项目。其商业版为Tower,商业版除了可以得到RedHat的支持,其还是一个有丰富GUI的版本。下面我们以开源的项目为主进行介绍。

Ansible从2.1版本开始就集成了大量网络设备相关的模块。目前Ansible的最新版本是2.3(2007年推出)。正是这些网络设备模块的集成,使得Ansible在网络领域得到了广泛的应用。表2-2列出了Ansible 2.3支持的网络模块以及这些模块对应的厂商和型号。

表2-2 Ansible 2.3 网络模块

Ansible使用的开发语言是Python,现在Ansible已经同时支持Python 2与Python 3。其是通过编写YAML文件来定义Playbook(剧本,即任务列表)的。Ansible不需要在设备上安装Agent软件,但在绝大多数的情况下,还是需要被管理的机器上有Python的运行环境和一些基本的Python模块。对于网络设备的管理,由于网络设备通常不具备Python的运行环境,因此,在网络设备的模块中,被管理设备可以没有Python的运行环境。是否需要Python的运行环境,取决于具体的模块。

2.3.2 Puppet

Puppet(https://www.puppet.com)是一个可以用于多平台环境下的集中式系统配置管理平台,能够对基础设施实现自动化的管理。Puppet通过对整个系统中的各个节点希望达到的最终状态进行描述(检查),然后由Puppet执行达到目标。这种思路和过程式程序有着明显的不同。编写过程式程序需要清楚地知道每一步的执行过程并达到最终的目的。举例来说,某台交换机需要增加一个VLAN 10。基于过程的程序流程如下:登录网络设备;进入设备的配置模式(或者再进入VLAN配置模式中);向设备发送增加VLAN的配置;最后在网络设备上提交和保存配置。这是基于过程的一个简单的流程。如果设备已经存在需要添加的VLAN 10,那么需要在上述的流程中加入更多的内容。对于Puppet而言,只需要在其配置文件中增加VLAN 10就可以了。Puppet负责检查交换机上的VLAN信息。如果VLAN不存在,则会被添加。这样的好处是,让网络的管理者只需要关心最后的终态,而无须处理中间的过程。如何坚持设备的VLAN信息,如何添加VLAN的配置,是由Puppet内的代码来完成的。

Puppet的开发语言是Ruby, Puppet需要在被管理的设备上安装一个Agent。Puppet的服务器和被管理设备之间使用了基于HTTPS的XML RPC协议通信。目前,已经有很多的网络厂家的设备可以安装Puppet的Agent。读者可以在https://forge.puppet.com/查找自己正在使用的网络设备是否有Agent模块。下面给出一个Puppet关于增加VLAN 10的配置文件。

        vlan { 'resource title':
          name => 10
          ensure => present
          description => VLAN10
          provider => Cisco
        }

2.3.3 Chef

Chef(https://www.chef.io)是Ruby与Erlang开发写成的配置管理软件。Chef相当于一个脚本管理工具,但功能要强大得多,可定制性强。Chef将脚本命令代码化,定制时只需要修改代码,其安装过程就是执行代码的过程。

Chef主要包括三大块:Workstation、Chef Server、Chef Client(Node)。

Workstation通常是使用者的工作电脑,使用者在Workstation中创建chef-repo,并且上传到Chef Server, chef-repo包括cookbooks、recipes、roles、environment等内容。cookbooks、recipes、roles是Chef对基础设施的抽象化定义。

Chef Server用来存储Workstation上传的各种资源,包括cookbooks、roles、environments、nodes等。我们可以使用公有的Server,也可以通过开源项目搭建自己的企业服务器。Chef Server提供了非常丰富的API,用于与Workstation和nodes传输资源和数据。Chef Server原本由Ruby来实现,但后来为了保持高并发和稳定性,以及能够同时服务更多数量级的nodes, Chef Server内核改用了支持高并发的Erlang程序。

Chef Client是安装在Node上的一个软件。Node是基础设施中的一台服务器,即Chef管理的机器。一个Node可以是一台物理服务器、一台虚拟机,甚至是一台交换机或路由器。如果你想要在Node上部署环境,那么Node会与Chef Server进行交互以获取信息,并在Node上执行环境初始化操作。

2.3.4 SaltStack

SaltStack(https://saltstack.com)也是一个配置管理系统,能够维护预定义状态的远程节点。SaltStack的核心功能如下:

❑ 使命令发送到远程系统是并行的而不是串行的;

❑ 使用安全加密的协议;

❑ 使用最小、最快的网络载荷;

❑ 提供简单的编程接口。

SaltStack执行程序可以为纯Python模块。SaltStack执行过程中收集到的数据可以发送回master服务端,也可以发送到任何程序。SaltStack可以被一个简单的Python API调用,或者从命令行直接调用,所以SaltStack可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。

从结构上看,SaltStack与Ansible无Agent的设计相反,SaltStack在部署上可以分为master和minion两个部分,其中master相当于统领所有机器的总管,而minion则是部署在被管理机器上面的Agent进程。

2.3.5 如何选择

前面介绍了四个比较主流的自动化工具。这些工具一开始都是针对服务器而开发的,对网络设备支持的能力有限。但是,随着NetDevOps需求日益增长,这些自动化工具开始支持网络设备。具体选择哪一个工具可以从以下几个方面来考虑。

❑ 所在公司使用了哪个自动化工具。尽可能地使用公司已经成熟的自动化工具。

❑ 使用者熟悉哪个工具。也许你在维护网络的同时,还需要维护很多的服务器,那么用原来已熟悉的工具更好。

❑ 使用者或开发人员更加熟悉Ruby还是Python语言。在使用了一段时间后,也许会提出更多的需求,那么熟悉工具的开发语言对后期的二次开发会有一定的帮助。当然这也不是绝对的。例如,Chef中使用了大量的RESTful API,理论上可以用任何语言做二次开发。

❑ 网络设备支持的情况。这需要和设备厂家一起进行评估。

如果读者对上述的几点完全不在意的话,那么笔者推荐大家使用Ansible来进行网络设备的管理。理由有以下几点。

首先,Ansible提供开源的版本,也提供商业版本。使用者可以根据自己的需求进行选择。商业版本可以获得更多的技术支持。

其次,Ansible使用Python语言进行开发,配置文件使用YAML的文件格式。为什么笔者在NetDevOps中更加倾向于Python开发,这点可以参考2.2节。

再次,Ansible使用SSH作为通信协议。这个协议是目前网络设备大量使用的协议。使用这个协议,不用更改现在对网络设备的管理方式。并且,Ansible支持的网络厂家的设备类型也越来越多。而且,Ansible可以很容易地兼容NETCONF的协议,因为大部分厂家的NETCONF协议都是基于SSH进行通信的。

最后,Ansible不需要在网络设备上安装任何的Agent。这也许是最为重要的一点。