Jenkinsfile中的变量插值

时间:2020-04-07 09:07:55

标签: linux jenkins groovy jenkins-pipeline ksh

在以下脚本中,我尝试在Jenkinsfile中插入i的值。

host='10.0.0.1 10.0.0.2'
sh 'for i in $host; do echo \"$i\" ; \
sshpass -p root ssh -o StrictHostKeyChecking=no root@${i} \'echo "* * * * * script/test.ksh 6432 \${i} abc xyz" > /var/spool/cron/root\'; \
done'

它正在控制台上打印最后的$ {i},但是它正确地插入了第一个$ {i}。我在哪里做错了?

它在jenkins控制台上打印像下面的

sshpass -p root ssh -o StrictHostKeyChecking=no root@10.0.0.1 'echo " * * * * * scripts/test.ksh 6432 ${i} abc xyz" > /var/spool/cron/root'

1 个答案:

答案 0 :(得分:0)

您尝试遍历包含值的字符串,而不是遍历值数组。

普通外壳(即/bin/sh)可能不是解决问题的最简单方法。您也不需要利用awk,perl,python或其他任何工具。只需使用KornShell(/bin/ksh/usr/bin/ksh,具体取决于您的UNIX环境)。而且您似乎确实在创建KornShell脚本(test.ksh)。

我将在macOS上使用/bin/ksh

现在旋转字符串非常简单:

typeset host='10.0.0.1 10.0.0.2'
typeset -a hosts=( $host )

现在hosts是一系列可以迭代的项目。您可以通过输入以下内容来验证这一点:

print -v hosts

将输出:

(
    10.0.0.1
    10.0.0.2
)

您可以按如下所示简化上面的代码,但是我建议保持上面的语法:

host='10.0.0.1 10.0.0.2'
hosts=( $host )

所以现在我们知道了如何访问字符串中的每个主机。这回答了您最初的问题。但是,我建议您进行进一步的修改,以避免引用和问题。

为此,我建议使用单独的KornShell脚本,说update-remote-crontabs.ksh并以以下方式调用它:

/path/to/update-remote-crontabs.ksh $host

脚本的内容为:

#! /bin/ksh

typeset user=root
typeset host

for host in $@; do
    sshpass -p $user ssh -o StrictHostKeyChecking=no  $user@$host \
    $'echo \'* * * * * script/test.ksh 6432 '$host' abc xyz\' > /var/spool/cron/user'
done

请注意,使用$'定义ANSI C字符串,使用'$host'host变量连接到我们的文字字符串中。

还请注意,我们不必将原始字符串转换为数组,因为在调用脚本时,解释器会自动完成此操作:-)

据我所知,最后的评论> /var/spool/cron/root是一种不好的做法。您可能应该喜欢以下类似的东西:

(crontab -l; echo '* * * * * script/test.ksh 6432 '$host' abc xyz') | crontab -

快乐的KornShell!

相关问题