TASKCTL中不使用代理,經過ssh免密鏈接執行遠程腳本配置(SSH插件擴展)

    使用TASKCTL調度服務時,若是須要跨用戶或者跨服務器調度能夠經過安裝taskctl的代理來實現,但有時須要執行做業的服務器上僅僅只有幾個腳本,此時再部署代理,就顯得有點得不償失了。咱們知道TASKCTL支持任意做業類型的擴展,因此咱們是否是能夠考慮經過SSH遠程鏈接來執行這些少許的腳本程序。html

    下面是經過擴展TASKCTL用ssh鏈接來支持調度遠程做業的步驟,一方面解決一些朋友迫切的調度需求,另外一方面拋磚引玉,讓你們可以在TASKCTL中擴展更多的適應本身需求的做業插件。shell

    下面編寫的過程參照 http://www.taskctl.com/forum/detail_33.html 。服務器

    一、首先在服務端的$TASKCTLDIR/src/plugin/ssh/shell/目錄中新增cprunssh.sh做業插件,實際上就是一個shell程序,代碼以下:ssh

1測試

2spa

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

二、在桌面軟件admin中進入"任務類型"功能中,設置ssh做業類型,以下圖所示:

blob.png

三、在桌面軟件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>

四、調試測試做業是否符合預期

blob.png

相關文章
相關標籤/搜索