bash -x /var/lib/cloud/instance/user-data.txt运行,但是来自terraform的用户数据给出错误

时间:2019-04-25 10:10:20

标签: bash jenkins terraform user-data

我正在尝试使用terraform运行脚本。用户数据的内容如下:

.
.
cat <<EOH | java -jar ./jenkins-cli.jar -s $JENKINS_URL -auth admin:$PASSWORD create-credentials-by-xml system::system::jenkins _
<com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey plugin="ssh-credentials@1.16">
  <scope>GLOBAL</scope>
  <id>$CRED_ID</id>
  <description>$SLAVE_IP pem file</description>
  <username>ec2-user</username>
  <privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey\$DirectEntryPrivateKeySource">
    <privateKey>${worker_pem}</privateKey>
  </privateKeySource>
</com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
EOH
.
.

当它作为用户数据的一部分执行时,会发出错误No such command create-credentials-by-xml

但是当我登录到实例并执行bash -x /var/lib/cloud/instance/user-data.txt时,它会按预期运行。

任何人都可以告诉原因是什么以及如何解决?谢谢!

我尝试过#cloudhook并分隔行,但没有用。

1 个答案:

答案 0 :(得分:2)

回答我的问题:

问题出在哪里: 问题不在于bash,而是jenkins-cli.jar本身。

错误消息显示No such command create-credentials-by-xml,这让我觉得这是bash错误,但实际上一直是jar文件错误。

原因: 在执行用户数据而不是执行bash时失败的原因是,它无法在短时间内加载插件的配置。

解决方案: 从给定的原因来看,很明显它需要时间,所以我给它sleep 25来确认它是否有效,是的,它确实有效,但这不是理想的解决方案。

优化的解决方案: 为了更好,我在执行任何jar命令之前列出了plugins,如果列表为空,请重新运行commnd

# Creating CMD utility for jenkins-cli commands
jenkins_cmd="java -jar /opt/jenkins-cli.jar -s $JENKINS_URL -auth admin:$PASSWORD"

# Waiting for Jenkins to load all plugins
while (( 1 )); do
  count=$($jenkins_cmd list-plugins 2>/dev/null | wc -l)
  ret=$?

  echo "count [$count] ret [$ret]"

  if (( $count > 0 )); then
      break
  fi

  sleep 30
done