在Chef库中确定操作系统

时间:2018-11-09 13:43:38

标签: chef

在厨师库中无法访问os.windows?,而在食谱中则可以使用。我认为有可能通过在我的图书馆中添加require 'os'行使其可用而获得它。

require 'os'

module Project
  module Helper
    # ...
    def serviceExists?(service_name)
      if os.windows?
        puts 'Windows detected'
        # ... etc ...
      else
        raise 'Unimplemented..'
      end
    end
    # ...
  end
end    

这没有用。相反,我收到一个错误:

LoadError
---------
cannot load such file -- os

是否可以在不将os作为参数传递给方法的情况下访问os变量或确定库中的操作系统?我希望处理库中的操作系统复杂性,以使配方更整洁。

我正在通过以下not_if语句调用代码。

batch "Install #{service_name} service" do
  extend Project::Helper
  cwd install_home
  code <<-EOH
    @echo off
    call \"installSvc.cmd\"
  EOH
  not_if { serviceExists?(service_name) }
end

2 个答案:

答案 0 :(得分:0)

我稍微改变了方法,而不是尝试直接访问os对象,而是通过'mixin'使用node对象。

require 'win32/service'

module Project
  module Helper
    def serviceExists?(service_name)
      if node['os'].include?('windows')
        Win32::Service.exists?(service_name)
      else 
        raise 'Checking for services under this platform is not implemented yet.'
      end
    end
  end
end

Chef::Recipe.send(:include, Project::Helper)
Chef::Resource.send(:include, Project::Helper)

答案 1 :(得分:0)

使用ohai ...

使用gem_package资源进行安装,然后利用ohai:

require 'ohai'
ohai = Ohai::System.new
ohai.all_plugins
os = ohai[:kernel][:os].downcase