3

プログラムがナイフコマンドを読みやすい方法で実行できるように、ナイフの周りに素敵なラッパークラスを作成したいと思います。私は現在、シェフの宝石のknife.rbファイルを成功へのガイドとして使用しようとしています。ただし、エディターをオフにすると問題が発生します。次のコードを実行すると:

    require 'chef/knife'
    knife = Chef::Knife.new
    knife.run(['client', 'create', 'new-client'], '--disable-editing')

次のエラーが発生します。

    NoMethodError: undefined method `merge!' for "--disable-editing":String

これを成功させる方法について誰かアイデアがありますか? 私が必要とすることを行うライブラリがすでに存在する可能性はありますか?

4

4 に答える 4

6

だから私はこの問題を解決することができました。確かにハッシュが必要ですが、Mixlib::CLI クラスのサブセットにする必要があります。したがって、これはプログラムでナイフを介してクライアントを作成するために必要なコードです。

    class MyCLI
      include Mixlib::CLI
    end

    #Add the option for disable editing. If you look in knife help, it's --disable-editing
    MyCLI.option(:disable_editing, :long => "--disable-editing", :boolean => true)

    #instantiate knife object and add the disable-editing flag to it
    knife = Chef::Knife.new
    knife.options=MyCLI.options

    #set up client creation arguments and run
    args = ['client', 'create',  'new_client', '--disable-editing' ]  
    new_client = Chef::Knife.run(args, MyCLI.options)

これは最も洗練されたソリューションではありませんが、コマンド ライン経由で knife を使用するため、誰かがシステム コールを使用する必要がなくなります。

于 2013-05-30T19:12:04.510 に答える
1

次のソリューションを参照できます: http://lists.opscode.com/sympa/arc/chef/2011-08/msg00014.html

    require 'rubygems'
    require "chef"
    require "chef/knife/core/bootstrap_context"
    require 'chef/knife'
    require 'chef/knife/ssh'
    require 'net/ssh'
    require 'net/ssh/multi'
    require 'chef/knife/bootstrap'

    Chef::Config.from_file(File.expand_path('~/.chef/knife.rb'))
    kb = Chef::Knife::Bootstrap.new
    kb.name_args = "some.host"
    kb.config[:ssh_user] = "ubuntu"
    kb.config[:run_list] = "role[test]"
    kb.config[:use_sudo] = true
    kb.run
于 2013-09-29T08:00:35.857 に答える
0

ナイフは、「編集を無効にする」ハッシュを期待しているようです。これを試して:

knife.run(['client', 'create', 'new-client'], {:"disable-editing" => true})

このようなことが発生した場合は、Array/Hash api ドキュメントを参照して、エラーが吐き出されているメソッドを探してみてください。これにより、そのパラメーターに何を入力する必要があるかがわかります (ライブラリのドキュメントがなく、ソースが読みにくい場合)。

于 2013-05-30T07:18:12.340 に答える
0

ナイフ自体が解析を行います。

require 'chef/knife'
Chef::Knife.run(%w(bootstrap -N chef-n1 --sudo -x dan chef-n1.dan.lan))
于 2013-11-29T20:38:04.173 に答える