2

我正在开发一个与 Chef 交互的程序。我想阅读元数据以查找依赖项以及名称等其他信息,但不应该将 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_list 超过一行时,读取角色的 run_list 时出现同样的问题。当然,如果我能把它翻译成 json 文件会好得多。有没有办法做到这一点?

4

2 回答 2

1

它使用 rubyinstance_eval​​ 方法来解析metadata.rbfrom cookbook,所以关键是metadata.rb. 中定义Chef::Cookbook::Metadata

它是提供多种方法的 ruby​​ 类。因此,您可以定制自己的程序以使用除了属性访问器 like namemaintainerlikedepends()和之外的最少方法集recipe(name, description)

于 2013-10-21T01:33:31.777 回答
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 gem(这是我的第二个 Ruby 程序,所以你会更好地知道这是如何完成的)

于 2015-03-16T22:26:25.340 回答