3

我想围绕刀创建一个很好的包装类,以允许程序以可读的方式运行刀命令。我目前正在尝试使用 chef gem 中的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 类的一个子集。因此,这是通过 Knife 以编程方式创建客户端所需的代码:

    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)

这不是最优雅的解决方案,但它确实通过命令行使用了刀,并且使某人不必使用系统调用来使用它。

于 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 正在期待一个你有“禁用编辑”的哈希。试试这个:

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 回答