我正在运行Chef-client 11.12.8。我写了一个bash脚本包含以下行:Bash脚本在终端中正常工作,但在主厨中运行的脚本失败
aws s3 ls s3://my-bucket/prod-builds/
我只是使用awscli
工具来从S3存储文件的列表。当我在我的终端上手动运行此(Ubuntu的14.04 LTS),我得到这样的输出:
2014-10-10 21:27:50 42081271 aragorn-38d5afe23f1fa09a991c4cdbcb8461ed8709d15f.tgz
但是当厨师的客户端执行bash脚本,与此相同的线,采用printf
语句,我看到bash脚本仅输出:
2014-10-10
看起来命令输出中存在空格会让主厨客户感到困惑。
下面是从我的厨师食谱,执行bash脚本行:
execute "Download latest build" do
command "bash /path/to/my/script"
creates "/file/that/gets/created"
user "aragorn"
action :run
end
任何想法如何,我可以解决这个问题?
更新:按照要求,这里是我的脚本的一部分:
if [ -z "$gitCommitId" ]; then
# Take a filename like "aragorn-38d5afe23f1fa09a991c4cdbcb8461ed8709d15f.tgz" and extract the commitId from it
# Note that we take the topmost result
gitCommitId=$(aws s3 ls s3://my-bucket/prod-builds/ | sort -r | head -2 | sed -n '1!p' | awk -F "aragorn-" '{print $2}' | cut -d'.' -f 1)
fi
我确认这行代码执行(使用printf
语句输出),但奇怪的是,当我执行命令aws s3 ls s3://my-bucket/prod-builds/ | sort -r | head -2 | sed -n '1!p' | awk -F "aragorn-" '{print $2}' | cut -d'.' -f 1
直接在我的终端(或手动从我的终端运行脚本),它工作正常。但是,当从厨师跑gitCommitId
设置为无。
更新#2:我写了一个更简单的bash脚本来测试厨师和终端之间的差异。我确认Chef run会输出与调用aws s3 ls s3://my-bucket/prod-builds
不同的结果,而不是从终端调用它的结果。具体而言,它在S3终端中存在的一个文件夹中存在终端呼叫。我仍然无法解释这一点。
我清盘使用下面的线,给了我一致的结果,确保只有建立了展示,并没有文件夹:
aws s3 ls s3://my-bucket/prod-builds/ | grep aragorn | sort -r | head -1 | cut -d'-' -f 4 | cut -d'.' -f 1
特别感谢两个@TejayCardon和@StephenC指着我在正确的方向!
我们将需要更多信息。至于这是厨师的问题,它更可能是一个红宝石问题,但几乎可以肯定这是你的脚本的问题。如果我们有完整的脚本,我们可能会提供帮助。 – 2014-10-11 15:37:33
感谢您的建议。问题更新与脚本的相关部分。 – 2014-10-11 17:10:11
我会在你的'gitCommitId = .....'行之后加上'echo $ gitCommitId >>/tmp/testme'。查看放入文件的内容。我猜测(而且完全是)你正在发生一个变量范围问题。 – 2014-10-11 23:33:23