2014-10-11 63 views
0

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

+0

我们将需要更多信息。至于这是厨师的问题,它更可能是一个红宝石问题,但几乎可以肯定这是你的脚本的问题。如果我们有完整的脚本,我们可能会提供帮助。 – 2014-10-11 15:37:33

+0

感谢您的建议。问题更新与脚本的相关部分。 – 2014-10-11 17:10:11

+1

我会在你的'gitCommitId = .....'行之后加上'echo $ gitCommitId >>/tmp/testme'。查看放入文件的内容。我猜测(而且完全是)你正在发生一个变量范围问题。 – 2014-10-11 23:33:23

回答

1

问题几乎可以肯定发生在脚本中,所以你需要弄清楚为什么脚本失败。

我想通过改变command属性开始

command "bash -x /path/to/my/script > /tmp/some_file 2>&1" 

看到bash正在执行什么命令。


似乎的空间在命令输出的存在混淆厨师客户端。

您在问题中向我们展示的任何内容都不支持该结论。 (这不太可能。execute资源将不会做任何事情的输出,除了(可能)记录它。)

我怀疑问题是与脚本,或它运行的命令之一....或假设它正在有关环境变量,当前目录等


UPDATE

所以,问题似乎是这条管线:

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

+0

感谢您的指导。我正在看看输出并注意到新事物。我认为你是对的,这不是厨师问题。我会在我的回答中发布一部分脚本。 – 2014-10-11 17:03:37

+0

再次感谢您的协助。这让我意识到我需要在自己的bash脚本中隔离这一行。根据我的更新#2,这仍然导致不同的结果,但现在我可以直接观察它们。我用原始脚本的一个小小的变化结束了。 – 2014-10-12 06:10:51

+0

我也想澄清一下,我正在使用AWS IAM角色,因此环境变量不是问题。最终,你的建议 - 改变突出显示的行 - 是正确的,所以我会标记你的答案是正确的。再次感谢! – 2014-10-12 06:13:19

相关问题