Bash脚本在终端中工作正常,但在Chef中运行的相同脚本失败

时间:2014-10-11 06:32:18

标签: linux bash chef

我正在运行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指出我正确的方向!

1 个答案:

答案 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命令所需的环境变量尚未设置。)