2012-09-06 47 views
3

我們目前正在使用廚師來配置我們的服務器,並且我們希望我們的食譜/食譜本在mongo數據庫安裝並運行後自動添加一些數據。在mongodb啓動後獲得廚師執行mongodb腳本

這是我們開始遇到問題的地方。我們使用的執行資源來運行蒙戈這樣的腳本:

execute "install-mongodb-config" do 
    command "mongo #{node[:mongodb][:mongo_db_host]}/#{node[:mongodb][:mongo_db]} \"#{node[:mongodb][:mongo_add_config_script]}\"" 
    action :run 
end 

配方的這部分總是失敗不管我們盡力了!我不會詳細介紹我們在這裏嘗試的所有內容(除非我需要),但讓我只說我已經用盡了所有可能的訂閱並通知(我認爲)。

該問題源於我們使用mongodb :: 10gen_repo安裝mongodb的事實。當apt-get安裝包時,配方會退出,然後廚師繼續執行更多資源。

我們已經嘗試過在mongodb :: 10gen_repo之後直接執行上述資源,但似乎沒有mongodb可用,並且mongo shell無法連接並運行腳本。我們看到的錯誤是有點像這樣:

MongoDB shell version: 2.0.2 
Thu Sep 6 18:40:45 ReferenceError: setTimeout is not defined mongotest.js:2 
failed to load: mongoAddConfig.js 

沒有我們曾試圖已經能夠解決這個問題一個很好的廚師方式。我們使出的事情是替換爲下面的執行資源:

execute "install-mongodb-config" do 
    command "sleep 60; mongo #{node[:mongodb][:mongo_db_host]}/#{node[:mongodb][:mongo_db]} \"#{node[:mongodb][:mongo_add_config_script]}\"" 
    action :run 
end 

這只是讓60秒的命令睡眠運行蒙戈腳本之前。我知道這不是正確方式做到這一點,但它現在的作品。

任何人都可以提出正確的方法來做到這一點?我有一種感覺,我需要與創建mongodb廚師腳本並請求功能的人交談!

回答

0

所以,我對廚師的瞭解不多。但是你的問題似乎是,你試圖在服務器啓動後立即進行連接。因爲有一些開銷是進入選舉主,讓所有的服務器狀態的等

您可以重新創建無廚師,試圖打開

服務器的不是,當你給他們帶來了立即可用一個副本集並立即嘗試通過一個簡單的腳本連接到它。所以這不是廚師特定的。

不知道是否有辦法解決服務器啓動滯後問題,因爲與僅僅向節點添加節點相比,啓動主節點預計會是相對罕見的情況。

我看到的唯一可能的解決方案是更清晰的是爲配置中形成的連接添加更長的Timeout。你可以找到如何在這裏MongoDB的文檔中做到這一點:http://www.mongodb.org/display/DOCS/Connections

對你感興趣的標誌可能connectTimeoutMS

+0

好吧,似乎越來越接近我所需要的。我明白,使用connectTimeoutMS參數似乎是一個很好的方法,但我的問題是,我似乎無法連接在mongo交互式shell上使用該連接字符串方法。有任何想法嗎? –

+0

您可以顯示您運行的命令的輸出以及返回消息的內容嗎? – ChadsworthIII

1

是很重要的是相同的廚師運行也將安裝該軟件注入初始配置?構建食譜和食譜的'狡猾'方法是爲了防止ide in,以確保它們可以反覆運行而不會產生意想不到的結果。

在這種特殊情況下,我將第一個配方限制爲只安裝並啓動mongodb。如果看到mongodb已經在主機上運行,​​這個配方就什麼也不做。然後,我會有另一個配方,只有當它看到mongo已經安裝並運行時纔會運行。它會查詢mongodb是否已完成初始配置。如果是這樣,它會簡單地返回。如果沒有,它會運行你的配置例程。

通過這種方式,這些食譜可以隨時隨地在您的機器上運行。即使有人卸載了mongodb,廚師也會盡力確保它再次恢復原狀。

8

首先。刪除這個「睡60」。這可以由廚師完成:所有資源都有common attributes,「retries」和「retry_delay」是其中的一部分。所以,最簡單的方法是:

execute "install-mongodb-config" do 
    command "mongo some_command" 
    action :run 
    retries 6 
    retry_delay 10 
end 

如果你有超過2-3的地方,在那裏你必須運行蒙戈數據庫的一些命令,考慮創建LWRP,類似人在這個mongodb cookbook創建。 (特別檢查庫/ mongodb.rb文件)。您可以隱藏等待服務器響應的邏輯。

+0

爲此乾杯!我現在就試試看,但我有一種感覺,這將是我們所需要的。一旦我們嘗試過,我會接受這個答案。 –