首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rundeck ::执行具有多值的远程命令

Rundeck ::执行具有多值的远程命令
EN

Stack Overflow用户
提问于 2018-01-19 20:46:58
回答 2查看 1.4K关注 0票数 0

Rundeck如何执行具有多值的远程命令?

允许值: folder1、folder2、folder3

多值: xYes

需要在远程节点上执行远程命令:

/home/$folder1/run.sh

/home/$folder2/run.sh

/home/$folder3/run.sh

内联脚本或其他什么?

EN

回答 2

Stack Overflow用户

发布于 2018-01-24 01:37:08

是的,对于这种情况,内联脚本可能是最简单的。

下面是一个作业定义,展示了如何解析bash脚本中的多个值:

- description: 'execute script with an option using multiple values' executionEnabled: true loglevel: INFO name: SO-48341496 nodeFilterEditable: false options: - delimiter: ',' enforced: true multivalued: true name: folders required: true values: - folder1 - folder2 - folder3 scheduleEnabled: false sequence: commands: - args: ${option.folders} script: |- #!/usr/bin/env bash IFS=',' read -ra FOLDERS <<< "$1" for folder in "${FOLDERS[@]}" do echo "execute '/home/$folder/run.sh'" done keepgoing: false strategy: node-first

票数 0
EN

Stack Overflow用户

发布于 2018-12-28 17:02:10

我也想在这里分享我的答案。

每当您在Rundeck上使用多值选项时,您都可以选择在多个值之间提供分隔符。无论您选择哪种分隔符,这些值都将转换为以下格式:

代码语言:javascript
复制
<value1><delimiter><value2><delimiter><value3><delimiter>...

如果选择空格作为分隔符,则值将转换为:

代码语言:javascript
复制
<value1> <value2> <value3> ...

脚本无法将这些值识别为$1、$2、$3……出于某种原因,所有东西都放在$1中-我猜Rundeck会将所有东西转换为:

代码语言:javascript
复制
'<value1> <value2> <value3> ...'

但我对此并不是百分之百确定。

通常,解决方案是根据分隔符将此参数字符串拆分为单独的参数。但是,如果您的目标脚本是bash脚本(.sh),那么这可能很容易,也可能不容易。

在我看来,有几个解决方案:

正如Alex-SF上面所说的,

  • 在bash脚本本身中解决了这个问题。但是,您应该知道,这并不像看起来那么简单。参见此stack overflow answer将bash脚本的功能转换为另一种语言(Perl、Python、Java等)的脚本。支持字符串拆分的。从Rundeck调用这个新脚本,而不是bash脚本。在某些情况下,这可能是不可取的,因为bash脚本可能很复杂,并且转换它可能不那么容易或不可能。
  • 使用用不同语言(Perl、Python、Java等)编写的helper脚本。支持字符串拆分的。从Rundeck调用此脚本,并在正确执行拆分后从此脚本调用bash脚本。perl中的示例:

#!/usr/bin/perl使用严格;使用警告;使用5.16.3;my $rundeck_input = $ARGV;my @arguments = split(';',$rundeck_input);my $final_str="";my $i = 0;foreach my $ele ( @arguments ){ $final_str = $final_str。'\'‘。$ele。'\'';if ($i == ($#arguments)) {} else { $final_str = $final_str .“";} $i++;} system("/usr/bin/bash /home/rundeck/scripts/myscript.sh $final_str");

在上面的例子中,我使用了;作为分隔字符,因为它几乎不可能出现在某人在Rundeck上输入的任何参数中。perl脚本将参数字符串拆分为多个参数,并将其提供给bash脚本,如下所示:

代码语言:javascript
复制
'<value1>' '<value2>' '<value3>' ...

也许在system()调用中将它们作为单独的参数提供是更好的主意。当然,还有更复杂的方法可以做到这一点。这只是一个例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48341496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档