Python自动化运维实战

978-7-115-53018-9
作者: [美] 巴塞姆· 阿利(Bassem Aly)
译者: 王文峰袁洪艳
编辑: 谢晓芳
分类: Python

图书目录:

详情

《Python自动化运维实战》介绍了如何通过Python来自动完成服务器的配置与管理,自动完成系统的管理任务(如用户管理、数据库管理和进程管理),以及完成这些工作所需的模块、库和工具。此外,本书还讲述了如何使用Python脚本自动执行测试,如何通过Python在云基础设施和虚拟机上自动执行任务,如何使用基于Python的安全工具自动完成与安全相关的任务。 本书适合运维人员和开发人员阅读,也可作为相关专业人士的参考书。

图书摘要

版权信息

书名:Python自动化运维实战

ISBN:978-7-115-53018-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美] 巴塞姆 · 阿利(Bassem Aly)

译    王文峰 袁洪艳

责任编辑 谢晓芳

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright ©2018 Packt Publishing. First published in the English language under the title

Hands-On Enterprise Automation with Python.

All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


本书介绍了如何通过Python来自动完成服务器的配置与管理,自动完成系统的管理任务(如用户管理、数据库管理和进程管理),以及完成这些工作所需的模块、库和工具。此外,本书还讲述了如何使用Python脚本自动执行测试,如何通过Python在云基础设施和虚拟机上自动执行任务,如何使用基于Python的安全工具自动完成与安全相关的任务。

本书适合运维人员和开发人员阅读,也可作为相关专业人士的参考书。


Bassem Aly是Juniper Networks公司经验丰富的SDN/NFV解决方案顾问,过去9年来一直在电信行业工作。他擅长使用不同的自动化工具以及DevOps框架设计和实现下一代自动化解决方案。此外,他在使用OpenStack构建和部署电信应用程序方面拥有丰富的经验,同时他还负责网络自动化和网络编程方面的企业培训。


Jere Julian是一名高级网络自动化工程师,在网络自动化方面拥有近20年的工作经验,当前的研究方向是自动化运维。过去几年,他还在DevOps Days和Interop ITX会议上发言,同时定期为网络计算技术的发展贡献自己的力量。他与妻子和两个儿子一起住在北卡罗来纳州。在Twitter上通过@julianje能联系到他。


本书从Python安装环境开始,一直介绍到使用Python实现自动化任务,同时会介绍所用到的模块(module)、库(library)和工具。

本书不仅会介绍如何使用简单的Python程序自动管理系统和网络,还将分析如何使用Python库、模块、工具自动管理系统。另外,通过一些系统管理任务(例如,用户管理、数据库管理,以及进程管理),介绍如何配置和管理服务器。随着内容的深入,你将能够使用Python脚本自动完成一些测试服务,在虚拟机和云基础设施上使用Python完成自动化任务。在最后几章中,你将接触到基于Python的安全工具并学会如何自动完成安全任务。

读完本书,你将学到如何使用Python自动完成多种系统管理任务。


 

在WordPress网站上搜索basimaly,即可查看作者的博客。


本书适合那些希望替换主流自动化框架(如Puppet和Chef)的系统管理员、开发人员、运维人员阅读。阅读本书需要具备Python以及Linux shell脚本编程基础的知识。

第1章探讨如何下载、安装Python解释器和Python集成开发环境(Integrated Development Environment,IDE)——JetBrains PyCharm。IDE为我们提供智能的自动补全、智能的代码分析、强大的重构功能,并集成了Git、virtualenv、Vagrant和Docker。这些功能和工具将帮助我们编写专业的、功能强大的Python代码。

第2章涵盖当前可用的与自动化相关的Python库。我们将根据用途(系统、网络和云)对它们进行分类,并分别介绍。随着内容的继续深入,你会深入了解每一个库,详细了解它们的用法。

第3章讨论网络自动化的优点以及网络运营商如何自动管理当前的设备。该章展示当前用来实现Cisco、Juniper和Arista自动化的网络节点的主流库。该章介绍如何搭建网络实验室,用来运行Python脚本。我们会用到一款开源网络仿真工具EVE-NG。

第4章介绍如何使用netmiko、Paramiko和telnetlib通过Telnet与SSH建立连接、管理网络设备。该章讲述如何编写Python代码来访问交换机和路由器,并在终端上执行命令,然后返回输出。该章还讨论如何利用不同的Python技术进行备份和推送配置。该章结尾给出现代网络环境中的一些用例。

第5章首先介绍如何在Python中使用不同的工具和方法,从返回的输出结果中提取有用的数据并对数据进行操作,然后讨论如何使用CiscoConfParse库来审核配置,最后讲述如何使用Matplotlib可视化数据,生成图形和报告。

第6章介绍对拥有数百个网络节点的网络生成通用配置的方法,即创建模板,并使用模板语言Jinja2来生成一个配置模板。

第7章讲述如何实例化和并行执行Python代码。只要这些脚本之间没有相互依赖,并行运行能够更快地完成自动化工作流。

第8章介绍虚拟实验室环境的安装过程和准备工作。该章不仅介绍如何在CentOS或Ubuntu系统上使用不同的虚拟机软件安装自动化服务器,还讨论如何使用Cobbler自动安装操作系统。

第9章介绍如何将命令从Python脚本直接发送到操作系统shell并分析返回的输出内容。

第10章介绍如何使用Fabric执行系统管理任务。Fabric是一个通过SSH执行系统管理任务的Python库。Fabric还可以用来部署大型应用程序。该章还介绍如何用Fabric在远程服务器上执行任务。

第11章介绍如何生成系统报告、管理用户和监控系统。从系统中收集数据并定期生成报告是每一个系统管理员的基本任务。自动执行这项任务能够帮助我们尽早发现问题,及时准备解决方案。该章将用到一些经过实践检验的方法,从服务器上自动收集数据并生成正式的报告。该章还介绍如何使用Python与Ansible管理新用户和现有用户。此外,该章还深入讨论如何监控系统KPI和分析日志。同时,还可以定期运行监控脚本并将结果发送到指定的邮箱中。

第12章介绍如何与数据库进行交互。如果你是数据库管理员或数据库开发人员,那么Python提供了大量的库和模块,它们支持主流的数据库管理系统(Database Management System,DBMS),如MySQL、Postgress和Oracle。该章介绍如何使用Python连接器与数据库管理系统进行交互。

第13章介绍一款强大的配置管理软件Ansible。Ansible在系统管理方面功能非常强大,能够同时准确地对数百甚至数千台服务器进行相同的配置。

第14章介绍如何在VMware虚拟机管理程序(hypervisor)上自动创建虚拟机。我们将在ESXi上使用VMware官方提供的库,使用几种不同的方法来创建和管理虚拟机。

第15章解释为什么使用OpenStack在私有云上创建私有IaaS。我们将使用Python模块(如requests)通过REST接口与OpenStack中的一些服务(如nova、cinder和neutron)进行交互,并通过OpenStack创建资源。在该章的后半部分,我们将使用Ansible playbook再执行一次同样的操作。

第16章介绍如何使用亚马逊官方的Boto3自动处理常见的AWS服务,如EC2和S3。Boto3为我们访问亚马逊相关的服务提供了一个非常好用的API。

第17章介绍一个功能强大的Python工具——Scapy,它能够根据需要组建数据包
(packet)[1],并通过网络将报文发送出去。使用Scapy可以创造出任意类型的数据包,并可将它发送到网络上。Scapy还可以抓取报文并将在网络上重播。

第18章展示使用Python编写网络扫描程序的完整例子。使用这个例子,可以扫描整个子网,查找子网中开放的各种协议和端口,并对扫描到的每个主机生成一份报告。最后该章展示如何使用Git在开源社区(GitHub)上共享代码。

读者应该熟悉基本的Python编程范例,并且具备Linux系统和Linux shell脚本的基础知识。

利用packtpub网站上的账户可以下载本书中所有示例的代码。如果你在其他地方购买了本书,访问packtpub网站,注册之后,示例代码将直接通过电子邮件发送给你。

按照下列步骤下载代码。

(1)在packtpub网站上登录或注册。

(2)选择SUPPORT选项卡。

(3)单击Code Downloads & Errata

(4)在Search框中输入本书的名字,然后根据屏幕提示进行操作。

从下列软件中选择一个,解压缩下载的文件。注意,使用以下最新版本的解压缩软件:

本书示例代码也托管在GitHub上,在该网站上搜索Hands-On Enterprise Automation with Python即可查看源代码。任何更新都将同步到GitHub上。

为方便阅读,本书中使用约定的版式来表示不同的内容。

整段代码通常以下列形式表示。

from netmiko import ConnectHandler
from devices import R1,SW1,SW2,SW3,SW4

nodes = [R1,SW1,SW2,SW3,SW4]

for device in nodes:
    net_connect = ConnectHandler(**device)
    output = net_connect.send_command("show run")
    print output

当我们希望读者注意代码段的某部分时,相应的行或文字将以粗体显示,如下所示。

hostname {{hostname}}

任何命令行的输入或输出都会使用下面的格式。

pip install jinja2


 

表示警告或重要说明。



 

表示提示和技巧。


欢迎读者对我们提出宝贵意见和建议。

建议:发送电子邮件至feedback@packtpub.com,并在邮件主题中注明书名。如果你对本书的任何方面有疑问,请发送电子邮件至questions@packtpub.com。

错误反馈:我们将尽力确保本书内容的准确性,但仍然不能避免所有问题。如果你发现了本书的任何错误,请访问packtpub网站,选择图书名称,单击Errata Submission Form链接,然后输入详细信息。

盗版问题:如果在互联网上发现任何关于Packt图书的非法版本,欢迎提供地址或网站名称,我们将不胜感激。请通过copyright@packtpub.com与我们联系,告诉我们相关材料的链接。

投稿:如果你关于某个主题想写书,请访问packtpub网站。

欢迎评论。阅读并使用本书后,读者可以在购买网站上发表评论。其他读者可以查看并根据你的意见决定是否购买本书,同时Packt还可以了解你对相关图书的看法,作者也可以看到你的反馈。谢谢!

有关Packt的更多信息,请访问packtpub网站。

感谢我的妻子Sarah和女儿Mariam。为了撰写本书我很少陪伴她们,谢谢她们对我的包容。我希望有一天Mariam会读到这本书,并能够理解为什么我花了这么多时间伏案工作而没能陪她一起玩耍。感谢我父母的鼓励,正是这些鼓励成就了今天的我。最后,感谢我的导师Ashraf Albasti,他通过各种方式在我的职业生涯中帮助我。

[1] 除非特别强调,为行文方便,本书将不加区分地使用数据包、报文、网络数据报文这些名词。——译者注


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书配套资源包括相关示例的源代码。

要获得源代码,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意,为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/ selfpublish/submission即可)。

如果您所在学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发送给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


本章简要介绍Python编程语言以及当前各版本之间的差异。现在Python主要有两大活跃版本,选择哪个版本进行开发非常重要。在本章中我们会在操作系统中下载并安装Python。

在本章结尾部分,我们将安装一个非常先进的集成开发编辑器(Integrated Development Editor,IDE)——PyCharm,这款IDE在全球的专业开发者中非常流行。PyCharm为我们提供了智能补全代码,检查代码,实时突出显示错误和快速修复,自动重构代码,以及丰富的导航功能。在输入或者开发本书中的Python代码时,都会用到这些特性。

本章主要介绍以下内容:

Python是一种高级编程语言,其语法规则简单易学。无论对于初学者还是有经验的程序员,Python都非常简单。

Guido van Rossum在1991年基于C、C++和一些UNIX shell工具开发了Python。Python是一种编程语言,至今已经广泛应用于各个领域,例如,软件开发、Web开发、网络自动化、系统管理,以及科学领域。Python能够极大限度地节约开发时间。

Python的语法有点接近于英语,阅读起来比较轻松,代码本身的结构也很优美。Python核心开发者定下了20条指导原则,也就是Python之禅(Zen of Python),它对Python的设计产生了非常积极的影响。这20条原则主要介绍了如何编写整洁、条理清晰、可读的代码。下面列出了几条原则。

优美胜于丑陋。

明了胜于晦涩。

简单胜于复杂。

复杂胜于杂乱。

可以在Python网站上查看“The Zan of Python”的全文。

Python有两大版本——Python 2.x和Python 3.x。这两个版本有着本质上的差别,其中print函数对多个字符串的处理方式最能说明这种差异。另外,所有的新特性都只应用在3.x版本上,在完全废弃2.x之前仅对其提供安全升级。但由于许多应用都是基于2.x的,因此从2.x迁移到3.x并没有那么容易,2.x也不会很快废弃。

1.为什么有两个活跃版本

这里引用Python官方网站上给出的原因。

Guido van Rossum(Python的原创者)决定在尽可能减少对2.x系列中新版本的后向兼容性影响的前提下,正确地清理Python 2.x。其中最主要的改进就是提高对Unicode的支持(所有的文本字符串默认使用Unicode),彻底将正常的字节和Unicode分开。

另外,核心语言的某些部分(比如printexec由语句变成函数,整数采用向下取整)进行了一些调整,以方便初学者学习,并使其与整个语言更加趋于一致。同时移除一些老旧的错误设计(例如,现在所有的类都使用新风格,range()返回一个值,而不是2.x中的列表)。

关于这个话题可以参考Python网站上的相关内容。

2.是否应该只学习Python 3

是否应该只学习Python 3完全取决于你自己。学习Python 3将使你的代码面向未来,并且有机会用到Python开发人员提供的最新功能。但请注意,某些第三方模块和框架缺乏对Python 3的支持,并将继续保持这种状态,直到他们将自己的库完全移植到Python 3中。

另请注意,某些网络设备供应商(如Cisco)对Python 3.x仅提供有限的支持,因为Python 2.x版本已经涵盖了大多数必需的功能。例如,下图展示了Cisco设备支持的Python版本,你会看到所有设备都支持2.x,而不是3.x

(图片来自Cisco网站)

3.Python有两个版本是否意味着我无法写出可以同时在Python 2和Python 3上运行的代码

不,当然可以基于Python 2.x编写代码并同时兼容这两个版本。前提是要导入一些库(例如__future__模块)来帮助你完成后向兼容。该模块包含一些调整Python 2.x行为的函数,以使其与Python 3.x保持一致。通过下面的例子来简单了解一下两个版本之间的差异。

#Python 2 only
print "Welcome to Enterprise Automation"

下面的代码同时支持Python 2和Python 3。

# Python 2 and 3
print("Welcome to Enterprise Automation")

下面是Python 2中输出多个字符串的语法。

# Python 2, multiple strings
print "welcome", "to", "Enterprise", "Automation"

# Python 3, multiple strings
print ("welcome", "to", "Enterprise", "Automation")

如果试图在Python 2中使用圆括号输出多个字符串,Python会错误地将其解释为元组。正是这个原因,才需要在代码的开头导入__future__模块,防止出现这种行为,并告诉Python我们需要输出多个字符串。

代码运行结果如下图所示。

不管你选择的是目前广泛使用的Python 2.x还是面向未来的Python 3.x,都需要从官方网站下载Python安装包并将其安装在操作系统中。Python支持不同的平台(Windows、Mac、Linux、Raspberry PI等)。

(1)打开Python官网并选择2.x或3.x系列的最新版本。

(2)根据自己的操作系统在Download页面上选择x86或x64版本。

(3)像安装普通应用程序一样安装Python。注意,在安装过程中一定要勾选Add python .exe to Path选项,这样就可以(在Windows系统中)在命令行中直接访问Python了。否则,会导致Windows无法识别Python命令并报错。

(4)在操作系统中打开命令行或终端,输入python,验证安装是否完成。该命令会尝试进入Python控制台并验证Python是否正确地安装到操作系统中。

PyCharm是一个非常完善的IDE,世界各地的众多开发人员都在用它编写和开发Python代码。PyCharm由Jetbrains公司开发,提供了丰富的代码分析和自动补全、语法突出显示、单元测试、代码覆盖、错误发现功能以及其他Python分析操作。

此外,PyCharm专业版支持Python Web框架(如Django、web2py和Flask),同时集成了Docker和vagrant,可以通过它们运行代码。PyCharm专业版还可以集成多个代码版本的控制系统,例如Git(和GitHub)、CVS和subversion。

接下来将分步演示PyCharm社区版(Community Edition)的安装过程。

(1)打开PyCharm下载页面(见下图),根据自己的系统选择相应版本。然后选择社区版(永久免费)或专业版(本书中的代码完全可以在社区版中运行)。

(2)正常安装软件,根据实际情况,选择正确的选项(见下图)。

(3)等待PyCharm从互联网下载并安装其他必要的软件包(见下图),然后选择Run PyCharm Community Edition

(4)由于这是一次全新安装,因此这里不会导入任何设置(见下图)。

(5)选择喜欢的UI主题(对于黑暗模式,有defaultdarcula),还可以安装一些其他插件(如MarkdownBashSupport),安装之后PyCharm能够识别并支持相应的语言。安装完成后,单击Start using PyCharm按钮(见下图)。

PyCharm中的Python项目指的是我们编写的Python文件的集合,以及内置或从第三方安装的Python模块。在开始开发代码之前,需要创建一个新项目并将其保存到计算机的某个文件夹中。此外,还需要为该项目选择默认解释器。默认情况下,PyCharm会在系统目录中搜索Python解释器,也可以使用Python virtualenv创建一个完全隔离的环境。virtualenv能够帮助解决包的依赖性问题。假如你正在同时处理多个不同的Python项目,其中一个需要某个版本的x包。同时,另一个项目需要这个包的其他版本。注意,系统中安装的所有Python包都存储在/usr/lib/python2.7/site-packages目录下,并且无法为同一个包保存两个不同的版本。为了解决这个问题,virtualenv会创建一个独立的环境,在这个环境中有自己的安装目录和包。当你在这两个项目之间进行切换时,PyCharm(在virtualenv的帮助下)将激活相应的环境,避免包冲突。

按照下面的步骤创建项目。

(1)选择Create New Project(见下图)。

(2)设置项目(见下图)。

① 选择项目类型。在该例子中使用的是Pure Python

② 在本地硬盘驱动器上选择项目的存储目录。

③ 选择项目的解释器。可使用默认目录中已经存在的Python解释器,或者为该项目创建新的虚拟环境。

④ 单击Create按钮。

(3)在项目中创建一个新的Python File,右击项目名称,然后选择NewPython File(见下图),然后输入文件名。

PyCharm将打开一个新的空白文件,可以直接在里面编写Python代码。例如,从__future__模块中导入print,在这个过程中PyCharm将自动弹出一个窗口,其中列出了所有可能自动补全的内容,如下图所示。

(4)运行代码(见下图)。

① 输入你想要运行的代码。

② 选择Edit Configuration来配置Python文件的运行参数。

(5)设置新的Python环境,运行Python文件。

① 单击 + 按钮添加新的配置,并选择Python

② 填写配置的名称。

③ 选择项目中的脚本路径。

④ 单击OK按钮。

(6)运行代码(见下图)。

① 单击Run旁边的play按钮。

② PyCharm将执行配置中指定文件内的代码,并在终端中显示输出结果。

本节将探讨PyCharm的一些高级功能。PyCharm不仅拥有大量现成的工具(包括集成的调试器和测试运行器、Python分析器、内置终端和集成的SSH终端),还与主流的VCS(版本控制系统)、内置数据库工具、Docker和Vagrant集成,同时还拥有远程解释器,支持远程开发。如果要了解这些功能,可以访问JetBrains官方网站。

调试代码是一个帮助我们找出程序出错原因的过程。具体做法是给代码一些输入并遍历代码的每一行,最后完成对代码的评估。Python自身包含了一些调试工具,它们可以帮助我们分析代码:从简单的print函数开始,断言命令,直到对代码进行完整的单元测试。PyCharm提供了一种简单方法来调试代码并查看结果。

要调试PyCharm中的代码(例如,带if子句的嵌套for循环),需要在期望PyCharm程序停止执行的行中设置断点。当PyCharm执行到这一行时,将暂停并转储内存以查看每个变量的内容(见下图)。

请注意,在第一次遍历时,除了遍历次数之外,还会输出每个变量的值(见下图)。

此外,还可以右击断点,为变量设置条件(见下图)。当变量满足指定条件时,将暂停运行并输出日志消息。

重构代码是指更改代码中某些变量名称及结构的过程。例如,在一个包含多个源文件的项目开始时,先为某个变量指定了名字,随着项目的推进,为了能更好地体现变量的意义,决定改变这个变量的名字。PyCharm提供了许多重构方法,它们可以在不干扰正常工作的情况下更新代码。

PyCharm支持下列功能。

我们来看一个例子。假设某个项目中有3个Python文件,分别是refactor_1.pyrefactor_2.pyrefactor_3.py。第一个文件定义了函数important_funtion(x),同时在refactor_2.pyrefactor_3.py中也用到了该函数(见下图)。

将下列代码复制到refactor_1.py中。

def important_function(x):
    print(x)

将下列代码复制到refactor_2.py中。

from refactor_1 import important_function
important_function(2)

将下列代码复制到refactor_3.py中。

from refactor_1 import important_function
important_function(10)

右击需要重构的部分,选择RefactorRename(见下图),然后输入新的函数名。

注意,IDE底部会显示一个窗口(见下图),其中列出了该函数的所有引用、函数的当前名称以及重构后会受影响的文件。

如果单击Do Refactor按钮,PyCharm将使用新名字替换该变量的所有引用,而不会破坏原有的代码。

PyCharm可以通过GUI为当前解释器(或virtualenv)安装package(包)。此外,你还可以看到所有已安装的包列表,以及是否有可用的升级版本。

首先,在菜单栏中选择 FileSettingsProjectProject Interpreter。从下图中可以看到,PyCharm列出了已安装的软件包及其当前版本。只需要单击+号,然后在搜索框中输入包的首字母,即可在解释器中添加新包。

在下图中你将会看到当前可用的包列表,以及每个包的名字和描述。此外,还可以指定包的版本。单击Install Package按钮后,PyCharm将在系统上执行pip命令(可能会要求安装授权),然后将软件包下载到安装目录下并运行setup.py文件完成安装。

本章介绍了Python 2和Python 3之间的差异,以及怎样根据自己的需要选择合适的版本。此外,本章还讲述了如何安装Python解释器以及怎样使用PyCharm作为高级编辑器来编写和管理代码。

下一章将讨论Python包结构和自动化过程中常用的Python包。


本章将介绍Python包的结构以及现在流行的一些与自动化系统和网络基础设施相关的库。这些Python包广泛应用于网络自动化、系统管理以及公共云和私有云的管理。

同时,了解如何获取模块的源代码以及Python包内各个代码段相互之间的关系也非常重要,这样才能方便我们修改代码,添加或删除某些功能,以及将代码分享给社区。

本章主要介绍以下内容:

为了保持简洁,Python核心代码非常精简。大多数功能是通过添加第三方软件包(package)和模块(module)实现的。

一方面,模块是一个Python文件,包括函数、语句和类。使用模块前需要先在代码中导入它。另一方面,(package)也可以看作一个层级结构,其中集合了相关模块并将它们相互关联起来。一些大型包(如Matplotlib或Django)内部有数百个模块,开发人员通常会将不同的模块放到不同的子目录中。例如,netmiko包中有多个子目录(见下图),每个子目录中的模块用来连接不同厂商的网络设备。

这种做法使包的维护者能够在不破坏全局的情况下灵活地为各个模块添加或删除功能。

通常,Python在默认的系统路径中搜索模块。导入sys模块并通过sys.path可以看到这些搜索路径(见下图)。sys.path实际上返回的是环境变量PYTHONPATH和操作系统的环境变量。注意,返回结果是一个普通的Python列表,可以使用多种函数(如insert())向其中添加更多路径,以扩大搜索范围。

但是,最好将软件包安装在默认搜索路径中,以避免与其他开发人员共享代码时出现问题。

下图展示了一个简单的Python包结构,其中包含了若干模块。

每个包都会有一个__init__文件(在全局目录或子目录中),用来告诉Python解释器该目录是一个Python包。每个以.py结尾的文件都是一个模块文件,可以把.py文件导入其他文件中。__init__文件的第二个功能是在包导入之后自动执行其中的代码。然而,大多数开发人员不会在这里添加代码,只是用它来标记该目录是一个Python包。

本节将探讨一些自动管理网络、系统以及云的常用Python库。

当前网络环境通常包含各个厂商的多种设备,每个设备扮演不同的角色。设计一个自动化运维网络设备的框架对于网络工程师来说就显得尤为重要,它可以自动完成重复任务并改进网络工程师的工作方式,减少人为错误。大型企业和服务提供商通常倾向于使用工作流(workflow)来自动执行不同的网络任务,提高网络弹性和灵活性。工作流由一系列相关任务构成,在需要的时候能够执行相关任务,改变网络配置。

在没有人为干预的情况下,网络自动化框架可以完成下列任务。

下表列出了在自动管理网络设备时常用的Python库。

网络库

描述

网站

Netmiko

支持多种厂商的网络设备,包括Cisco、Arista、Juniper、HP、Ciena和其他众多厂商。通过SSH和Telnet连接到网络设备并执行相关命令

GitHub网站

NAPALM

封装官方API的Python库。它提供了一种抽象方法,使其连接到不同厂商的设备并从返回的格式化内容中提取信息。这些可以方便地使用软件来处理

GitHub网站

PyEZ

用于管理和自动化Juniper设备的Python库。它可以在Python客户端上对设备执行CRUD操作。另外,它还可以获取设备相关信息,如管理IP、序列号和版本,以JSON或XML格式返回输出结果

GitHub网站

infoblox-client

Python客户端,通过基于WAPI的REST接口与infoblox NIOS进行交互

GitHub网站

NX-API

Cisco Nexus(仅限某些平台)系列API,通过HTTP和HTTPS开放CLI。在其提供的沙盒入口中输入show命令,它将会把该命令转换为API调用,并以JSON和XML格式返回输出结果

GitHub网站

pyeapi

封装了Arista EOS eAPI的Python库,用于配置Arista EOS设备。通过HTTP和HTTP可以进行eAPI调用

GitHub网站

netaddr

用于处理IPv4、IPv6和第二层地址(MAC地址)等网络地址的Python库。它可以对IP包头进行重复、切片、排序和汇总

GitHub网站

ciscoconfparse

能够解析Cisco IOS风格的配置并以结构化格式返回输出结果的Python库。该库还支持以括号为配置分隔符(如Juniper和F5)的设备

GitHub网站

NSoT

用于跟踪网络设备清单和元数据的数据库,前端GUI由Python Django提供,后端使用SQLite数据库存储数据。此外,通过Python语言绑定的库pynsot 对外提供API,用来操作设备清单

GitHub网站

Nornir

新的基于Python的自动化框架。无须使用DSL(领域特定语言),可直接在Python代码中使用。Python代码在这里称为Runbook,它描述了想要完成的任务,并可以对设备清单中的设备执行这些任务(也支持Ansible清单格式)。在这些任务中还可以利用其他库(例如NAPALM)来获取信息或配置设备

GitHub网站

下表展示了一些管理系统和云的Python包。Amazon Web服务(AWS)和Google等公有云提供商倾向于使用开放的标准接口来访问其资源,以方便与DevOps模型进行集成。持续集成、测试和部署等操作需要在代码的整个生命周期内持续访问基础设施(虚拟或裸机服务器)。这些操作单靠人工很难实现,需要自动化工具来辅助完成。

描述

网站

ConfigParser

Python标准库,用于解析和使用INI文件

GitHub网站

Paramiko

Paramiko是SSHv2协议的Python(2.7、3.4 +)实现,具有客户端和服务器功能

GitHub网站

Pandas

提供了方便使用的高性能的数据结构和数据分析工具

GitHub网站

Boto3

操作AWS的官方Python接口,如创建EC2实例和S3存储

GitHub网站

google-api-python-client

Google官方API客户端,适用于Google云平台

GitHub网站

pyVmomi

VMWare官方Python SDK,用于管理ESXi和vCenter

GitHub网站

PyMYSQL

纯Python的MySQL驱动程序,用于MySQL DBMS

GitHub网站

Psycopg

适用于Python的PostgreSQL适配器,符合DB-API 2.0标准。

initd网站

Django

基于Python的高级开源Web框架。该框架遵循MVT模型视图模板)架构设计,用来创建Web应用程序,能够避免Web开发中的常见问题以及普通安全问题

Djangoproject 网站

Fabric

简单的Python工具,通过SSH在远程设备上执行命令、部署软件

GitHub网站

SCAPY

基于Python的智能数据报文操作工具,能够处理各种协议,能够任意组合各个网络层,创建数据包,并将数据包通过网络发送出去

GitHub网站

Selenium

自动执行Web浏览器任务和Web验收测试的Python库,与Selenium Webdriver(支持Firefox、Chrome和Internet Explorer)配合使用,可在Web浏览器上运行测试

PyPI 网站

访问GitHub网站,可以看到更多的应用于其他领域的Python包。

通过两种方法可以查看所使用模块的源代码。方法一是打开GitHub网站上相应模块的页面,查看所有文件、各个发布版本、每次提交的代码以及所存在的问题,如下图所示。作者通过netmiko模块的维护者获得了所有共享代码的阅读权限,可以看到完整的提交列表和文件内容。

方法二是使用pip或PyCharm GUI将包安装在Python site-package目录中。实际上pip要先从GitHub网站下载模块,然后运行setup.py来安装和注册模块。安装完成后就可以看到所有文件,但这次你拥有所有文件的读/写权限,可以更改原始代码。让我们来看一个例子,下面的代码利用netmiko库连接到Cisco设备并在上面执行show arp命令。

from netmiko import ConnectHandler

device = {"device_type": "cisco_ios",
          "ip": "10.10.88.110",
          "username": "admin",
          "password": "access123"}

net_connect = ConnectHandler(**device)
output = net_connect.send_command("show arp")

如果要查看netmiko的源代码,可以打开site-packages,netmiko就安装在这里,这里能找到所有相关文件。另外,可以按住Ctrl键并单击PyCharm中的模块名称,在新窗口中会显示源代码(见下图)。

有没有想过Python的自定义模块或类是如何开发的?开发人员是如何编写Python代码并将其放在一起,从而创建出漂亮且令人惊叹的某模块的?背后究竟发生了什么?

当然,阅读文档能够帮助我们了解模块,但我们都知道,文档通常不会记录开发人员添加的每个新步骤或细节。

例如,我们都知道由Kirk Byers创建和维护的强大的netmiko库(参见GitHub网站),他利用了另一个主流SSH库——Paramiko。但是我们不了解细节以及这些类之间的关系。如果要了解netmiko是如何处理请求并返回结果的,就需要明白netmiko(或任何其他库)是如何工作的。下面给出了具体步骤(这里需要PyCharm专业版)。


 

PyCharm社区版不支持代码可视化和检查,这些仅在专业版中支持。


请按照下面的步骤进行操作。

(1)在Python库的安装路径(Windows系统下,通常位于C:\Python27\Lib\site- packages;Linux系统下,通常位于/usr/local/lib/pyhon2.7/dist-package)中找到netmiko模块的源代码,然后利用用PyCharm打开源文件。

(2)右击地址栏中显示的模块名称,然后选择DiagramsShow Diagram(见下图)。从弹出的窗口中选择Python class diagram。

(3)PyCharm将开始创建netmiko模块中所有类和文件之间的依赖关系树,然后显示在同一窗口中。请注意,这个过程可能需要一些时间,具体取决于计算机内存。此外,最好将图形另存成图片以方便查看(见下图)。

从生成的图上可以看出netmiko支持许多厂商的设备,如HP Comware、entrasys、Cisco ASA、Force10、Arista、Avaya等,所有这些类都继承自父类netmiko.cisco_base_ connection.CicsoSSHConnection(这可能因为它们使用了和Cisco相同的SSH风格),而它又是从另一个大型父类netmiko.cisco_base_connection.BaseConnection继承而来的(见下图)。

此外,还可以看到Juniper有自己的类(netmiko.juniper.juniper_ssh.JuniperSSH),它直接继承自BaseConnection。最后连接到Python中所有父节点的父节点——Object类(记住,Python中的所有内容最终都是一个对象)。

从中可以发现许多有趣的东西,比如SCP传输类和SNMP类。对于每个类,都可以找到用来初始化类的方法和参数。

ConnectHandler方法主要用于检查设备厂商类中的device_type是否可用,并根据返回数据使用相应的SSH类。

可视化代码的另一种方法是在代码执行期间查看具体运行了哪些模块和函数。我们将这种方法称为分析。它能够让你在运行时检查代码的相关功能。

首先,和平常一样编写代码。在运行代码时,如下图所示,需要右击空白区域并选择Profile 'profile-code',而不是直接运行。

在代码运行过程中,PyCharm将检查代码中调用到的每个文件并生成函数调用图(见下图),这样就可以很容易地看到代码运行时使用了哪些文件和函数,以及它们的运行时间。

从上面的图中可以看到,profile_code.py(见上图底部)中的代码将调用ConnectHandler()函数,而该函数又执行了__init__.py并且将继续执行。在上图的左侧,你可以看到代码运行期间使用的所有文件。

本章探讨了一些与网络、系统和云相关的常用Python包。此外,本章还讲述了如何获取模块的源代码并将代码可视化,从而更好地理解这些代码。同时本章还演示了如何查看代码运行时的调用关系。在下一章中,我们将开始搭建实验室环境,为运行后面的代码做好准备。


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程