前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python开源项目推荐:跨平台批量运维小工具batch_ops

Python开源项目推荐:跨平台批量运维小工具batch_ops

作者头像
Python中文社区
发布2018-07-26 17:36:29
7780
发布2018-07-26 17:36:29
举报
文章被收录于专栏:Python中文社区Python中文社区

batch_ops是一个用Python实现的跨平台批量运维小工具。通过它可以执行远程命令/上传下载文件。它基于yaml配置文件可灵活指定操作单位:host(s)或hostgroup(s);基于多线程可实现多主机并行;基于docopt提供详细的命令行界面。

特点:

  • 完善的命令行提示,比较优雅的输出
  • 基于yaml的配置文件,实现灵活的对主机或主机组的操作
  • 支持多线程并发执行
  • 批量执行支持忽略某个(些)节点的错误
  • 传输文件实现了类似rsync的机制
  • 跨平台,支持Linux和Windows

依赖和实现思路:

  • 包依赖:docopt(0.6.2),paramiko(2.4.0),pyyaml(3.12)
  • 将主机组以及主机(格式 name:ip:port)信息写进yaml配置文件,以便灵活选取操作目标
  • paramiko 模块实现远程命令和sftp客户端功能。
  • 要同时支持并行和串行:抽象出多线程模型,将串行视为多线程中只有一个线程的特例,解决多线程输出乱序问题
  • 文件传输功能:由于ssh的sftp子系统只支持单个文件传输,所以需要以递归思想传输目录;尽量减少无谓通信;基于两端文件的mtime和size判断是否需要传输
  • 当过程遇到错误时,发送信号给主线程,对于还未开启的线程,则不再开启;对于以开启的线程,等待其完成(这里以任何一种方式将其杀死,都不好阻止其在远程已经开使的命令)

使用说明

帮助信息:

代码语言:javascript
复制
shells]# auto_task --help
Usage:
  auto_task [options] cmd <command> [--parallel] target <targets>...
  auto_task [options] put <src> <dst> [--parallel] target <targets>...
  auto_task [options] get <src> <dst> target <targets>...

Options:
  -h --help             Show this screen.
  -c <config>           YAML file include the remote server's information [default: /root/shells/auto_task.yml]
  -u <user>             Remote username [default: root]
  -p <password>         User's password
  --pkey <private-key>  Local private key [default: ~/.ssh/id_rsa]
  --parallel            Parallel execution, only use with 'cmd' or 'put' [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.
  target                Which host(s) or group(s) you want to process,

  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 '\'

批量执行远程命令: 以主机组为单位批量执行远程命令

代码语言:javascript
复制
# web is a group, contains: web1 and web2
shells]# auto_task -uroot cmd "echo 123" target web

----web1
    ----result:
        123

----web2
    ----result:
        123

上例也可以主机为单位批量执行

代码语言:javascript
复制
shells]# auto_task -uroot cmd "echo 123" target web1 web2

也可以通过--parallel参数实现并发执行

代码语言:javascript
复制
shells]# auto_task -uroot cmd "yum -y install rsync" target web1 web2 --parallel
----web1
    ----result:
        Loaded plugins: fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.tuna.tsinghua.edu.cn
         * extras: mirrors.tuna.tsinghua.edu.cn
         * updates: mirrors.tuna.tsinghua.edu.cn
        Setting up Install Process
        Package rsync-3.0.6-12.el6.x86_64 already installed and latest version
        Nothing to do

----web2
    ----result:
        Loaded plugins: fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.tuna.tsinghua.edu.cn
         * extras: mirrors.tuna.tsinghua.edu.cn
         * updates: mirrors.tuna.tsinghua.edu.cn
        Setting up Install Process
        Package rsync-3.0.6-12.el6.x86_64 already installed and latest version
        Nothing to do

也可通过--skip-err参数忽略批量执行中的错误

代码语言:javascript
复制
shells]# auto_task -u root cmd "ls -l /nginx_log" target web2 web3 --skip-err     

----web2
    ----error:
        ls: 无法访问/nginx_log: 没有那个文件或目录

----web3
    ----result:
        总用量 0
        -rw-r--r-- 1 root root 0 4月  19 14:21 api.access
        -rw-r--r-- 1 root root 0 4月  19 14:20 www.access

关于--skip-err: 不提供此参数时 串行情况下:遇到错误便退出,不会继续在后续的主机上执行命令 并行情况下:对于还未开启的线程(一个线程对应一个主机),则不再开启;对于以开启的线程,等待其完成(或报错)

上传:

代码语言:javascript
复制
shells]# auto_task -uroot -c name-ip-port.txt put /tmp/ljkapi /tmp/ljkapi target web1 web2

----web1
    ----Uploading /tmp/ljkapi TO /tmp/ljkapi
        /tmp/ljkapi/date.txt
        /tmp/ljkapi/api/demo.tmp

----web2
    ----Uploading /tmp/ljkapi TO /tmp/ljkapi
        /tmp/ljkapi/date.txt
        /tmp/ljkapi/api/demo.tmp

下载:

代码语言:javascript
复制
shells]# auto_task -uroot -c name-ip-port.txt get /tmp/ljkapi /tmp/kkk target web1  ## 下载若指定多个目标,只会取第一个

----web1
    ----Downloading /tmp/ljkapi TO /tmp/kkk
        /tmp/ljkapi/date.txt
        /tmp/ljkapi/api/demo.tmp

希望能对大家有所帮助。

本文作者

jkklee,6年运维老司机一枚,擅长高并发及复杂场景下的故障排查和性能优化。目前比较侧重于将自己的运维积累转化成通用易用的各种工具,希望能帮到更多的运维同胞。

本文项目GitHub地址,欢迎star和fork:

https://github.com/jkklee/ops-batch

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档