在 Chef 的供应商 default.rb 中使用 File::read

Using File::read in a provider's default.rb in Chef

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

在 machine cookbook 的 provider 中,我有一个代码片段如下:

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。

我不断收到如下错误:

加载错误

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

有人知道如何在我的 LWRP 提供程序中使用 File::read 吗?

require '::File'

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

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

发生这种情况是因为 Chef 已经有一个文件资源。我们必须在 recipe.We 中使用 Ruby 文件 class 使用 ::File 来使用 Ruby 文件 class 来解决这个问题。例如:

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

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

其次,如果您调用 File.read,您将获得 Chef 的 File 而不是 ruby 的。您需要执行 ::File.read 才能使用 Ruby 的文件 class。