Python自动化运维快速入门
上QQ阅读APP看书,第一时间看更新

1.1 自动化运维概述

在运维技术还不成熟的早期,都是通过手工执行命令管理硬件、软件资源,但是随着技术的成熟及软/硬件资源的增多,运维人员需要执行大量的重复性命令来完成日常的运维工作。而自动化运维就是将这些原本大量重复性的日常工作自动化,让工具或系统代替人工来自动完成具体的运维工作,解放生产力,提高效率,降低运维成本。可以说自动化运维是当下IT运维工作的必经之路。

1.1.1 自动化运维势在必行

自动化运维之所以势在必行,原因有以下几点:


(1)手工运维缺点多。传统的手工执行命令管理软/硬件资源易发生操作风险,只要是手工操作,难免会有失误,一旦执行错误的命令,后果可能是灾难性的。当软/硬件资源增多时,手工配置效率低,增加运维人员的数量也会导致人力成本变高。

(2)传统人工运维难以管理大量的软/硬件资源。试想当机器数目增长到1000台以上时,仅靠人力来维护几乎是非常困难的事情。

(3)业务需求的频繁变更。现在的市场瞬息万变,业务唯有快速响应市场的需求才能可持续发展,对工具的需求和变更更是会越来越多,频率也越来越快,程序升级、上线、变更都是需要运维条线来支撑的。同样的,只有借力自动化运维,使用工具才能满足频繁变更的业务需求。

(4)自动化运维的技术已经成熟。自动化运维被广泛关注的一个重要原因就是自动化运维的技术已经非常成熟,技术的成熟为自动化运维提供了智力支持。云计算、大数据一方面刺激着自动化运维的需求,另一方面也助力自动化运维。微服务的软件架构、容器等技术都在推动自动化运维。

(5)工具已经到位。关于自动化运维的工具,无论是开源的工具还是企业级的产品,都是应有尽有,实现自动化运维已经势不可挡。

1.1.2 什么是成熟的自动化运维平台

现在成熟的自动化运维平台都具备哪些要素呢?一般来说,有以下几点:


(1)需要有支持混合云的配置管理数据库(CMDB)。CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相连,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。现在更多的企业选择将服务器资源放在云上,无论是公有云还是私有云都提供资源管理接口,利用这些接口构建一个自动化的CMDB,同时增加日志审计功能,通过接口对资源的操作都应该记录,供后续审计。

(2)有完备的监控和应用性能分析系统。运维离不开监控和性能分析。资源监控(如服务器、磁盘、网络)和性能监控(如中间件、数据库)都是较为基础的监控,开源工具有Zabbix、Nagios、OpenFalcon(国产)。应用性能分析,如某些Web请求的响应速度、SQL语句执行的快慢等对于问题的定位是非常有帮助的,开源工具有pinpoint、zipkin、cat;商业工具有New Reclic、Dynatrace。

(3)需要具备批量运维工具。如何有效降低运维的成本呢,肯定是更少的人干更多的活。批量运维工具可有效节省大量人力,使用少量的人管理大量的服务器软/硬件资源成为可能。开源的批量运维工具有ansible、saltstack、puppet、chef,其中ansible和saltstack纯由Python编写,代码质量和社区活跃程度都很高,推荐使用。

(4)需要有日志分析工具。随着服务器的增多,日志的采集和分析成了运维中的难点,试想如何快速地从成百上千台服务中采集日志并分析出问题所在呢?日志采集方面工具有Sentry,也是纯由Python打造,日志分析有ELK,两者都是开源的。

(5)需要有持续集成和版本控制工具。持续集成是一种软件实践,团队成员经常集成他们的工作,每次集成都通过自动化的构建来验证,从而尽早发现集成错误。持续集成的工具有Hudson、CruiseControl、Continuum、Jenkins等。版本控制是软件开发中常用的工具,比较著名的是svn、git。

(6)还要有漏洞扫描工具。借助商业的漏洞扫描工具扫描漏洞,保护服务器资源不受外界的攻击。

1.1.3 为什么选择Python进行运维

为什么选择Python作为运维方面的编程语言呢?网络上不乏已经开发好的运维软件,但是运维工作复杂多变,已有的运维软件不可能穷尽所有的运维需求,总有一些运维需求需要运维人员自己去编写程序解决,这样做运维很有必要学会一门编程语言来解决实际问题,让程序代替人力去自动运维,减轻重复工作,提高效率。接下来,选择哪一门语言合适呢?当然是选一门学习成本低、应用效果高的,这方面Python的性价比最高,原因是:一方面,大部分的开源运维工具都是由纯Python编写的,如Celery、ansible、Paramiko、airflow等,学习Python后可以更加顺畅地使用这些开源工具提供的API,可以阅读这些开源工具的源代码,甚至可以修改源代码以满足个性化的运维需求;另一方面,Python与其他语言相比,有着以下优势。


简单、易学。阅读Python程序类似读英文,编码上避免了其他语言的烦琐。

更接近自然的思维方法,使你能够专注于解决问题而不是语法细节。

规范的代码,Python采用强制缩进的方式使得代码具有较好的可读性。

Python拥有一个强大的标准库和丰富的第三方库,拿来即用,无须重复造轮子。

可移植性高,Linux、UNIX、Windows、Android、Mac OS等一次编写,处处运行。

实用效果好,学习一个知识点,能够直接实战——用在工作上,立竿见影。

潜移默化,学习Python能够顺利理解并学习其他语言。


Python也是最具潜力的编程语言,在2018年IEEE发布的顶级编程语言排行榜中,Python排名第一,如图1.1所示。而图1.2表明,Python现在已成为美国名校中最流行的编程入门语言。ANSI / ISO C + +标准委员会的创始成员Bruce Eckel曾说过:“life is short,You need Python。”一度成为Python的宣传语,这正是说明Python有着简单、开发速度快、节省时间和精力的特点。另外,Python是开放的,也是开源的,有很多善良可爱的开发者在第三方库贡献了自己的源代码,许多功能都可以直接拿来使用,无须重新开发,这也是Python的强大之处。

图1.1 IEEE Spectrum给出的编程语言排行榜

图1.2 在美国名校编程语言的流行情况

下面摘抄一段Python在维基百科中的介绍。


Python是完全面向对象的语言。函数、模块、数字、字符串都是对象,并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。由于Python支持重载运算符,因此Python也支持泛型设计。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。

虽然Python被粗略地分类为“脚本语言”(Script Language),但实际上一些大规模软件开发项目,如Zope、Mnet及BitTorrent及Google也广泛地使用它。Python的支持者喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shell script、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。

Python本身被设计为可扩充的,并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C、C++、Cython来编写扩充模块。由于Python编译器本身也可以被集成到其他需要脚本语言的程序内,因此很多人还把Python作为一种“胶水语言”(Glue Language)使用,即使用Python将其他语言编写的程序进行集成和封装。

在Google内部的很多项目中,比如Google Engine使用C++编写性能要求极高的部分,然后使用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过在2004年,Python已在Google内部使用,Google招募了许多Python高手,但在这之前就已决定使用Python。他们的目的是尽量使用Python,在不得已时改用C++;在操控硬件的场合使用C++,在快速开发时使用Python。”

一些技术术语不理解没关系,Python是许多大公司都在使用的语言,如Google、NASA、知乎、豆瓣等,学习Python会有很大的用武之地,完全不用担心它的未来。

Python的设计哲学是优雅、明确、简单。提倡最好使用一种方法做一件事,Python的开发者一般会拒绝花哨的语法,选择明确而很少有歧义的语法。下面再摘一段Python格言:


Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!


上面的格言来自Python官方,也有中文版本,如下:


优美胜于丑陋,明晰胜于隐晦,

简单胜于复杂,复杂胜于繁芜,

扁平胜于嵌套,稀疏胜于密集,

可读性很重要。

虽然实用性比纯粹性更重要,

但特例并不足以把规则破坏掉。

错误状态永远不要忽略,

除非你明确地保持沉默,

直面多义,永不臆断。

最佳的途径只有一条,然而他并非显而易见——谁叫你不是荷兰人?

置之不理或许会比慌忙应对要好,

然而现在动手远比束手无策更好。

难以解读的实现不会是个好主意,

容易解读的或许才是。

名字空间就是个“顶呱呱”的好主意。

让我们想出更多的好主意!


Python如此优秀,让我们一起来学习吧。