TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)

本文主要是介绍TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 使用TASKCTL调度服务时,如果需要跨用户或者跨服务器调度可以通过安装taskctl的代理来实现,但有时需要执行作业的服务器上仅仅只有几个脚本,此时再部署代理,就显得有点得不偿失了。我们知道TASKCTL支持任意作业类型的扩展,所以我们是不是可以考虑通过SSH远程连接来执行这些少量的脚本程序。

    下面是通过扩展TASKCTL用ssh连接来支持调度远程作业的步骤,一方面解决一些朋友迫切的调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。

    下面编写的过程参照 http://www.taskctl.com/forum/detail_33.html 。

    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作业类型,如下图所示:

blob.png

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、调试测试作业是否符合预期

blob.png


这篇关于TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971423

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud