Windows、Ec2ServerCreate - 当来自 Rails 应用程序的 运行 刀时无法设置 JSON 属性

Windows, Ec2ServerCreate - Cannot set JSON attributes when running knife from Rails application

我能够在 Rails 应用程序 (Chef::Knife::Ec2ServerCreate.new()) 上从 Ruby 在 AWS 启动新实例。工作正常,直到我尝试设置 JSON 属性。当我从命令行设置它们并调用 knife.bat 时,它起作用了。 查看 ec2_server_create 表明命令行选项 --json-attributes 映射到符号 :json_attributes.我尝试使用以下代码设置它:

Chef::Config[:knife][:json_attributes] = "{'NodeName' : 'Node001'}"

我得到错误:TypeError(没有将 Symbol 隐式转换为 Integer): 一旦我评论了这一行,实例就会被创建,并在 Chef 服务器上注册,并且食谱是 运行ning。 关于如何设置第一个 chef-client 运行 的 json 属性有什么建议吗? PS 示例代码显示属性的常量值,但实际值将动态创建。 错误信息和发生错误的代码行:

/chef/knife/core/bootstrap_context.rb:188:in `[]=': no implicit conversion of Symbol into Integer (TypeError)

查看源代码您可以找到:

def first_boot
  (@config[:first_boot_attributes] || {}).tap do |attributes|
    if @config[:policy_name] && @config[:policy_group]
       attributes[:policy_name] = @config[:policy_name]
       attributes[:policy_group] = @config[:policy_group]
    else
      attributes[:run_list] = @run_list #THIS LINE CAUSES EXCEPTION
    end
    attributes.merge!(:tags => @config[:tags]) if @config[:tags] && !@config[:tags].empty?
   end
end

我设置了运行列表。

问题是 json_attributes 需要是哈希,而不是字符串。失败的不是 @run_list,而是 "{'NodeName' : 'Node001'}"[:run_list],当您在现场看到它时可能会更清楚一些。