内附源码!实现60台服务器跨平台自动化运维的Python小神器

本文由马哥教育Python自动化实战班5期学员推荐,转载自互联网,作者为kaifly,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛苦贡献与付出。

Python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白。大家都知道,当下全栈工程师的概念很火,而Python是一种全栈的开发语言,所以你如果能学好Python,那么前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任。

这阵子一直在学Python,碰巧最近想把线上服务器环境做一些规范化/统一化,于是便萌生了用Python写一个小工具的冲动。

就功能方面来说,基本上是在“重复造轮子”吧,但是当我用这小工具完成了30多台服务器从系统层面到应用层面的一些规范化工作之后,觉得效果还不算那么low(高手可忽略这句话~~),这才敢拿出来跟小伙伴们分享一下。

(注:笔者所用为Python版本为3.5,其他版本未经测试~~)

经过数次修改(最新修改日期 20170320),现在主要功能包括:

  1. 可批量执行远程命令,上传下载文件
  2. 支持多线程并发执行(对于某些耗时的命令或上传文件,可大大减少等待时间)
  3. 严格模式(批量执行中若某一台server执行错误则退出)和非严格模式
  4. 上传下载文件实现了类似rsync的机制
  5. 完善的命令行提示
  6. 跨平台,Linux和Windows均可

大致实现思路如下:

外部包依赖docopt和paramiko

有一个server信息文件,内容格式为 : “主机名-IP:端口”。脚本读取此文件来决定要对哪些server进行操作(该文件内部支持#注释掉某些server)

采用了docopt提供命令行界面

paramiko模块实现远程命令和sftp客户端功能。这里paramiko的sftp实例其只包含了基本的单个文件传输功能;并且不保存文件相关时间信息。

paramiko 通过sftp实例传输文件环节,这里额外实现“保持文件时间信息”和“实现目录传输”以及“实现类似rsync的传输机制”是要考虑很多问题和逻辑的。传输机制模仿rsync的默认机制,检查文件的mtime和size,有差异才会真正传输。

实现了参数中原路径和目标路径的自动判断,例如传输目录时不要求路径后面加‘/’

对于远程命令(cmd),可以通过设置(--skip-err)跳过某些server的错误继续执行。例如批量执行‘ls’命令,一般情况会因为某些server上不存在而报错退出

全面的错误信息提示。对于执行中的几乎所有可能出现的错误,都有捕获机制获取并输出

下面先来看一些基本的使用截图吧

帮助信息:

内附源码!实现60台服务器跨平台自动化运维的Python小神器

批量执行远程命令:

内附源码!实现60台服务器跨平台自动化运维的Python小神器

上传:

内附源码!实现60台服务器跨平台自动化运维的Python小神器

下载:

内附源码!实现60台服务器跨平台自动化运维的Python小神器

其实批量执行命令,传输文件在Linux上用shell也是可以很好的实现(而且ssh或rsync等也肯定比这套脚本功能点更多),但是考虑到并发执行以及在Linux和win平台的通用性,用Python来实现就有必要了。尤其是想在Win客户端和Linux服务器之间模仿rsync机制传输文件时,这个脚本就能派上用场了。

另外脚本里包含了两个有用的函数(类):

print_color()函数方便的在Linux下实现打印不同颜色的字体;

OutputText类在多线程任务需要在中终端打印结果时会非常有用

其实之所以想造这么一个轮子,一方面能锻炼Python coding,另一方面当时确实有这么一个需求。而且用自己的工具完成工作也是小有成就的(请勿拍砖~)。

另外,在开发过程中对于一些概念性的东西也都有了更深入的了解:

例如在使用paramiko模块的过程中,又促使我深入的了解了一些ssh登陆的详细过程。

又如用到了线程模型,更深入的了解了线程进程相关的概念。

所以作为一枚运维老司机,越来越深刻的理解到“运维”和“开发”这俩概念之间的相互促进。希望大家共勉。

需要本Python代码请回复关注公众号回复:Python神器

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!