2017-06-05 62 views
0

我正在使用this mongodb3 cookbook來安裝mongodb實例。廚師:mmake確定一項服務正在網絡上偵聽

我想,當服務開始執行腳本:

execute "Add Mongo Users" do 
    command "mongo #{host}:#{port} /tmp/mongo.setup.users.js" 
    subscribes :run, 'service[mongod]', :delayed 
end 

我得到這個錯誤:

==> Expected process to exit with [0], but received '1' 
==> ---- Begin output of mongo localhost:30158 /tmp/mongo.setup.users.js ---- 
==> STDOUT: MongoDB shell version v3.4.2 
==> connecting to: localhost:30158 
==> 2017-06-05T07:39:48.136+0000 W NETWORK [thread1] Failed to connect to 127.0.0.1:30158, in(checking soc 
ket for error after poll), reason: Connection refused 
==> 2017-06-05T07:39:48.136+0000 E QUERY [thread1] Error: couldn't connect to server localhost:30158, co 
nnection attempt failed : 

所以,你可以看到,服務尚未運行時命令執行(我收到網絡錯誤)。

我看了一下cookbook的存儲庫代碼。根據this peace of code,服務開始...

任何想法?

+0

可能是該命令有點太快。觸發服務啓動並不意味着它已準備好接受連接。 – StephenKing

+0

請注意您的主題中的拼寫。 – StephenKing

+0

也許更新'command'參數的值並預先輸入'ss -ntl;'先輸出監聽端口列表(檢查我是否正確)。 – StephenKing

回答

0

由於觸發服務的啓動並不意味着它立即準備好接受連接,您需要等待一段時間。

  • 一種常見的方法是添加一個額外的,硬編碼的延遲,例如

    command "sleep 3; mongo.." 
    

    下行:3秒可能就足夠了機器A,而不是在計算機B(所以把20秒,你已經解決了它的情況下,99.9% - 但並沒有成爲一個更好的程序員; - ))。

  • 更好的方法可以是例如出現在jenkins cookbook's helper library

    def wait_until_ready! 
        Timeout.timeout(timeout, JenkinsTimeout) do 
        begin 
         open(endpoint) 
        rescue SocketError, 
         Errno::ECONNREFUSED, 
         Errno::ECONNRESET, 
         Errno::ENETUNREACH, 
         Timeout::Error, 
         OpenURI::HTTPError => e 
         # If authentication has been enabled, the server will return an HTTP 
         # 403. This is "OK", since it means that the server is actually 
         # ready to accept requests. 
         return if e.message =~ /^403/ 
    
         Chef::Log.debug("Jenkins is not accepting requests - #{e.message}") 
         sleep(0.5) 
         retry 
        end 
        end 
    rescue JenkinsTimeout 
        raise JenkinsNotReady.new(endpoint, timeout) 
    end 
    

    此代碼反覆嘗試連接到詹金斯,直到其作品或達到超時。你應該能夠適應這個mongo(你可以調用這個命令並檢查它是否成功,或者直接連接到TCP端口,就像詹金斯代碼一樣)。

  • 之間的一種方法是使用Chef的retry參數:

    execute "Add Mongo Users" do 
        command "mongo #{host}:#{port} /tmp/mongo.setup.users.js" 
        retry 10 
        subscribes :run, 'service[mongod]', :delayed 
    end 
    

    我不能完全肯定,如果它會工作,爲mongo命令可能返回的故障很快,留下一點時間長達啓動服務(使之與萬能的sleep結合? )另外,根據你執行的命令,確保你不會造成負面的副作用(當它可以連接到服務,但在後面的步驟中失敗 - 結果是它再次運行。想想這裏的數據損壞和朋友)。

相關問題