1

我需要将 res-client 包含到我的模块中才能使用 RestClient::Resource。

我在 Chef 配方(ruby_block 资源)中使用模块中的方法。

当我的 ruby​​_block 资源尝试在模块中运行该方法时,它会输出此错误:

错误:无法加载此类文件--rest-client

以下是我位于库文件夹中的模块:

module SecretServer
  def fetch_token
    payload = { :username => "***", :password => "***", :grant_type => "****"}
uri = ***
    request = RestClient::Resource.new(uri, :verify_ssl => false)
    post_request = request.post payload, :content_type => 'application/x-www-form-urlencoded'
    token = JSON.parse(post_request)["access_token"]
    return token
  end
end

require 'rest-client'
Chef::Recipe.include(SecretServer)
Chef::Resource.include(SecretServer)

以下是调用模块中函数的资源:

ruby_block 'parse data' do
  block do
   res = fetch_token
   puts res
   end 
end

这只是我食谱中的几个食谱之一。此配方在目标节点几乎准备好并且“捆绑安装”已在目标节点上运行后运行。

我还在目标节点中安装了rest-client。我在 ruby​​_block 资源之前尝试了以下每个资源:

chef_gem 'rest-client' do
  action :install
end

gem_package 'rest-client' do
  action :install
end

我的问题是如何包含“rest-client”并在厨师食谱中使用它?

4

1 回答 1

0

很久以前,HTTP 客户端和谐共处。然后,当 JSON gem 受到攻击时,一切都发生了变化。Chef::HTTP由于所有其他客户的流量太大而无法包括在内,因此只有厨师仍需包括在内。

我们不再包含该 gem,因此要使用它,您必须通过食谱 gem 依赖项或chef_gem资源自己安装它。但是对于简单的东西,你可以使用我们的Chef::HTTP::SimpleJSON客户端来代替:

Chef::HTTP::SimpleJson.new(uri).post("", args)["access_token"]

或类似的东西(具体取决于您是否必须使用表单编码或者服务器是否也使用 JSON)。

于 2018-06-24T02:43:16.233 回答