如何检查厨师数据包是否存在?

Mer*_*hts 6 chef

我想检查是否有奴隶数据包。如果有一个,并且它包含数据,那么我想为每个从站执行一个操作。

我有以下代码:

slaves = data_bag('slaves')

if slaves.length > 0
   for slave in slaves
      ...xyz..
   end
end
Run Code Online (Sandbox Code Playgroud)

这有效,除非数据包尚不存在。如何检查数据包是否存在?还是我这样做完全错误?

Mik*_*ler 7

当您尝试访问尚不存在的数据包时,Chef 将引发异常,具体取决于您正在运行的 Chef Client 类型。

例如,在 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..
Run Code Online (Sandbox Code Playgroud)

但是,这将返回一个空数组,因为您正在使用它进行.length比较。

如果目标是如果有任何奴隶,然后对它们进行迭代,我会做这样的事情:

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

if slaves
  slaves.each do |slave|
    ...xyz..
Run Code Online (Sandbox Code Playgroud)

nil在数据包不存在的情况下返回 a ,而不是数组,如果数据包存在,但为空,则正确返回,xyz如果不存在,则仅执行步骤nil

(我还将 更改for slave in slaves为更惯用的 Ruby.each迭代器。)

如果有兴趣,您可以在此处查看数据包加载程序代码。

  • 专业提示:避免将所有内容放入开始救援块中。 (2认同)