Chef
如何檢查廚師數據包是否存在?
我想檢查是否有奴隸數據包。如果有一個,並且它包含數據,那麼我想為每個奴隸執行一個動作。
我有以下程式碼:
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
迭代器。)如果有興趣,您可以在此處查看數據包載入程式碼。