2011-12-05 54 views
25

林不知道我瞭解廚師條件執行。瞭解廚師only_if not_if

我想基於PostgreSQL中

是否存在

一個數據庫,以便在這裏做一些有條件的執行是我的榜樣

execute "add_db" do 
    cwd "/tmp" 
    user "dbuser" 
    command "createdb -T template_postgis mydb" 
    not_if 'psql --list|grep mydb' 
end 

運行psql --list|grep mydb返回,如果該數據庫存在,你會想到什麼(帶有dbname條目的行),如果沒有則什麼也不做。

那麼如何纔不會評估呢?對或錯? 1還是0?如果成功,所有進程都返回0嗎?

任何意見,將不勝感激!

回答

21

我剛碰到這個問題。我的問題是not_if命令是作爲'root'運行的,而不是'dbuser'。如果您將其更改爲

not_if 'psql --list|grep mydb', :user => 'dbuser' 

那麼您可能會得到您正在查找的結果。

http://tickets.opscode.com/browse/CHEF-438

+5

我的情況有點不同,所以我會留下一個便箋給未來的用戶,在類似的情況下降落在這裏。假設你有一個屬性'node ['myattr'] = true',那麼如果你寫'only_if node ['myattr']',廚師會抱怨。我發現你需要用大括號括起來,即。 'only_if {node ['myattr']}' – apatrick

19

從命令行爲自己運行測試,並查看默認返回值(a.k.a.,「$?」)。你應該得到這樣的事情:

% psql --list|grep mydb 
    mydb-is-here 
    % echo $? 
    0 

如果你嘗試的東西是不存在的,你應該得到的東西是這樣的:

% psql --list|grep mydb-not-here 
    % echo $? 
    1 

什麼廚師將要看到的是數字值會被塞入$?,即「0」或「1」。換句話說,您爲「not_if」語法顯示的示例是正確的。

+0

怎麼樣,你給他們的如何計算出來上有自己的一個例子! –

+6

我通常在將grep調用放入配方時添加-q,這樣chef-client輸出不會與grep生成的任何匹配混雜在一起。 –