taskctl命令行类(sh、exe、python新增scp)插件升级扩展
来源:互联网 发布:廊坊新奥集团招聘 java 编辑:程序博客网 时间:2024/06/03 17:33
转载自:http://www.taskctl.com/forum/detail_129.html
上次写了一个帖子 TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)http://www.taskctl.com/forum/detail_122.html 。写完后发现,其实在原本的sh作业类型上改造一下就可以了,同时延伸到以前是用command执行方式的作业类型,都可以适当扩展,命令行类插件升级20171110.rar就是 sh、exe、python的插件和新增拷贝一些小文件的scp作业类型。插件中主要使用的ssh免密及其相关的几个参数和bash的几种模式,这个只是一个基础版本,如果有特殊的需求基于上面的插件改造一下就可以了。下面是摘抄了原网页上写法写的一个sh脚本的扩展,其他几个类似。
使用TASKCTL调度服务时,如果需要跨用户或者跨服务器调度可以通过安装taskctl的代理来实现,但有时需要执行作业的服务器上仅仅只有几个脚本或者一两个可执行程序,此时再部署代理,就显得有点得不偿失了。我们知道TASKCTL支持任意作业类型的扩展,所以我们是不是可以考虑通过SSH远程连接来扩展这些插件,使其能执行这些远程少量的脚本程序。
下面是通过扩展TASKCTL用ssh连接来支持调度远程作业的步骤,一方面解决一些朋友迫切的调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。
下面编写的过程参照 http://www.taskctl.com/forum/detail_33.html 。
1、首先在服务端的$TASKCTLDIR/src/plugin/sh/shell/目录中新增cprunsh.sh作业插件,实际上就是一个shell程序,代码如下:
#!/bin/sh#------------------------------------------------------------------------------#功能: [ssh方式]执行[远程]Shell脚本驱动插件程序##更新日志:20171030 由最开始的集成转换为插件,增强扩展原只能执行当前用户可读的 shell 脚本,#通过ssh协议,在免密的情况下可以执行本机不同用户和非本机的其他用户##参数: #1. progname 脚本的全路径名称#2. para 脚本的入口参数,格式为 para1 para2 ...#3. exppara 对应相应脚本的exppara属性,为脚本文件所在用户,当该参数为空时,默认为当前用户,如果不是当前用户时,为远程连接IP地址和用户名#sip=172.22.1.1 ssh远程IP地址#sport=9527 ssh远程连接端口#suser=taskctl ssh远程用户#返回值: 脚本执行后的实际返回值##流程模式代码任务定义举例:#1、默认2个输入参数的安装用户可执行的服务器上的sh脚本(如果参数多个,以此类推)#<sh>#<name>job1</name>#<progname>/home/taskctl/test.sh</progname> #<para>para1 para2</para>#</sh>#2、在同一台服务器上的其他用户可执行,当前节点安装用户不可执行sh脚本,当前用户和目标用户做了ssh免密(如果参数多个,以此类推)#<sh>#<name>job1</name>#<progname>/home/username/test.sh</progname> #<para>para1 para2</para>#<exppara>[sport=22,]suser=taskctl</exppara>#</sh>#3、不同服务器上,但都是shell作业,当前节点安装用户已经做了ssh免密(如果参数多个,以此类推)#<sh>#<name>job1</name>#<progname>/home/username/test.sh</progname> #<para>para1 para2</para>#<exppara>sip=172.22.1.1,[sport=22,]suser=taskctl</exppara>#</sh>##------------------------------------------------------------------------------if [ $# -ne 3 ]then echo "Param error !" echo "Usage: $0 progname para expara" exit 126fi#------------------------------------------------------------------------------# 第一步: 接收参数#------------------------------------------------------------------------------ ProgName=$1Para=$2ExpPara=$3#------------------------------------------------------------------------------# 第二步: 解析 exppara#------------------------------------------------------------------------------ function getValue(){if [ $# -ne 2 ] thenecho "......."exit 1fistr=`echo $2|awk -v record=$1 'BEGIN {split(record,myarray,",");}END{for (i in myarray){if (myarray[i]~$1){if ( index(myarray[i],$1) == 1){print myarray[i];break;}}}}'`echo $str|awk -F"=" '{print $2}'}ExpPara=`echo $ExpPara` #此处为了去前后空格,以便判断是否真正有入口参数#通过判断 exppara 是否为空,决定是直接执行sh还是走ssh通道#直接执行if [ ! -n "$ExpPara" ] thensh $ProgName $Pararet=$?exit $retfi#走ssh通道sip=`getValue $ExpPara sip`#通过判断 sip 是否为空,决定是直接执行本机其他用户还是远程服务器上的sh脚本if [ ! -n "$sip" ] thensip=localhostfi#sport=`getValue $ExpPara sport` #默认没有修改端口 传参数的时候也没有传 先屏蔽sport=22suser=`getValue $ExpPara suser`#------------------------------------------------------------------------------# 第三步: 检测是否配置了ssh免密连接#------------------------------------------------------------------------------ssh -o ConnectTimeout=5 -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/nullif [ $? != 0 ];thenecho -e "\nSSH Connection failed $sip"echo -e "\nssh-keygen -t rsa -P ''"echo -e "\nssh-copy-id -p $sport $suser@$sip"exit 1elseecho -e "\nSSH connection succeeded $sip"fi#------------------------------------------------------------------------------# 第四步: 运行JOB,并返回结果#------------------------------------------------------------------------------ #echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip bash --login $ProgName $Para" #此处为打印执行命令行,以便调试判断是否真正有入口参数ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "bash --login $ProgName $Para"ret=$?exit $ret
2、在桌面软件admin中进入"任务类型"功能中,设置ssh作业类型,如下图所示:
3、在桌面软件designer中设计 sh 作业如下代码片段:
<!-- 按插件的规则编写的流程设置 --> <sh> <name>MainModul_JobNode0</name> <progname>/home/cdchen/successjob.sh</progname> <para>para1 para2</para> <exppara>sip=192.168.0.192,suser=cdchen</exppara> <jobdesc>测试远程sh作业</jobdesc> </sh>
4、调试测试作业是否符合预期
- taskctl命令行类(sh、exe、python新增scp)插件升级扩展
- taskctl新增作业类型配置插件时注意事项
- TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)
- TASKCTL使用插件获取WebService天气信息
- Zookeeper命令行zkCli.sh&zkServer.sh的使用(四)
- python 使用ssh scp做个升级程序
- scp命令行拷贝
- python升级((从2.6升级到了3.4.4)带来的yum异常.sh
- 命令行zkCli.sh使用指南
- 扩展报表插件类
- Python打包EXE执行中屏蔽命令行提示框
- SCP不需要输入密码的sh脚本
- CecImport.exe命令行工具(PB6.0)
- 命令行(cmd.exe)中操作注册表
- ssh 命令行 scp 远程文件传输
- 关于python扩展包的安装与升级
- QML插件扩展2(基于C++的插件扩展)
- js扩展(插件算不上 )
- JAVA WEB 实现文件数据导入(CSV、TXT、excel)
- 定时获取微信access_token
- angular基础指令
- 微信Mac版下载
- Linux 创建子进程函数 --- fork
- taskctl命令行类(sh、exe、python新增scp)插件升级扩展
- 【JQ】使用JQ实现微信申请Access_Token
- MFC编程中UpdateData(true)和UpdateData(false)的区别
- 【jmeter-maven-plugin】八、指定Jmeter版本+指定JMeter库
- BI-SSAS实践篇
- Unity3d 发布IOS平台
- Java回调机制
- 如何才能制定出可行的SEO执行方案?
- java安全沙箱(一)之ClassLoader双亲委派机制