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程序,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

#!/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 作业如下代码片段:

1

2

3

4

5

6

7

8

  <!-- 按插件的规则编写的流程设置 -->

  <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

转载于:https://my.oschina.net/u/1026945/blog/1556457

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值