2017-06-06 40 views
0

在一個配方中,我有一個rubyblock,最終獲得我想要重新啓動的服務的端口。將變量從一個廚師食譜發送到另一個,以觸發資源塊

單獨的食譜工作正常,我現在試圖將兩者結合在一起。

我似乎無法將變量傳遞給試圖遵循自定義資源示例的其他配方。

,其取得上述端口我的默認食譜是:

Chef::Log.info("Port: #{port}") 

Chef::Resource::Notification.new("stop-solr_#{port}", :run, self) 

我試圖觸發使用通知發件人名稱爲「停止solr_'portNumber」的資源塊。

我的其他配方如下所示,具有起動/停止服務宗旨

solrCore = "solr_#{port}" 

#define the service - does nothing 
service solrCore do 
    action :nothing 
end 

#do something that triggers 
execute "start-solr_#{port}" do 
    Chef::Log.info('triggers start') 
    action :nothing 
    notifies :start, run_context.resource_collection.find(:service => "#{solrCore}") 
end 

execute "stop-solr_#{port}" do 
    # some stuff 
    # on success... 
    Chef::Log.info('triggers restart') 
    notifies :stop, run_context.resource_collection.find(:service => "#{solrCore}"), :immediately 
    notifies :run, "execute[start-solr_#{port}]" 
end 

我的主要問題(我認爲)是變量solrCore使用「口」,這我似乎無法獲得。

任何人都可以幫助我做什麼,爲了得到這個工作嗎?

在此先感謝。

+0

這就是'node.run_state'是。看到這裏的文檔:https://docs.chef.io/recipes.html#node-run-state – Tensibai

+0

@Tensibai - 謝謝你,我會看看 – null

回答

1

默認情況下,Ruby中的變量是本地的。你將不得不使用全局變量來共享文件之間的狀態,或者是一個真正的Ruby全局變量($foo),或者使用我們公開給全部食譜的全局node.run_state散列。

這就是說:可變全局變量數十年來一直是CS的一個陳詞濫調。這樣的代碼非常脆弱,難以調試。我會考慮將這兩個食譜轉換爲自定義資源,並使用相同的輸入端口從相同的配方中調用它們。

+0

我不是一個全能的粉絲, ) 我看不出還有什麼要做,雖然廚師知識有限...... 決定端口的食譜是一隻野獸;反過來收集,設置和構建對象 - 這是否適合自定義資源? – null

+0

null,你可以絕對把它變成一個自定義資源。基本上可以在配方中完成的任何事情都可以成爲自定義資源。語法可能需要更改一些特定的調用,因爲您將處於不同的環境中,但我相信您可以弄明白。主要的區別是你必須爲每個你希望能夠傳入的變量提供一個屬性,在這個例子中是'port'。您也可以從自定義資源中調用其他資源。 – JackChance

0

在第一個配方中,您可以將信息保存在節點中。

樣品:

node.normal['A']['B']['C']="completed" 
node.save 

,並在第二個配方你可以從該節點的信息。

status=node.normal['A']['B']['C'] 

,並根據所取回的價值,你可以採取行動

+0

切勿在Chef代碼中使用node.save。請刪除此答案或對其進行修改,這是不安全的。 – coderanger