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

时间:2018-01-19 12:46:58

标签: rundeck

Rundeck如何使用多值执行远程命令?

允许值:folder1,folder2,folder3

多值:[x]是

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

/home/$folder1/run.sh

/home/$folder2/run.sh

/home/$folder3/run.sh

内联脚本还是别的什么?

2 个答案:

答案 0 :(得分:0)

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

下面是一个作业定义,展示了如何在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

答案 1 :(得分:0)

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

无论何时在Rundeck上使用多值选项,都可以选择在多个值之间提供定界符。无论选择哪种定界符,值都将转换为以下形式:

<value1><delimiter><value2><delimiter><value3><delimiter>...

如果您选择空格作为定界符,则这些值将转换为:

<value1> <value2> <value3> ...

脚本在将这些值识别为$ 1,$ 2,$ 3时出现问题...由于某种原因,所有内容都放入$ 1中-我猜Rundeck会将所有内容转换为:

'<value1> <value2> <value3> ...'

但是我对此不是100%肯定。

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

我认为有几种解决方法:

  • 如上文Alex-SF所述,在bash脚本中解决此问题。但是,您应该知道这并不像看起来那样简单。有关详细信息,请参见此stack overflow answer
  • 将bash脚本的功能转换为支持字符串拆分的其他语言(Perl,Python,Java等)的脚本。从Rundeck而不是bash脚本调用此新脚本。在某些情况下,这可能并不理想,因为bash脚本可能很复杂,并且转换起来可能不那么容易或不可能。
  • 使用以不同的语言(Perl,Python,Java等)编写的支持脚本,该脚本支持字符串的拆分。正确执行拆分后,从Rundeck调用此脚本,然后从此脚本调用bash脚本。 perl中的示例:
#!/usr/bin/perl
use strict;
use warnings;
use 5.16.3;

my $rundeck_input = $ARGV[0];
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脚本,如下所示:

'<value1>' '<value2>' '<value3>' ...

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