Python 领域运用:自动化运维

1. 自动化运维简介

1.1 什么是运维

运维是指对硬件和软件进行运营和维护,保障业务能够长期稳定运行。运维,通常属于技术部门,运维、研发与测试同为互联网产品技术支撑的 3 大部门。运维的职责包括:

  • 保障业务长期稳定运行,例如,保障网站服务器 7 x 24 小时不间断的运行
  • 负责服务器的网络设置、网络管理与系统性能优化
  • 保障数据安全可靠,如用户名密码、游戏数据、交易数据等
  • 对软件和硬件进行日常监控与维护,随时解决报警故障
  • 业务程序更新

1.2 自动化运维

系统管理员日常会进行大量的重复性操作,例如安装软件、修改配置文件、创建用户、批量执行命令等等。如果主机数量庞大,单靠人工维护实在让人难以忍受。考虑如下需求:

需求 1: 某大型企业的生产网络里有 100 台思科交换机,最近公司更换了 TACACS (终端访问控制器访问控制系统) 服务器,需要在这 100 台交换机上进行重新配置。

需求 2: 公司的网络安全部门提醒这 100 台思科交换机现有的 IOS 版本有很多安全漏洞,需要尽快升级它们的 IOS 版本。

有两种方式实现这样的需求:

  • 手工的方式,使用 ssh 依次登录到这 100 台思科交换机上,输入命令进行配置和升级系统。
  • 自动的方式,编写 Python 脚本,用程序自动登录到 100 台思科交换机上并执行相应的命令。在登录交换机的过程中,脚本会自动的输入用户名和密码。

自动化运维就是把那些传统上需要手工操作进行维护自动化。在上面的例子中,编写程序对 100 台交换机进行配置和升级,就是典型的自动化运维。在计算机专业的招聘网站,能搜索到大量的运维岗位招聘,如下所示:

图片描述

Shell 脚本是实现 Linux 系统自动管理以及自动化运维所必备的工具,除了 Shell,能够用于 Linux 运维的脚本语言还有 Python。

现在越来越多的公司要求运维人员会 Python 自动化开发,在计算机专业的招聘网站中,查询 baidu 发布的运维的招聘要求:

工作职责
- 负责百度运维基础设施(监控 部署 名字服务 容器托管)的稳定高效运行

任职资格
- 熟练掌握 Python/Go/Perl/Shell 至少一门语言

从招聘可以看到,Python 成了运维人员必备的技能,每一个运维人员在熟悉了 Shell 之后,都应该再学习 Python 语言。

2. 运维的基础知识

运维人员需要掌握掌握互联网常用的中间件维护、管理,例如 nginx、docker、mysql、redis 和 mongodb等。

2.1 nginx 简介

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由于它的内存占用少、启动快、高并发能力强,在互联网项目中广泛应用。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx 服务器的反向代理服务是其最常用的重要功能,当下流行的技术架构如下所示:

图片描述

  • 整个系统由两部分构成:
    • nginx 反向代理服务器
    • 多个应用服务器
  • 客户端将请求发送到 nginx 反向代理服务器
  • ngnix 根据请求的参数和配置将请求转发给应用服务器
  • nginx 从应用服务器获取数据后,在返回给客户端

通常 ngnix 作为整个应用的入口,运维人员需要熟练掌握 nginx 的配置和优化。

2.2 docker 简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到其它 Linux 系统上。

把一个应用部署到生产环境中,需要进行各种安装和配置:

  • 安装各种依赖包
  • 安装相关的应用程序并进行配置,例如 nginx、mysql 等

配置非常繁琐、容易出错,使用 docker 可以有效的解决问题:

  • 开发者可以打包他们的应用以及依赖包到一个可移植的镜像
  • 在生产环境下拉取一份镜像(已经配置好各种依赖包),直接运行镜像

Docker 对于显著的降低了应用部署的工作量,是运维人员必须掌握的技术。

2.3 mysql 简介

mysql 是一个关系型数据库管理系统。目前 mysql 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了 mysql 作为网站数据库。

mysql 的重要特性包括:

  • 使用 C 和 C++ 编写,源代码的可移植,支持Linux、BSD 和 Windows 等多种操作系统。
  • 为多种编程语言提供了 API。这些编程语言包括C、C++、Java、PHP、Python等。
  • 支持多线程,充分利用CPU资源,支持多用户。
  • 优化的SQL查询算法,有效地提高查询速度。
  • 提供多语言支持,常见的编码如中文的GB

运维人员需要熟练掌握管理、检查、优化 mysql 数据库操作的管理工具。

2.4 redis 简介

redis 是一个高性能的 key-value 数据库。redis 是非关系型数据库,将数据存储在内存中,访问的速度很快,能够显著的提高运行效率;与之相比,mysql 是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,访问速度较慢。

redis 的配置文件位于 redis 安装目录下,文件名为 redis.conf,通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。

redis 提供了大量的配置选项,例如:

  • maxmemory bytes
    • 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key
  • vm-enabled no
    • 指定是否启用虚拟内存机制,VM 机制将访问量较少的页即冷数据 swap 到磁盘上,将访问多的页面由磁盘 swap 到内存中

3. 为什么用 Python 进行运维

现阶段,掌握 Python 开发语言已经成为高级运维工程师的必备技能,其原因如下:

3.1 复杂的系统管理

在大型的互联网公司中,网络包含有成千上万台服务器,shell 脚本语言适合简单的系统管理工作,遇到复杂的自动化任务需要用专门的开发语言。Python 由于语法简单、拥有强大的第三方库,是完成复杂自动化任务的首选编程语言。

3.2 方便定制需求

存在有大量的自动化运维工具,但是现有的运维软件如 puppet、saltstack、zabbix 和 nagio 多为通用的软件,不可能完全适用公司的所有需求,当需要做定制、做二次开发的时候,如果掌握 Python 编程语言即可轻松完成需求,实现一个定制的运维工具:

  • 利用 Python 的第三方库,可以满足绝大部分自动化运维的需求
  • 利用 Python 强大的 WEB 框架,能够快速开发出一个运维管理的 WEB 界面,

3.3 帮助调试优化程序

在开发环境中,可能没有充分测试程序的性能;而在生产环境中,一个业务上线了,通过监控发现: CPU 使用过高、内存占用过大。

如果运维人员完全不懂开发,只能定位到进程级别,即找到占用资源过多的进程,然后将问题交给开发人员处理。如果运维人员掌握一门编程语言、懂开发,能够深入到业务代码,帮助调试、优化开发人开发的程序。

4. 常用的自动化运维模块

Python 的第三方模块提供了自动化运维所需的功能,如:监控系统资源、网络配置等,常用的模块如下:

  1. psutil

psutil 是一个跨平台库能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系统资源及进程的管理。

  1. dnspython

dnspython 是一个 DNS 工具包,可以用于查询、传输并动态更新 DNS 区域信息,在系统管理方面,可以利用查询功能来实现 DNS 服务监控以及解析结果的校验。

  1. smtplib

smtplib 是一个发送电子邮件的工具包,它对 smtp 协议进行了简单的封装。当监控系统发现问题时,通过调用 smtplib 发送报警邮件。

  1. IPy

IPy 提供了对地址进行处理的功能,主要提供了包括网段、网络掩码、广播地址、子网数、IP类型的处理等功能。

  1. pycurl

cURL 是一个利用 URL 语法在命令行下工作的文件传输工具,cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

pycurl 是一个用 C 语言写的 libcurl Python实现,可以理解为 linux 下 curl 命令功能的 Python 封装。

  1. scapy

scapy 是一个由 Python 编写的数据包处理程序,它能够对数据包进行伪造或解包,提供发送数据包、包嗅探、应答和反馈等功能,目前很多优秀的网络扫描攻击工具都使用了这个模块。

  1. ansible

ansible 是一个综合的自动化运维工具,基于 Python 开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible 提供了二次开发的接口,可以编写 python 脚本请求 ansible 的 接口,开发自己的运维工具。

  1. saltstack

saltstack 是一种基于 C/S 架构的集中化管理平台,管理端称为 Master,客户端称为 Minion。saltstack 具备配置管理、远程执行、监控等功能,saltstack 本身是基于 Python 语言开发实现,结合了轻量级的消息队列软件 ZeroMQ 与 Python 第三方模块构建。

通过部署 SaltStack 环境,运维人员可以在成千上万台服务器上做到批量执行命令,根据不同的业务特性进行配置集中化管理、分发文件、采集系统数据及软件包的安装与管理等。

saltstack 提供了二次开发的接口,可以编写 python 脚本请求 saltstack 的 接口,开发自己的运维工具。