2014-09-22 140 views
9

我有以下(簡化)配方稱爲java,當然要安裝Java。編譯時間和運行時間在廚師食譜

文件食譜/ default.rb

include_recipe "install_java" 

文件食譜/ install_java.rb

# Install RPM from yum repo via yum_install library function 
yum_install("jdk1.7.0_51") 

# List the directories in /usr/java 
jdk_dir = `ls -ld /usr/java/jdk1.* | sort | tail -1` 
if jdk_dir.empty? 
    raise "Missing JDK installation" 
end 

當運行由配方 「廚師客戶-o配方【JAVA]」

Synchronizing Cookbooks: 
    - java 
Compiling Cookbooks... 
ls: /usr/java/jdk1.*: No such file or directory 

============================================== ============================= 配方編譯錯誤或者在/var/chef/cache/cookbooks/java/recipes/default.rb ================================ ===========================================

RuntimeError 
------------ 
Missing JDK installation 

看起來yum_install()函數沒有被調用。但是,如果我將install_java.rb配方修改爲只有

# Install RPM from yum repo via yum_install library function 
yum_install("jdk1.7.0_51") 

它有效。

這是爲什麼?

回答

32

好吧,所以廚師跑兩次。

「編譯時間」

我喜歡叫這個收集階段
在這一點上,你的食譜中的實際ruby代碼被運行。這意味着將在此時執行任何類似於 jdk_dir = ls -ld /usr/java/jdk1.* | sort | tail -1 的陳述。但是,創建Chef資源yum_install("jdk1.7.0_51")的ruby代碼僅創建資源。這些由配方代碼創建的資源隨後會添加到主廚resource_collection,但資源操作尚未運行。

「收斂時間」

我把這個分辨率相。 此時 - 所有食譜已經運行(創建資源,但不運行操作)之後 - 我們現在準備好實際運行資源操作。廚師從resource_collection中的第一個資源開始,並對該資源運行指定的操作。它通過收集工作,根據需要調用通知,直到所有資源的操作都已運行。然後你的跑步完成。

你的具體情況

所以,你的情況,您要訪問的目錄中收集階段,但你沒有創建目錄,直到分辨率相。如果您想在解決階段中運行Ruby代碼,您可以在ruby_block資源中執行此操作。例如:

ruby_block 'verify java is there' do 
    block do 
    if jdk_dir.empty? 
     raise "Missing JDK installation, reinstall" 
    end 
    end 
end 

如果分辨率在此ruby_block資源放在您的yum_install(這大概應該是yum_package)資源,那麼它會被放置在collection_phase安裝資源之後後,再執行相位(即,運行時間)的廚師運行。

+0

只是我正在尋找的解釋!謝謝! – Paul 2015-09-07 12:16:53

+0

這應該被接受爲答案。 – Chiranjib 2017-09-05 10:28:28

6

所以我不能完全確定,但很可能yum_install是一種資源(或某種形式的幫助,創建一個資源)。食譜有效地運行在兩次。首先執行每個文件(字面上通過Ruby的exec)。當在DSL中創建資源時,它會「編譯」到內存資源對象,並將其添加到全局資源集合(所有資源的大數組)中。一旦所有配方文件編譯完成後,Chef會循環訪問資源集合並根據請求運行每個資源的操作(如果需要,可以發送中間通知)。

因此,總而言之這意味着yum_install行可能實際上並沒有做任何事情,現在它不會將對象推入數組。您可以將其他代碼封裝在ruby_code區塊中以延遲它,直到收斂時間。

+0

謝謝你。用ruby_block包裝剩下的代碼就行了。 – 2014-09-22 19:03:04