我正在运行Chef-client 11.12.8。我写了一个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
但是当chef-client使用printf
语句执行同一行的bash脚本时,我看到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和Terminal之间的差异。我确认Chef调用输出与调用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指出我正确的方向!
答案 0 :(得分:1)
问题几乎肯定存在于脚本中,因此您需要弄清楚脚本失败的原因。
我首先将command
属性更改为
command "bash -x /path/to/my/script > /tmp/some_file 2>&1"
准确查看bash
正在执行的命令。
似乎命令输出中存在空格让厨师 - 客户端感到困惑。
你在课题中向我们展示的任何内容都不支持这个结论。 (并且不太可能。execute
资源不会对输出做任何事情,除了(也许)记录它。)
我怀疑问题出在脚本或其运行的命令之一......或者它对环境变量,当前目录等的假设。
<强>更新强>
所以问题似乎出现在这个问题上:
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
我首先查看管道中的第一个命令是否在stdout上产生任何输出。 (我怀疑问题是aws
命令所需的环境变量尚未设置。)