bash -x /var/lib/cloud/instance/user-data.txt 运行但来自 terraform 的用户数据给出错误
bash -x /var/lib/cloud/instance/user-data.txt runs but user-data from terraform gives error
我正在尝试 运行 使用 terraform 的脚本。 user-data的内容如下:
.
.
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
时,它会按预期 运行s。
谁能告诉我这是什么原因以及如何解决?谢谢!
我也尝试过#cloudhook 和分隔线,但没有用。
回答我的问题:
问题出在哪里:
问题不在于 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
我正在尝试 运行 使用 terraform 的脚本。 user-data的内容如下:
.
.
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
时,它会按预期 运行s。
谁能告诉我这是什么原因以及如何解决?谢谢!
我也尝试过#cloudhook 和分隔线,但没有用。
回答我的问题:
问题出在哪里: 问题不在于 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