2016-10-04 37 views
1

我對廚師和我做的概念驗證嘗試使用它來構建Web服務器時相對陌生。由於這個問題超出範圍的原因,我將創建多個Apache實例,我可能想同時創建和「刪除」。同樣的問題可能真的適用於在單個Apache實例中創建和刪除虛擬主機配置。與廚師一起刪除配置項目

我目前正在使用chef-client基於此節點的已定義屬性創建所有的Apache實例。因此,例如,我可能具有定義Instance1Instance2Instance3的屬性。這一切在這一點上都工作得很好。實例目錄獲取創建像這樣:

/opt/local/apache/Instance1/stuff 
/opt/local/apache/Instance2/stuff 
/opt/local/apache/Instance3/stuff 

內容目錄和服務得到相同的instancename標識符創建。

問題來了,如果我想從該節點的屬性中刪除Instance3。我的廚師 - 客戶端運行將確保Instance1 & Instance2配置正確,但Instance3將繼續作爲廚師客戶現在一無所知。

我明白在一個理想的世界裏,你可能只是用新的配置啓動一臺新機器,而這個問題甚至都沒有擡頭。但是,我需要在無法重新配置的服務器上執行此操作(這只是在現有服務器上配置Apache的POC)。

我可以「刪除並重新創建」,但這聽起來對我來說不是冪等的。首先,文件時間戳會有所不同。即使沒有任何東西要做,廚師客戶做這些事情似乎也是錯誤的。

我自己想出了一個解決方案。在上面的示例中,我將在Ruby中獲取所有實例名稱的列表,包括/opt/local/apache/,迭代它們並刪除實例,如果它不是在屬性中定義的實例。我把它放在一個單獨的配方中,我稱之爲cleanup.rb。如果我在主要安裝配方之後運行此操作,並且沒有刪除配置,則它不會執行任何操作,因此似乎可以安全運行。

這很好,但它似乎hacky我擔心這可能是一種反模式。從概念上講,我是以正確的方式去做還是應該做一些與衆不同的事情?在你的食譜中使用自定義的Ruby代碼來做這樣的事情是否被認爲是正常和正確的?

回答

2

這裏的區別通常被表述爲(使用來自Facebook的Phil D的條款)作爲「託管對象」與「託管集合」。一個template資源匯聚地控制文件的狀態,但是您想要的是資源(實際的自定義資源或僅在概念上),即文件的所有所有的集合。你可以查看zap cookbook以獲得這個的半可重用實現,儘管這是基於挖掘資源集合而不是使用屬性。基於屬性的收集方法比烹飪書脆弱得多,但也更加有限。 Facebook的方法(即基於屬性)可能是他們的sysctl食譜https://github.com/facebook/chef-cookbooks/tree/master/cookbooks/fb_sysctl中最好的例子。

在這種情況下,聽起來像做一個dir glob並且與屬性數據進行比較可能是正確的方法,但是有時候可能會認爲這很「棘手」。就像如果你在那個glob之後發生的配方代碼中設置了屬性,它也不會知道它。這通常會導致不斷升級的特殊情況,但也許你可以保持更有序的事情,這將是好的:)

+0

謝謝coderanger。我檢查了Zap,我必須明確地'遍歷文件夾(Apache服務器目錄,內容目錄,systemd單元文件,並在需要的時候也切換運行的服務......)。我已經走了上面的方法。它似乎運作良好。感謝您的建議! – Tom17