本帖最后由 童话镇 于 2017-10-26 10:02 编辑
使用TASKCTL调度服务时,如果需要跨用户或者跨服务器调度可以通过安装taskctl的代理来实现,但有时需要执行作业的服务器上仅仅只有几个脚本,此时再部署代理,就显得有点得不偿失了。我们知道TASKCTL支持任意作业类型的扩展,所以我们是不是可以考虑通过SSH远程连接来执行这些少量的脚本程序。 下面是通过扩展TASKCTL用ssh连接来支持调度远程作业的步骤,一方面解决一些朋友迫切的调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。 1、首先在服务端的$TASKCTLDIR/src/plugin/ssh/shell/目录中新增cprunssh.sh作业插件,实际上就是一个shell程序,代码如下: - #!/bin/sh
- #------------------------------------------------------------------------------
- # 功能: ssh方式执行 远程脚本 驱动插件程序
- # 参数:
- # 1. progname 和sh作业类似,对应相应任务的progname属性,一般为脚本的全路径名称
- # 2. para 和sh作业类似,对应相应任务的para属性,一般为脚本的入口参数,格式为 para1 para2 ...
- # 3. exppara 对应相应任务的exppara属性,一般为脚本文件所在位置,在这里是远程连接IP地址和用户名
- # sip=172.22.1.1 ssh远程IP地址
- # sport=9527 ssh远程连接端口
- # suser=taskctl ssh远程用户
- # 返回值: 0 成功;1 失败
- #
- # 流程模式代码任务定义举例:
- # 默认2个输入参数的远程服务器上的sh脚本(如果多个,以此类推)
- # <ssh>
- # <name>job1</name>
- # <progname>/home/username/test.sh</progname>
- # <para>para1 para2</para>
- # <exppara>sip=172.22.1.1,[sport=22,]suser=taskctl</exppara>
- # </ssh>
- #
- #------------------------------------------------------------------------------
- if [ $# -ne 3 ]
- then
- echo "Param error !"
- echo "Usage: $0 progname para expara"
- exit 126
- fi
- #------------------------------------------------------------------------------
- # 第一步: 接收参数
- #------------------------------------------------------------------------------
- ProgName=$1
- Para=$2
- ExpPara=$3
- #------------------------------------------------------------------------------
- # 第二步: 解析 exppara
- #------------------------------------------------------------------------------
- function getValue(){
- if [ $# -ne 2 ]
- then
- echo "......."
- exit 1
- fi
- str=`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` #此处为了去前后空格,以便判断是否真正有入口参数
- sip=`getValue $ExpPara sip`
- #sport=`getValue $ExpPara sport` #默认没有修改端口 传参数的时候也没有传 先屏蔽
- sport=22
- suser=`getValue $ExpPara suser`
- #------------------------------------------------------------------------------
- # 第三步: 检测是否配置了ssh免密连接
- #------------------------------------------------------------------------------
- ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/null
- if [ $? != 0 ];then
- echo -e "\n无法连接到$sip"
- echo -e "\n可以参照下面的语句尝试配置免密连接"
- echo -e "\nssh-keygen -t rsa -P ''"
- echo -e "\nssh-copy-id -p $sport $suser@$sip"
- exit 1
- else
- echo -e "\n$sip :ssh connect is OK"
- fi
- #------------------------------------------------------------------------------
- # 第四步: 运行JOB,并等待结果
- #------------------------------------------------------------------------------
- #echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip sh $ProgName $Para" #此处为打印执行命令行,以便调试判断是否真正有入口参数
- echo "================================================================================"
- ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "sh $ProgName $Para"
- ret=$?
- #------------------------------------------------------------------------------
- # 第五步: 插件返回
- #------------------------------------------------------------------------------
- echo "================================================================================"
- if [[ $ret == 0 ]]; then
- echo "Run job success !"
- exit 0
- else
- echo "Run job failed !"
- exit 1
- fi
复制代码
2、在桌面软件admin中进入"任务类型"功能中,设置ssh作业类型,如下图所示: 3、在桌面软件designer中设计 ssh 作业如下代码片段: - <!-- 按插件的规则编写的流程设置 -->
- <ssh>
- <name>MainModul_JobNode0</name>
- <progname>/home/cdchen/successjob.sh</progname>
- <para>para1 para2</para>
- <exppara>sip=47.94.203.124,suser=cdchen</exppara>
- <jobdesc>测试ssh作业</jobdesc>
- </ssh>
复制代码
4、调试测试作业是否符合预期
|