在Chef中使用File :: read在提供程序的default.rb中

时间:2015-04-30 17:08:21

标签: ruby chef chef-recipe lwrp

我正在尝试创建一个LWRP,它将调用自身内部定义的资源。我的食谱结构如下:

enter image description here

在机器食谱的提供者中,我有一个代码片段如下:

require 'chef/provisioning'  # driver for creating machines
require '::File'

    def get_environment_json
      @@environment_template = JSON.parse(File::read(new_resource.template_path + "environment.json"))
      return @@environment_template
    end

代码只是尝试读取json文件而我正在使用File :: read。

我一直收到如下错误:

LoadError

无法加载此类文件 - :: File

有谁知道如何在我的LWRP提供商中使用File :: read?

3 个答案:

答案 0 :(得分:6)

好的,所以前两个答案都是对的。你有两个问题。 首先,您不能要求::File,因为它已经是Ruby的一部分。这是导致错误的原因。

其次,如果你致电File.read,你将获得Chef File而不是红宝石。您需要使用::File.read来使用Ruby的File类。

答案 1 :(得分:0)

require '::File'

不正确并导致LoadError。删除此行。你不需要它。 File是Ruby核心的一部分,不需要require d。

为了进一步说明,require的字符串参数表示要加载的库的文件名。因此,它应该看起来像require "file"require "rack/utils"

答案 2 :(得分:0)

这是因为Chef已经有了一个文件资源。我们必须在配方中使用Ruby File类。我们使用:: File来使用Ruby File类来解决这个问题。例如:

execute 'apt-get-update' do
  command 'apt-get update'
  ignore_failure true
  only_if { apt_installed? }
  not_if { ::File.exist?('/var/lib/apt/periodic/update-success-stamp') }
end

来源:https://docs.chef.io/ruby.html#ruby-class