2014-08-29 2 views
0

Я хочу получить рецепты, которые содержит поваренная книга, через chef-server-api. Ниже приводится код, я использую для получения списка поваренной книги, отдельные детали поваренной книги через API:Получение списка рецептов через сервер шеф-повара api

require 'rubygems' 
require 'chef/config' 
require 'chef/log' 
require 'chef/rest' 
require 'chef/cookbook_version' 

client_name = "admin" 
signing_key_filename="c:/chef-repo/.chef/admin.pem" 
server_url = "https://10.132.17.244:443" 

rest = Chef::REST.new(server_url, client_name, signing_key_filename) 
cookbooks = rest.get_rest("/cookbooks?all_versions") 

cookbooks.keys.each do |name| 
cookbook_versions = rest.get_rest("/cookbooks/#{name}") 
print "#{name}\n" 

cookbook_versions[name]["versions"].each do |cv| 

version = cv["version"] 
cookbook = rest.get_rest("/cookbooks/#{name}/#{version}") 
print "\t#{cookbook}\n" 
#parsed = JSON[cookbook] 

end 
end 

Проблема я столкнулся, чтобы получить список рецептов из «поваренной книги» объекта. Я попытался разобрать его на рубиновый хэш, а затем прочитать, но бесполезно. Если я непосредственно распечатаю переменную «cookbook», результат будет похож на скриншот enter image description here

Я не могу понять, как интерпретировать вывод, который я получаю, ударив по конечной точке '/ cookbooks/NAMEW/VERSION' и получить рецепты в отдельных поваренных книгах.

+0

Таким образом, вы получите объект, Хава посмотрите на это определение объекта [здесь] (https://github.com/opscode/chef/blob /master/lib/chef/cookbook_version.rb) Итерация над 'cookbook ['recipe_filenames']' должна быть тем, что вы ищете. – Tensibai

+0

Итерация над cookbook ['recipe_filenames'] дает ошибку. «undefined method» [] '" – tortuga

+0

В этом cas я начал бы печатать cookbook.methods или cookbook.inspect, я могу ошибаться в методе доступа здесь – Tensibai

ответ

1

При использовании драгоценного камня шеф-повара он автоматически декодирует некоторые ответы на объекты Ruby для вас. Вы можете либо use the object directly (в частности, вы хотите #recipe_filenames, а затем разобрать их на формат cookbook_name::recipe_name), или вы можете использовать лучший клиент API, такой как Chef-API или PyChef.

0

Нужно использовать рубиновый раствор? В следующем примере используется jq для фильтрации результирующего JSON, возвращаемой ножом:

$ knife cookbook show apache2 2.0.0 recipes -Fj | jq '.[]|.name' 
"mod_cgi.rb" 
"mod_proxy_http.rb" 
"mod_proxy_html.rb" 
"mod_access_compat.rb" 
"mod_authz_dbd.rb" 
"mod_proxy_express.rb" 
.. 
..