Chef

如何檢查廚師數據包是否存在?

  • April 16, 2015

我想檢查是否有奴隸數據包。如果有一個,並且它包含數據,那麼我想為每個奴隸執行一個動作。

我有以下程式碼:

slaves = data_bag('slaves')

if slaves.length > 0
  for slave in slaves
     ...xyz..
  end
end

這有效,除非數據包尚不存在。如何檢查數據包是否存在?還是我這樣做完全錯了?

當您嘗試訪問尚不存在的數據包時,Chef 將引發異常,具體取決於您正在執行的 Chef 客戶端類型。

例如,在 Chef Solo 中,您將引發一個名為 的異常Chef::Exceptions::InvalidDataBagPath,而對於 Chef Client(針對 Chef 伺服器,Net::HTTPServerException將引發異常,因為在對伺服器的 API 呼叫中找不到該對象。

因此,您可以將設置包裝在 Ruby 塊中,如下所示:

slaves =  begin
           data_bag('slaves')
         rescue Net::HTTPServerException, Chef::Exceptions::InvalidDataBagPath
           [] # empty array for length comparison
         end

if slaves.length > 0
 for slave in slaves
   ...xyz..

但是,這會返回一個空數組,因為您正在使用它進行.length比較。

如果目標是如果有任何奴隸,然後迭代它們,我會做這樣的事情:

slaves =  begin
           data_bag('slaves')
         rescue Net::HTTPServerException, Chef::Exceptions::InvalidDataBagPath
           nil
         end

if slaves
 slaves.each do |slave|
   ...xyz..

nil如果數據包不存在,則返回 a ,而不是 Array,如果數據包存在,這將是正確的返回,但為空,xyz如果不存在則僅執行步驟nil

(我還將 更改for slave in slaves為更慣用的 Ruby.each迭代器。)

如果有興趣,您可以在此處查看數據包載入程式碼。

引用自:https://serverfault.com/questions/683155