我正在开发一个与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文件,那可能会好得多。有没有办法做到这一点?
答案 0 :(得分:1)
它使用ruby instance_eval
方法解析cookbook中的metadata.rb
,因此关键是metadata.rb
的规范。在Chef::Cookbook::Metadata
中定义。
它是ruby类,提供了许多方法。因此,您可以自行编制程序,以使用除name
,maintainer
之类的属性访问器之外的最少方法集,例如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程序,所以你会更好地了解它是如何完成的)