本帖最后由 ffw_880106 于 2017-11-10 14:33 編輯
轉(zhuǎn)載自 : http://www.taskctl.com/forum/detail_129.html
上次寫了一個帖子 TASKCTL中不使用代理,通過ssh免密連接執(zhí)行遠程腳本配置(SSH插件擴展)http://www.taskctl.com/forum/detail_122.html 。寫完后發(fā)現(xiàn),其實在原本的sh作業(yè)類型上改造一下就可以了,同時延伸到以前是用command執(zhí)行方式的作業(yè)類型,都可以適當擴展, 命令行類插件升級20171110.rar就是 sh、exe、python的插件和新增拷貝一些小文件的scp作業(yè)類型。插件中主要使用的ssh免密及其相關(guān)的幾個參數(shù)和bash的幾種模式,這個只是一個基礎(chǔ)版本,如果有特殊的需求基于上面的插件改造一下就可以了。下面是摘抄了原網(wǎng)頁上寫法寫的一個sh腳本的擴展,其他幾個類似。 使用TASKCTL調(diào)度服務(wù)時,如果需要跨用戶或者跨服務(wù)器調(diào)度可以通過安裝taskctl的代理來實現(xiàn),但有時需要執(zhí)行作業(yè)的服務(wù)器上僅僅只有幾個腳本或者一兩個可執(zhí)行程序,此時再部署代理,就顯得有點得不償失了。我們知道TASKCTL支持任意作業(yè)類型的擴展,所以我們是不是可以考慮通過SSH遠程連接來擴展這些插件,使其能執(zhí)行這些遠程少量的腳本程序。 下面是通過擴展TASKCTL用ssh連接來支持調(diào)度遠程作業(yè)的步驟,一方面解決一些朋友迫切的調(diào)度需求,另一方面拋磚引玉,讓大家能夠在TASKCTL中擴展更多的適應(yīng)自己需求的作業(yè)插件。 1、首先在服務(wù)端的$TASKCTLDIR/src/plugin/sh/shell/目錄中新增cprunsh.sh作業(yè)插件,實際上就是一個shell程序,代碼如下: - #!/bin/sh
- #------------------------------------------------------------------------------
- # 功能: [ssh方式]執(zhí)行[遠程]Shell腳本驅(qū)動插件程序
- #
- # 更新日志:20171030 由最開始的集成轉(zhuǎn)換為插件,增強擴展原只能執(zhí)行當前用戶可讀的 shell 腳本,
- # 通過ssh協(xié)議,在免密的情況下可以執(zhí)行本機不同用戶和非本機的其他用戶
- #
- # 參數(shù):
- # 1. progname 腳本的全路徑名稱
- # 2. para 腳本的入口參數(shù),格式為 para1 para2 ...
- # 3. exppara 對應(yīng)相應(yīng)腳本的exppara屬性,為腳本文件所在用戶,當該參數(shù)為空時,默認為當前用戶,如果不是當前用戶時,為遠程連接IP地址和用戶名
- # sip=172.22.1.1 ssh遠程IP地址
- # sport=9527 ssh遠程連接端口
- # suser=taskctl ssh遠程用戶
- # 返回值: 腳本執(zhí)行后的實際返回值
- #
- # 流程模式代碼任務(wù)定義舉例:
- # 1、默認2個輸入?yún)?shù)的安裝用戶可執(zhí)行的服務(wù)器上的sh腳本(如果參數(shù)多個,以此類推)
- # <sh>
- # <name>job1</name>
- # <progname>/home/taskctl/test.sh</progname>
- # <para>para1 para2</para>
- # </sh>
- # 2、在同一臺服務(wù)器上的其他用戶可執(zhí)行,當前節(jié)點安裝用戶不可執(zhí)行sh腳本,當前用戶和目標用戶做了ssh免密(如果參數(shù)多個,以此類推)
- # <sh>
- # <name>job1</name>
- # <progname>/home/username/test.sh</progname>
- # <para>para1 para2</para>
- # <exppara>[sport=22,]suser=taskctl</exppara>
- # </sh>
- # 3、不同服務(wù)器上,但都是shell作業(yè),當前節(jié)點安裝用戶已經(jīng)做了ssh免密(如果參數(shù)多個,以此類推)
- # <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 126
- fi
- #------------------------------------------------------------------------------
- # 第一步: 接收參數(shù)
- #------------------------------------------------------------------------------
- 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` #此處為了去前后空格,以便判斷是否真正有入口參數(shù)
- #通過判斷 exppara 是否為空,決定是直接執(zhí)行sh還是走ssh通道
- #直接執(zhí)行
- if [ ! -n "$ExpPara" ]
- then
- sh $ProgName $Para
- ret=$?
- exit $ret
- fi
- #走ssh通道
- sip=`getValue $ExpPara sip`
- #通過判斷 sip 是否為空,決定是直接執(zhí)行本機其他用戶還是遠程服務(wù)器上的sh腳本
- if [ ! -n "$sip" ]
- then
- sip=localhost
- fi
- #sport=`getValue $ExpPara sport` #默認沒有修改端口 傳參數(shù)的時候也沒有傳 先屏蔽
- sport=22
- suser=`getValue $ExpPara suser`
- #------------------------------------------------------------------------------
- # 第三步: 檢測是否配置了ssh免密連接
- #------------------------------------------------------------------------------
- ssh -o ConnectTimeout=5 -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/null
- if [ $? != 0 ];then
- echo -e "\nSSH Connection failed $sip"
- echo -e "\nssh-keygen -t rsa -P ''"
- echo -e "\nssh-copy-id -p $sport $suser@$sip"
- exit 1
- else
- echo -e "\nSSH connection succeeded $sip"
- fi
- #------------------------------------------------------------------------------
- # 第四步: 運行JOB,并返回結(jié)果
- #------------------------------------------------------------------------------
- #echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip bash --login $ProgName $Para" #此處為打印執(zhí)行命令行,以便調(diào)試判斷是否真正有入口參數(shù)
- ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "bash --login $ProgName $Para"
- ret=$?
- exit $ret
復(fù)制代碼
2、在桌面軟件admin中進入"任務(wù)類型"功能中,設(shè)置ssh作業(yè)類型,如下圖所示: 3、在桌面軟件designer中設(shè)計 sh 作業(yè)如下代碼片段: - <!-- 按插件的規(guī)則編寫的流程設(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作業(yè)</jobdesc>
- </sh>
復(fù)制代碼 4、調(diào)試測試作業(yè)是否符合預(yù)期
|