2014-10-11 62 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

相關問題