2014-08-29 107 views
1

我們使用Boxen/Puppet自動構建Mac開發筆記本電腦,一步是安裝rabbitmq,聲明虛擬主機並添加用戶。木偶:只能通過require調用創建一個exec

但是它需要更多的時間讓rabbitmq準備虛擬主機聲明並添加新用戶,所以我們總是必須運行boxen兩次。

這裏是我的邏輯

察看RabbitMQ的是通過運行以下命令 rabbitmqadmin list vhost 準備好,但我們需要安裝並運行了,所以我說 require => Service['dev.rabbitmq'] 如果上面的命令工作,然後我們知道兔子正在接受連接的RabbitMQ。

在這裏,讓我們把所有東西放在一起。

exec { "Wait for rabbitmq": 
    command => "rabbitmqadmin list vhosts", 
    tries => 2, 
    try_sleep => 30, 
    require => Service['dev.rabbitmq'] 
    } 
    dev::rabbitmq::vhost { '/clearvh': 
    require => Exec['Wait for rabbitmq'] 
    } 
    dev::rabbitmq::user { 'clear': password => 'password' } 
    dev::rabbitmq::permission { [ 'guest', 'clear' ]: vhost => '/clearvh' } 
} 

行之有效,但Exec {"Wait for rabbit"}獲取調用每次,即使dev::rabbit::vhost不是。如果僅由dev::rabbitmq::vhost調用它將是想法。

這可能嗎?

感謝

+1

你可以用'refreshonly => true'和'subscribe'服務來嘗試,而不是僅僅需要它。但我不確定重試語義是否適用於「刷新」操作,而不是您現在正在執行的實際同步操作。如果沒有,您可以通過執行內部執行失敗/睡眠/重試循環的包裝腳本來解決此問題。 – 2014-08-29 08:52:33

+0

'refreshonly' /'subscribe'也有一個好處,就是如果Puppet不必(重新)啓動服務,那麼Exec就不會運行。但我也不知道Puppet是否會在「執行」刷新上重試。我猜它會做,但我不知道。你能否使用shell提供程序和exec「sleep 30; rabbitmqadmin list vhosts」? – 2014-08-29 15:55:36

回答

0

你去對exec走錯了路。您需要有一個條件來阻止exec運行。

exec { "Wait for rabbitmq": 
    command => "rabbitmqadmin list vhosts", 
    tries => 2, 
    try_sleep => 30, 
    unless => 'some command which returns "0" that tells you rabbitmq is already ready for vhosts', 
    require => Service['dev.rabbitmq'] 

}

除非你告訴你的高管不是出於某種原因或其他運行時,它會一直運行。

查看Puppet Type Reference for the exec resource並尋找unlessonlyif

至於我最初忽略的這個問題的標題。 require表示傳遞給require的資源必須在調用資源之前應用。因此,在這種情況下

Service['dev.rabbitmq']

Exec['Wait for rabbitmq']之前應用。

require不能確保exec資源不會運行。

+0

讓我們忘記我做了什麼,在聲明虛擬主機之前,您會做什麼來檢查rabbitmq是否準備好(接受連接)?'onlyif'不是我想要的,因爲如果失敗了,我的虛擬主機聲明就會被忽略。 – 2014-08-29 04:57:39

+0

你可能會保留執行。使用'try'和'try_sleep'參數給你的exec。我要用它更新我的答案。如果它仍然不是你想要的,我們可以進一步探索。 – ptierno 2014-08-31 03:09:40

+0

heh。無視這一點。沒有意識到我已經嘗試過'try_sleep' :) – ptierno 2014-08-31 03:10:35