【问题标题】:Determining the Operating System in a Chef Library确定 Chef 库中的操作系统
【发布时间】:2019-04-13 02:11:46
【问题描述】:

在厨师库中无法访问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

【问题讨论】:

标签: chef-infra


【解决方案1】:

我稍微改变了方法,而不是尝试直接访问 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)

【讨论】:

    【解决方案2】:

    使用ohai...

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 2013-01-02
      • 1970-01-01
      • 2010-12-21
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      相关资源
      最近更新 更多