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

Ruby 从metadata.rb生成metadata.json而不使用Chef或knife,ruby,json,metadata,chef-infra,Ruby,Json,Metadata,Chef Infra,我正在制作一个与厨师互动的程序。我想阅读元数据,查找依赖项和其他信息,如名称,但不支持将Chef安装在运行它的机器上。我认为最好的方法是将metadata.rb翻译成metadata.json并阅读它 事实上,我正在逐行阅读每一个基于算法的食谱,但我认为像Chef那样使用元数据更正确。此外,它还有以下表达式的问题: node['apache']['default_modules'].each do |mod| recipe_name = mod =~ /^mod_/ ? mod : "mod

我正在制作一个与厨师互动的程序。我想阅读元数据,查找依赖项和其他信息,如名称,但不支持将Chef安装在运行它的机器上。我认为最好的方法是将metadata.rb翻译成metadata.json并阅读它

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

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

当角色的run_列表有多行时,读取该列表时出现相同的问题。当然,如果我能把它翻译成json文件,效果会更好。有什么方法可以做到这一点吗?

它使用ruby
instance\u eval
方法解析cookbook中的
元数据.rb
,因此关键是
元数据.rb的规范。在中定义


ruby类提供了许多方法。因此,除了属性访问器(如
name
mainter
dependens()
recipe(name,description)
,)之外,您还可以跟踪自己的程序,使用最少的方法集。只要安装了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程序,因此您将更好地了解这是如何完成的)

请不要忘记将答案标记为正确的!:)