Rundeck如何执行具有多值的远程命令?
允许值: folder1、folder2、folder3
多值: xYes
需要在远程节点上执行远程命令:
/home/$folder1/run.sh
/home/$folder2/run.sh
/home/$folder3/run.sh
内联脚本或其他什么?
发布于 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
发布于 2018-12-28 17:02:10
我也想在这里分享我的答案。
每当您在Rundeck上使用多值选项时,您都可以选择在多个值之间提供分隔符。无论您选择哪种分隔符,这些值都将转换为以下格式:
<value1><delimiter><value2><delimiter><value3><delimiter>...如果选择空格作为分隔符,则值将转换为:
<value1> <value2> <value3> ...脚本无法将这些值识别为$1、$2、$3……出于某种原因,所有东西都放在$1中-我猜Rundeck会将所有东西转换为:
'<value1> <value2> <value3> ...'但我对此并不是百分之百确定。
通常,解决方案是根据分隔符将此参数字符串拆分为单独的参数。但是,如果您的目标脚本是bash脚本(.sh),那么这可能很容易,也可能不容易。
在我看来,有几个解决方案:
正如Alex-SF上面所说的,
#!/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脚本,如下所示:
'<value1>' '<value2>' '<value3>' ...也许在system()调用中将它们作为单独的参数提供是更好的主意。当然,还有更复杂的方法可以做到这一点。这只是一个例子。
https://stackoverflow.com/questions/48341496
复制相似问题