python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白。大家都知道,当下全栈工程师的概念很火,而Python是一种全栈的开发语言,所以你如果能学好Python,那么前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任。
这阵子一直在学Python,碰巧最近想把线上服务器环境做一些规范化/统一化,于是便萌生了用python写一个小工具的冲动。
就功能方面来说,基本上是在“重复造轮子”吧,但是当我用这小工具完成了30多台服务器从系统层面到应用层面的一些规范化工作之后,觉得效果还不算那么low(高手可忽略这句话~~),这才敢拿出来跟小伙伴们分享一下。
(注:笔者所用为python版本为3.5,其他版本未经测试~~)
经过数次修改(最新修改日期 20170320),现在主要功能包括:
可批量执行远程命令,上传下载文件
支持多线程并发执行(对于某些耗时的命令或上传文件,可大大减少等待时间)
严格模式(批量执行中若某一台server执行错误则退出)和非严格模式
上传下载文件实现了类似rsync的机制
完善的命令行提示
跨平台,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上不存在而报错退出
全面的错误信息提示。对于执行中的几乎所有可能出现的错误,都有捕获机制获取并输出
下面先来看一些基本的使用截图吧
帮助信息:
批量执行远程命令:
上传:
下载:
其实批量执行命令,传输文件在Linux上用shell也是可以很好的实现(而且ssh或rsync等也肯定比这套脚本功能点更多),但是考虑到并发执行以及在linux和win平台的通用性,用Python来实现就有必要了。尤其是想在Win客户端和Linux服务器之间模仿rsync机制传输文件时,这个脚本就能派上用场了。
另外脚本里包含了两个有用的函数(类):
print_color()函数方便的在Linux下实现打印不同颜色的字体;
OutputText类在多线程任务需要在中终端打印结果时会非常有用
其实之所以想造这么一个轮子,一方面能锻炼python coding,另一方面当时确实有这么一个需求。而且用自己的工具完成工作也是小有成就的(请勿拍砖~)。
另外,在开发过程中对于一些概念性的东西也都有了更深入的了解:
例如在使用paramiko模块的过程中,又促使我深入的了解了一些ssh登陆的详细过程。
又如用到了线程模型,更深入的了解了线程进程相关的概念。
所以作为一枚运维老司机,越来越深刻的理解到“运维”和“开发”这俩概念之间的相互促进。希望大家共勉。
*声明:推送内容及图片来源于网络,部分内容会有所改动,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
- END -
领取专属 10元无门槛券
私享最新 技术干货