0

knife次のようにサブシェルで呼び出す(そして出力を解析する)ことでクックブック リストを取得できます。

cb = `knife cookbook list`

別のアプローチは、次のような ruby​​ クラス/モジュールを直接呼び出すことです。

require("chef")
require("chef/knife")
Chef::Config.from_file(knifePath) #knifePath is declared a priori
cookbooks = Chef::Knife.run(["cookbook", "list"])
puts(cookbooks) # => nil

Chef::Knife.run()変数を呼び出して画面に出力されたデータを保存するにはどうすればよいですか?

4

1 に答える 1

0

これについては外を見る必要がありますknife。Knife はChef::CookbookLoader(スタックを下に) デリゲートするため、クックブック ローダーを直接使用できます。

require 'chef/config'
require 'chef/cookbook_loader'

Chef::Config.from_file(path)
cookbooks = Chef::CookbookLoader.new(Chef::Config.cookbook_path).map(&:cookbook_name)

たとえば、knife-sporkこのパターンを使用してクックブックをロードします。

名前だけでなく、実際のクックブック オブジェクトを取得することに注意してください。もう少し軽量なものが必要な場合は、それぞれを反復処理して、次cookbook_pathのものを探すことができmetadata.rbます。

# https://gist.github.com/fnichol/4343327
class MetadataChopper < Hash 
  def self.extract(metadata_file)
    mc = new(File.expand_path(metadata_file))
    [mc[:name], mc[:version]]
  end

  def initialize(metadata_file)
    eval(IO.read(metadata_file), nil, metadata_file)
  end

  def method_missing(meth, *args, &block)
    self[meth] = args.first
  end
end

require 'chef/config'
cookbook_paths = Chef::Config.from_file(path).cookbook_path

cookbooks = Dir[*cookbook_paths.map { |p| "#{p}/**/metadata.rb" }].collect do |metadata|
  MetadataChopper.new(metadata)[:name] || File.basename(File.dirname(cookbook))
end
于 2013-08-08T18:57:56.963 に答える