批量并发执行工具PDO,主要是解决批量执行的繁锁,更安全便捷的操作工具.
本身是解决公司内部的一些问题,并且有很多特定环境的一些使用,现在抽离出其中都可以使用的部分.
- 工具名称: pdo(parallel do something) https://github.com/ohlinux/pdo
安装
依赖
- 需要有一个中控机与被管理机器建立了无密码的密钥关系.
- 需要有go语言的环境,进行编译安装.这里没有提供bin文件.
- 自己所测试的环境有,centos macos.
编译
先获取依赖的第三方库:
|
|
安装go 环境.
|
|
配置文件目录,默认在~/.pdo.如果不在此处指定.
pdo 结构
pdo 处理对象来源
获取机器列表和相对应的路径有三种途径.(这里去掉了数据库这种特定的)
- -f 文件,host的列表文件,可以是一列,也可以是两列有相关的目录依赖.后面有例子.
- -a app名字;-p 产品名;-a支持多app采用 app1,app2逗号分隔. (这个是数据库的来源,因为是特定环境的所以不再有)
- 标准输入 cat 1.host | pdo
- -R当使用的时候,可以自动生成失败的列表.详细查看例子”Retry功能”
pdo 列表过滤
如果列表名称是这样的结构,xxx.yyy 那么过滤的就是yyy,如果没有这个需要,可以忽略.
- -i yf01,dbl01,cq02 过滤物理机房名称,多个可用逗号隔开.
- -I JX/TC 过滤逻辑机房,配置在-c configure file 中
配置文件中:
|
|
日志记录
日志主要记录使用者,使用过的命令,保证多人操作的时候可以查看到.
日志配置文件查看github.com/cihub/seelog
主配置文件格式查看github.com/robfig/config
pdo 功能
会有主机和命令和单台执行确认.
- -r 数字 ,并发量,默认为1
- -C configure , 配置文件,默认为~/.pdo/pdo.conf
- -o dir , 输出目录,默认为空,会打印在屏幕,如果添加则只会打印到文件中.
- -cmd 命令, 命令缩写,在配置文件中.
- -t 超时结束,超时时间默认5min钟.
- -y 不用输入确认.
- -c copy file/dir ,复制文件/或者目录,要求无端的目录必需存在.
- -e script 执行脚本.
- -T 执行间隔时间,默认为0,比命令中加sleep效果好.
- -R retry ,失败之后retry功能,会记录上次失败的列表和ctrl+c未执行的列表.
- -temp template模板名字,在配置中.
- -b build-in 在使用template的模板时候可以嵌入脚本.
- -V 查看version
- -show 查看显示方式”row” 行显示方式.
- -match 在行显示的时候可以进行match字符串.高亮红色显示.
- -rule 在行显示的模式下,可以使用conf中的rule,来定义不同match的字符串的动作.(暂时无)
pdo 未完成功能
- 去重与多实例,产品线重启并发优化.
- web页面展示功能.
注意事项
- 操作的命令,被引号括起来的,一定要保持在命令最后.
pdo使用用举例
配置文件
|
|
host列表文件
第一列一定是host,hostname或者ip都可以,第二列可选是命令工作的路径.
|
|
使用管道方式
|
|
使用简写命令
这个主要是解决一些重复执行的繁锁的单行命令.看下面的一个重启命令很是麻烦,但通过转换之后就输入很方便了.
-cmd为缩写命令= bash bin/xxxControl.sh N%%N%%N%%restart
|
|
-o输入与屏幕输出
使用带-o 指定输出目录,将不会再打印在屏幕上,主要是对grep日志这种需求使用.速度要比屏幕打印快很多,是实时写入.
|
|
超时killed进程
时间都带单位,如1秒 1s , 1分钟 1m , 1小时 1h .
这里的1.log是一个大文件.
|
|
-c copy文件
copy文件其实是可以copy目录的,只要远端的目录是存在的就不会报错.
|
|
Retry功能
-R 就是相当于第四种列表来源,当执行错误,或者ctrl+c的时候就可以使用上,避免列表反复执行某些命令.
这次多加两台服务器,有两台是没有这个上面脚本文件的.所以新加的服务器会报错.
|
|
### -e脚本执行功能
|
|
模板功能
模板功能主要是解决重复的脚本修改动作,可以固化成一些模板,直接使用.
配置中可以自己添加模板
123$ cat ~/.pdo/pdo.conf[TEMPLATE]container : /home/work/.pdo/template/container.sh模板内容,这个模版主要是在一台服务器上的xxxxxx目录里面进行操作. {{.CMD}} 就是会被替换的位置.
123456789101112$ cat /home/work/.pdo/template/container.sh#!/bin/bashgrep -l "^appName:" /home/work/xxx[0-9][0-9][0-9]/xxx.conf | while read file ; doeval $(awk '{if($1 ~ /xxxPath/){printf "apppath=%s\n",$2};if($1 ~ /appName/){printf "appName=%s",$2}}' $file)echo $appNameif [ -d "$apppath" ];thencd $apppath{{.CMD}}fidone使用嵌入命令
12345678910111213141516171819202122232425262728293031$ pdo -a xxxtest -temp container "pwd">>>> Welcome ajian...yf-xxx-app02.yf01 -/home/work/xxx001 yf-xxx-app03.yf01 -/home/work/xxx001yf-xxx-app00.yf01 -/home/work/xxx001 yf-xxx-app0148.yf01 -/home/work/xxx004dbl-xxx-app0109.dbl01 -/home/work/xxx003 m1-xxx-app0220.m1 -/home/work/xxx001m1-xxx-app0154.m1 -/home/work/xxx004 cq01-xxx-app0242.cq01 -/home/work/xxx003cq01-xxx-app0179.cq01 -/home/work/xxx001 cq02-xxx-app0258.cq02 -/home/work/xxx001cq02-xxx-app0287.cq02 -/home/work/xxx001 cq02-xxx-app0211.cq02 -/home/work/xxx001jx-xxx-app17.jx -/home/work/xxx001 db-xxx-app17.db01 -/home/work/xxx003#--Total--# 14#---CMD---# pwdContinue (y/n):ygo on ...[1/14] yf-xxx-app02.yf01 [SUCCESS].xxxtest/home/work/xxx001jingyan/home/work/xxx002pc_anti/home/work/xxx003bakan/home/work/xxx004smallapp/home/work/xxx006appui/home/work/xxx008Continue (y/n):nexit ...还可以嵌入脚本
1234567891011121314151617181920212223242526272829303132333435363738394041//脚本内容$ cat 1.shecho "1.sh"pwd//嵌入脚本使用-b$ pdo -a xxxtest -temp container -b 1.sh>>>> Welcome ajian...yf-xxx-app02.yf01 -/home/work/xxx001 yf-xxx-app03.yf01 -/home/work/xxx001yf-xxx-app00.yf01 -/home/work/xxx001 yf-xxx-app0148.yf01 -/home/work/xxx004dbl-xxx-app0109.dbl01 -/home/work/xxx003 m1-xxx-app0220.m1 -/home/work/xxx001m1-xxx-app0154.m1 -/home/work/xxx004 cq01-xxx-app0242.cq01 -/home/work/xxx003cq01-xxx-app0179.cq01 -/home/work/xxx001 cq02-xxx-app0258.cq02 -/home/work/xxx001cq02-xxx-app0287.cq02 -/home/work/xxx001 cq02-xxx-app0211.cq02 -/home/work/xxx001jx-xxx-app17.jx -/home/work/xxx001 db-xxx-app17.db01 -/home/work/xxx003#--Total--# 14#---CMD---#Continue (y/n):ygo on ...[1/14] yf-xxx-app02.yf01 [SUCCESS].xxxtest1.sh/home/work/xxx001jingyan1.sh/home/work/xxx002pc_anti1.sh/home/work/xxx003bakan1.sh/home/work/xxx004smallapp1.sh/home/work/xxx006appui1.sh/home/work/xxx008
行显示与匹配
这个功能有两种使用场景:
- 有点类似multi tail 可以实现同时tail多个日志,显示在一个屏幕内,而且可以对match的字符串进行高亮显示.
- 如果输出是单行输出,没有状态显示会显示得加的美观和可参考性.
所以这种显示方式取决于时间的先后顺序,交错输出.
拿redis的迁移过程为例子:
redis迁移至少有原来的一主一从,新主和新从.在迁移的过程中需要同时观察四台服务器的变化.如果是每次ssh四台服务器tail 日志是很麻烦而且容易出错.
现在使用pdo命令:
|
|
说明:
- 因为是tail -f 是不会主动退出命令,所以需要使用-y 和使用-r 来增加并发量,不然会先进行单台显示 ,而不会显示后面的.
- match是匹配字符 串,暂时不支持正则,会进行高亮显示.红色显示.
- -show现在只支持row这一种方式,默认方式还是原来的缓存输出方式.
以下是一个测试脚本:随机打印数字 1.sh
|
|
还有更多的组合哦.