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

火山方舟向量数据库大模型

picture.image

编程狗

编程大牛技术分享平台

picture.image

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

picture.image

如果您想让更多的开发者朋友了解您的开源项目,就请点击下方 阅读原文 加入

P ython中文社区GitHub开源项目扶持计划

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生数仓如何构建高性能向量检索技术
火山引擎ByteHouse团队基于社区 ClickHouse 进行技术演进,提出了全新的向量检索功能设计思路,满足业务对向量检索稳定性与性能方面的需求。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论