免费注册 查看新帖 |

Chinaunix

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

taskctl命令行类(sh、exe、python新增scp)插件升级扩展 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-11-10 14:20 |只看该作者 |倒序浏览
本帖最后由 ffw_880106 于 2017-11-10 14:33 编辑

转载自 : http://www.taskctl.com/forum/detail_129.html
    上次写了一个帖子 TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)http://www.taskctl.com/forum/detail_122.html 。写完后发现,其实在原本的sh作业类型上改造一下就可以了,同时延伸到以前是用command执行方式的作业类型,都可以适当扩展,命令行类插件升级20171110.rar就是 sh、exe、python的插件和新增拷贝一些小文件的scp作业类型。插件中主要使用的ssh免密及其相关的几个参数和bash的几种模式,这个只是一个基础版本,如果有特殊的需求基于上面的插件改造一下就可以了。下面是摘抄了原网页上写法写的一个sh脚本的扩展,其他几个类似。
使用TASKCTL调度服务时,如果需要跨用户或者跨服务器调度可以通过安装taskctl的代理来实现,但有时需要执行作业的服务器上仅仅只有几个脚本或者一两个可执行程序,此时再部署代理,就显得有点得不偿失了。我们知道TASKCTL支持任意作业类型的扩展,所以我们是不是可以考虑通过SSH远程连接来扩展这些插件,使其能执行这些远程少量的脚本程序。
    下面是通过扩展TASKCTL用ssh连接来支持调度远程作业的步骤,一方面解决一些朋友迫切的调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。
    下面编写的过程参照 http://www.taskctl.com/forum/detail_33.html
    1、首先在服务端的$TASKCTLDIR/src/plugin/sh/shell/目录中新增cprunsh.sh作业插件,实际上就是一个shell程序,代码如下:
  1. #!/bin/sh
  2. #------------------------------------------------------------------------------
  3. #        功能: [ssh方式]执行[远程]Shell脚本驱动插件程序
  4. #
  5. #        更新日志:20171030 由最开始的集成转换为插件,增强扩展原只能执行当前用户可读的 shell 脚本,
  6. #        通过ssh协议,在免密的情况下可以执行本机不同用户和非本机的其他用户
  7. #
  8. #        参数:
  9. #        1. progname 脚本的全路径名称
  10. #        2. para 脚本的入口参数,格式为 para1 para2 ...
  11. #        3. exppara 对应相应脚本的exppara属性,为脚本文件所在用户,当该参数为空时,默认为当前用户,如果不是当前用户时,为远程连接IP地址和用户名
  12. #        sip=172.22.1.1 ssh远程IP地址
  13. #        sport=9527 ssh远程连接端口
  14. #        suser=taskctl ssh远程用户
  15. #        返回值: 脚本执行后的实际返回值
  16. #       
  17. #        流程模式代码任务定义举例:
  18. #        1、默认2个输入参数的安装用户可执行的服务器上的sh脚本(如果参数多个,以此类推)
  19. #        <sh>
  20. #        <name>job1</name>
  21. #        <progname>/home/taskctl/test.sh</progname>
  22. #        <para>para1 para2</para>
  23. #        </sh>
  24. #        2、在同一台服务器上的其他用户可执行,当前节点安装用户不可执行sh脚本,当前用户和目标用户做了ssh免密(如果参数多个,以此类推)
  25. #        <sh>
  26. #        <name>job1</name>
  27. #        <progname>/home/username/test.sh</progname>
  28. #        <para>para1 para2</para>
  29. #        <exppara>[sport=22,]suser=taskctl</exppara>
  30. #        </sh>
  31. #        3、不同服务器上,但都是shell作业,当前节点安装用户已经做了ssh免密(如果参数多个,以此类推)
  32. #        <sh>
  33. #        <name>job1</name>
  34. #        <progname>/home/username/test.sh</progname>
  35. #        <para>para1 para2</para>
  36. #        <exppara>sip=172.22.1.1,[sport=22,]suser=taskctl</exppara>
  37. #        </sh>
  38. #
  39. #------------------------------------------------------------------------------

  40. if [ $# -ne 3 ]
  41. then
  42. echo "Param error !"
  43. echo "Usage: $0 progname para expara"
  44. exit 126
  45. fi

  46. #------------------------------------------------------------------------------
  47. # 第一步: 接收参数
  48. #------------------------------------------------------------------------------
  49. ProgName=$1
  50. Para=$2
  51. ExpPara=$3

  52. #------------------------------------------------------------------------------
  53. # 第二步: 解析 exppara
  54. #------------------------------------------------------------------------------
  55. function getValue(){
  56. if [ $# -ne 2 ]
  57. then
  58. echo "......."
  59. exit 1
  60. fi

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

  63. }
  64. END{
  65. for (i in myarray){
  66. if (myarray[i]~$1){
  67. if ( index(myarray[i],$1) == 1){
  68. print myarray[i];
  69. break;
  70. }
  71. }
  72. }
  73. }
  74. '`
  75. echo $str|awk -F"=" '{print $2}'
  76. }

  77. ExpPara=`echo $ExpPara` #此处为了去前后空格,以便判断是否真正有入口参数
  78. #通过判断 exppara 是否为空,决定是直接执行sh还是走ssh通道
  79. #直接执行
  80. if [ ! -n "$ExpPara" ]
  81. then
  82. sh $ProgName $Para
  83. ret=$?
  84. exit $ret
  85. fi
  86. #走ssh通道
  87. sip=`getValue $ExpPara sip`
  88. #通过判断 sip 是否为空,决定是直接执行本机其他用户还是远程服务器上的sh脚本
  89. if [ ! -n "$sip" ]
  90. then
  91. sip=localhost
  92. fi
  93. #sport=`getValue $ExpPara sport` #默认没有修改端口 传参数的时候也没有传 先屏蔽
  94. sport=22
  95. suser=`getValue $ExpPara suser`

  96. #------------------------------------------------------------------------------
  97. # 第三步: 检测是否配置了ssh免密连接
  98. #------------------------------------------------------------------------------
  99. ssh -o ConnectTimeout=5 -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/null
  100. if [ $? != 0 ];then
  101. echo -e "\nSSH Connection failed $sip"
  102. echo -e "\nssh-keygen -t rsa -P ''"
  103. echo -e "\nssh-copy-id -p $sport $suser@$sip"
  104. exit 1
  105. else
  106. echo -e "\nSSH connection succeeded $sip"
  107. fi

  108. #------------------------------------------------------------------------------
  109. # 第四步: 运行JOB,并返回结果
  110. #------------------------------------------------------------------------------
  111. #echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip bash --login $ProgName $Para" #此处为打印执行命令行,以便调试判断是否真正有入口参数
  112. ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "bash --login $ProgName $Para"
  113. ret=$?
  114. exit $ret
复制代码

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


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP