python运维小工具_Python实现跨平台运维小神器

(本文已不再同步更新,最新代码请移步github)

这阵子一直在学python,碰巧最近想把线上服务器环境做一些规范化/统一化,于是便萌生了用python写一个小工具的冲动。就功能方面来说,基本上是在“重复造轮子”吧,但是当我用这小工具完成了30多台服务器从系统层面到应用层面的一些规范化工作之后,觉得效果还不算那么low(高手可忽略这句话~~),这才敢拿出来跟小伙伴们分享一下。

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

现在主要功能包括:可批量执行远程命令,上传下载文件支持多线程并发执行(对于某些耗时的命令或上传文件,可大大减少等待时间)严格模式(批量执行中若某一台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上不存在而报错退出    全面的错误信息提示。对于执行中的几乎所有可能出现的错误,都有捕获机制获取并输出

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

帮助信息:

420e10cb8cfe5ec56c40466603af157b.png

批量执行远程命令:

9cb3fd325adfd553b3769d120e16d08a.png

上传:

08d30aecd16e98acbe84ed19c3940ab1.png

下载:

3df8f57fca1a1a59f69884fd592dd04c.png

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

接下来直接看代码吧(我的老(lan)习惯,代码里注释还算详细,所以我就懒得再解释那么多喽)

#!/bin/env python3

# coding:utf-8

"""

Usage:

auto_task [options] cmd [--skip-err] [--parallel]

auto_task [options] put [--parallel]

auto_task [options] get

Options:

-h --help             Show this screen.

-u              Remote username [default: root]

-p          User's password

--pkey   Local private key [default: /root/.ssh/id_rsa]

--server

File include the remote server's information,

With the format of 'name-ip:port', such as 'web1-192.168.1.100:22',one server one line.

--skip-err            Use with cmd, if sikp any server's error and continue process the other servers [default: False].

--parallel            Parallel execution, only use with cmd or put. This option implies the --skip-err [default: False].

cmd                   Run command on remote server(s),multiple commands sperate by ';'

put                   Transfer from local to remote. Transport mechanism similar to rsync.

get                   Transfer from remote to local. Transport mechanism similar to rsync.

Notice:       cmd, get, put can only use one at once

For Windows:  always use double quotes for quote something;

it's highly recommend that with get or put in Windows,always use '/' instead of '\\'

"""

"""

by ljk 20160704

update at 2017011,20170320

"""

from docopt import docopt

from paramiko import SSHClient, AutoAddPolicy

from os import path, walk, makedirs, stat, utime

from re import split, match, search

from sys import exit, stdout

import platform

from math import floor

import threading

"""

因为涉及了(多)线程,所以我们将串行也归为单线程,这样可以统一用线程的一些思路,而不必编写一套多线程模型一套串行模型。

也因为多线程,所以输出用print()的话,各server的输出会对不上号,所以引入了OutputText类,将每个server的输出统一保存起来,最后打印出来

但是这样依然无法避免多个线程同时完成了,同时打印各自的最终结果。也就是说多线程任务最终需要输出时,输出这个动作必须要串行

"""

class OutputTex

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值