免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 54717 | 回复: 0
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-10-26 09:54 |只看该作者 |倒序浏览
本帖最后由 童话镇 于 2017-10-26 10:02 编辑

使用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. #!/bin/sh
  2. #------------------------------------------------------------------------------
  3. # 功能: ssh方式执行 远程脚本 驱动插件程序
  4. # 参数:
  5. # 1. progname 和sh作业类似,对应相应任务的progname属性,一般为脚本的全路径名称
  6. # 2. para 和sh作业类似,对应相应任务的para属性,一般为脚本的入口参数,格式为 para1 para2 ...
  7. # 3. exppara 对应相应任务的exppara属性,一般为脚本文件所在位置,在这里是远程连接IP地址和用户名
  8. # sip=172.22.1.1 ssh远程IP地址
  9. # sport=9527 ssh远程连接端口
  10. # suser=taskctl ssh远程用户
  11. # 返回值: 0 成功;1 失败
  12. #
  13. # 流程模式代码任务定义举例:
  14. # 默认2个输入参数的远程服务器上的sh脚本(如果多个,以此类推)
  15. # <ssh>
  16. # <name>job1</name>
  17. # <progname>/home/username/test.sh</progname>
  18. # <para>para1 para2</para>
  19. # <exppara>sip=172.22.1.1,[sport=22,]suser=taskctl</exppara>
  20. # </ssh>
  21. #
  22. #------------------------------------------------------------------------------

  23. if [ $# -ne 3 ]
  24. then
  25. echo "Param error !"
  26. echo "Usage: $0 progname para expara"
  27. exit 126
  28. fi

  29. #------------------------------------------------------------------------------
  30. # 第一步: 接收参数
  31. #------------------------------------------------------------------------------
  32. ProgName=$1
  33. Para=$2
  34. ExpPara=$3

  35. #------------------------------------------------------------------------------
  36. # 第二步: 解析 exppara
  37. #------------------------------------------------------------------------------
  38. function getValue(){
  39. if [ $# -ne 2 ]
  40. then
  41. echo "......."
  42. exit 1
  43. fi

  44. str=`echo $2|awk -v record=$1 'BEGIN {
  45. split(record,myarray,",");

  46. }
  47. END{
  48. for (i in myarray){
  49. if (myarray[i]~$1){
  50. if ( index(myarray[i],$1) == 1){
  51. print myarray[i];
  52. break;
  53. }
  54. }
  55. }
  56. }
  57. '`
  58. echo $str|awk -F"=" '{print $2}'
  59. }

  60. ExpPara=`echo $ExpPara` #此处为了去前后空格,以便判断是否真正有入口参数
  61. sip=`getValue $ExpPara sip`
  62. #sport=`getValue $ExpPara sport` #默认没有修改端口 传参数的时候也没有传 先屏蔽
  63. sport=22
  64. suser=`getValue $ExpPara suser`

  65. #------------------------------------------------------------------------------
  66. # 第三步: 检测是否配置了ssh免密连接
  67. #------------------------------------------------------------------------------
  68. ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/null
  69. if [ $? != 0 ];then
  70. echo -e "\n无法连接到$sip"
  71. echo -e "\n可以参照下面的语句尝试配置免密连接"
  72. echo -e "\nssh-keygen -t rsa -P ''"
  73. echo -e "\nssh-copy-id -p $sport $suser@$sip"
  74. exit 1
  75. else
  76. echo -e "\n$sip :ssh connect is OK"
  77. fi

  78. #------------------------------------------------------------------------------
  79. # 第四步: 运行JOB,并等待结果
  80. #------------------------------------------------------------------------------
  81. #echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip sh $ProgName $Para" #此处为打印执行命令行,以便调试判断是否真正有入口参数
  82. echo "================================================================================"
  83. ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "sh $ProgName $Para"
  84. ret=$?

  85. #------------------------------------------------------------------------------
  86. # 第五步: 插件返回
  87. #------------------------------------------------------------------------------
  88. echo "================================================================================"
  89. if [[ $ret == 0 ]]; then
  90. echo "Run job success !"
  91. exit 0
  92. else
  93. echo "Run job failed !"
  94. exit 1
  95. fi
复制代码

2、在桌面软件admin中进入"任务类型"功能中,设置ssh作业类型,如下图所示:
3、在桌面软件designer中设计 ssh 作业如下代码片段:
  1.   <!-- 按插件的规则编写的流程设置 -->
  2. <ssh>
  3. <name>MainModul_JobNode0</name>
  4. <progname>/home/cdchen/successjob.sh</progname>
  5. <para>para1 para2</para>
  6. <exppara>sip=47.94.203.124,suser=cdchen</exppara>
  7. <jobdesc>测试ssh作业</jobdesc>
  8. </ssh>
复制代码

4、调试测试作业是否符合预期

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP