Требовать rest-client для модуля в Chef

Мне нужно включить res-client в мой модуль, чтобы использовать RestClient::Resource.

Я использую метод в модуле в рецепте шеф-повара (ресурс 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" и использовать его в рецептах Chef?

1 ответ

Давным-давно HTTP-клиенты жили вместе в гармонии. Затем все изменилось, когда гем JSON атаковал. Только Chef::HTTP все еще должен был быть включен в Chef, поскольку все остальные клиенты находились под слишком большим потоком, чтобы включать.

Мы больше не включаем этот драгоценный камень, поэтому, чтобы использовать его, вам нужно будет установить его самостоятельно либо через зависимость от драгоценного камня из поваренной книги, либо chef_gem ресурс. Но для простых вещей вы можете просто использовать наш Chef::HTTP::SimpleJSON вместо клиента:

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

Или что-то в этом роде (особенности зависят от того, нужно ли использовать кодирование формы или сервер также говорит на языке JSON).

Другие вопросы по тегам