从metadata.rb生成metadata.json而不使用Chef或knife

时间:2012-05-25 18:24:26

标签: ruby json metadata chef

我正在开发一个与Chef互动的程序。我想阅读寻找依赖关系的元数据,也许还有其他信息,比如名字,但是不要在运行它的机器上安装Chef。我认为最好的方法是将metadata.rb翻译成metadata.json并阅读它。

实际上,我正在使用基于on this的算法逐行阅读每个食谱,但我认为使用像Chef这样的元数据更为正确。此外,它有这样的表达式的问题:

node['apache']['default_modules'].each do |mod|
  recipe_name = mod =~ /^mod_/ ? mod : "mod_#{mod}"
  include_recipe "apache2::#{recipe_name}"
end

读取角色的run_list时有同一个问题,因为它有多行。当然,如果我可以将它翻译成json文件,那可能会好得多。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

它使用ruby instance_eval方法解析cookbook中的metadata.rb,因此关键是metadata.rb的规范。在Chef::Cookbook::Metadata中定义。

它是ruby类,提供了许多方法。因此,您可以自行编制程序,以使用除namemaintainer之类的属性访问器之外的最少方法集,例如depends()recipe(name, description)

答案 1 :(得分:0)

只安装了Chef客户端,这个脚本就可以了。将其放在与扩展食谱相同的文件夹中。

require 'chef/cookbook/metadata'
require 'json'

contents = File.read('metadata.rb')
c = Chef::Cookbook::Metadata.new
c.instance_eval(contents)
File.write('metadata.json', c.to_json)

或者我想你可以在Ruby安装上只安装Chef gems(这是我的第二个Ruby程序,所以你会更好地了解它是如何完成的)