编程狗
编程大牛技术分享平台
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判断是否需要传输
- 当过程遇到错误时,发送信号给主线程,对于还未开启的线程,则不再开启;对于以开启的线程,等待其完成(这里以任何一种方式将其杀死,都不好阻止其在远程已经开使的命令)
使用说明
帮助信息:
1. `shells]# auto_task --help`
2. `Usage:`
3. `auto_task [options] cmd <command> [--parallel] target <targets>...`
4. `auto_task [options] put <src> <dst> [--parallel] target <targets>...`
5. `auto_task [options] get <src> <dst> target <targets>...`
6.
7. `Options:`
8. `-h --help Show this screen.`
9. `-c <config> YAML file include the remote server's information [default: /root/shells/auto_task.yml]`
10. `-u <user> Remote username [default: root]`
11. `-p <password> User's password`
12. `--pkey <private-key> Local private key [default: ~/.ssh/id_rsa]`
13. `--parallel Parallel execution, only use with 'cmd' or 'put' [default: False].`
14.
15. `cmd Run command on remote server(s),multiple commands sperate by ';'`
16. `put Transfer from local to remote. Transport mechanism similar to rsync.`
17. `get Transfer from remote to local. Transport mechanism similar to rsync.`
18. `target Which host(s) or group(s) you want to process,`
19.
20. `Notice: cmd, get, put can only use one at once.`
21. `For Windows: Always use double quotes for quote something;`
22. `It's highly recommend that with get or put in Windows, always use '/' instead of '\'`
批量执行远程命令: 以主机组为单位批量执行远程命令
1. `# web is a group, contains: web1 and web2`
2. `shells]# auto_task -uroot cmd "echo 123" target web`
3.
4. `----web1`
5. `----result:`
6. `123`
7.
8. `----web2`
9. `----result:`
10. `123`
上例也可以主机为单位批量执行
1. `shells]# auto\_task -uroot cmd
"echo 123"
target web1 web2`
也可以通过--parallel参数实现并发执行
1. `shells]# auto_task -uroot cmd "yum -y install rsync" target web1 web2 --parallel`
2. `----web1`
3. `----result:`
4. `Loaded plugins: fastestmirror`
5. `Loading mirror speeds from cached hostfile`
6. `* base: mirrors.tuna.tsinghua.edu.cn`
7. `* extras: mirrors.tuna.tsinghua.edu.cn`
8. `* updates: mirrors.tuna.tsinghua.edu.cn`
9. `Setting up Install Process`
10. `Package rsync-3.0.6-12.el6.x86_64 already installed and latest version`
11. `Nothing to do`
12.
13. `----web2`
14. `----result:`
15. `Loaded plugins: fastestmirror`
16. `Loading mirror speeds from cached hostfile`
17. `* base: mirrors.tuna.tsinghua.edu.cn`
18. `* extras: mirrors.tuna.tsinghua.edu.cn`
19. `* updates: mirrors.tuna.tsinghua.edu.cn`
20. `Setting up Install Process`
21. `Package rsync-3.0.6-12.el6.x86_64 already installed and latest version`
22. `Nothing to do`
也可通过--skip-err参数忽略批量执行中的错误
1. `shells]# auto_task -u root cmd "ls -l /nginx_log" target web2 web3 --skip-err`
2.
3. `----web2`
4. `----error:`
5. `ls: 无法访问/nginx_log: 没有那个文件或目录`
6.
7. `----web3`
8. `----result:`
9. `总用量 0`
10. `-rw-r--r-- 1 root root 0 4月 19 14:21 api.access`
11. `-rw-r--r-- 1 root root 0 4月 19 14:20 www.access`
关于--skip-err: 不提供此参数时 串行情况下:遇到错误便退出,不会继续在后续的主机上执行命令 并行情况下:对于还未开启的线程(一个线程对应一个主机),则不再开启;对于以开启的线程,等待其完成(或报错)
上传:
1. `shells]# auto_task -uroot -c name-ip-port.txt put /tmp/ljkapi /tmp/ljkapi target web1 web2`
2.
3. `----web1`
4. `----Uploading /tmp/ljkapi TO /tmp/ljkapi`
5. `/tmp/ljkapi/date.txt`
6. `/tmp/ljkapi/api/demo.tmp`
7.
8. `----web2`
9. `----Uploading /tmp/ljkapi TO /tmp/ljkapi`
10. `/tmp/ljkapi/date.txt`
11. `/tmp/ljkapi/api/demo.tmp`
下载:
1. `shells]# auto_task -uroot -c name-ip-port.txt get /tmp/ljkapi /tmp/kkk target web1 ## 下载若指定多个目标,只会取第一个`
2.
3. `----web1`
4. `----Downloading /tmp/ljkapi TO /tmp/kkk`
5. `/tmp/ljkapi/date.txt`
6. `/tmp/ljkapi/api/demo.tmp`
希望能对大家有所帮助。
本文作者
❈
jkklee,6年运维老司机一枚,擅长高并发及复杂场景下的故障排查和性能优化。目前比较侧重于将自己的运维积累转化成通用易用的各种工具,希望能帮到更多的运维同胞。
本文项目GitHub地址,欢迎star和fork:
https://github.com/jkklee/ops-batch
❈
如果您想让更多的开发者朋友了解您的开源项目,就请点击下方 阅读原文 加入
▼ P ython中文社区GitHub开源项目扶持计划