0

を介してデプロイしようとしてcapistranoいますが、何らかの理由で次のようになっています。

/Users/mysite/.rvm/gems/ruby-1.9.2-p318@fbadapter/gems/json-1.4.6/lib/json/common.rb:146:in `initialize': can't convert Hash into String (TypeError)
  from /Users/mysite/.rvm/gems/ruby-1.9.2-p318@fbadapter/gems/json-1.4.6/lib/json/common.rb:146:in `new'
  from /Users/mysite/.rvm/gems/ruby-1.9.2-p318@fbadapter/gems/json-1.4.6/lib/json/common.rb:146:in `parse'
  from /Users/mysite/.rvm/gems/ruby-1.9.2-p318@fbadapter/gems/chef-capistrano-0.1.0/lib/chef/capistrano.rb:27:in `role_from_chef'
  from ./config/deploy.rb:35:in `block in load'

私の問題の行は次のconfig/deploy.rbとおりです。

after 'multistage:ensure' do
 role_from_chef :db, 'app', :limit => 1, :primary => true # perform db operations on one of the app servers
 role_from_chef :web, 'app'
 role_from_chef :app
 role_from_chef :queue
 role_from_chef :cron
end

2行目は35行目です

更新されたコード

  def role_from_chef(cap_role, *roles)
    %w(chef_host chef_port chef_scheme chef_client_name chef_key_file).each do |value|
      abort "Please set :#{value}" unless exists?(value.to_sym)
    end

    Spice.setup do |s|
      s.host = fetch(:chef_host)
      s.port = fetch(:chef_port)
      s.scheme = fetch(:chef_scheme)
      s.client_name = fetch(:chef_client_name)
      s.key_file = fetch(:chef_key_file)
    end
    Spice.connect!

    options = roles.extract_options!
    roles = [cap_role.to_s] if roles.empty?
    search_roles = fetch(:chef_search_roles) + roles
    query = search_roles.map{|r| "role:#{r}"}.join(" AND ")

    response = Spice.connection.get("/search/node?q=#{URI.encode(query)}")        
    response_object = JSON.parse(response)
    raise response_object['error'].join(' ') if response_object.has_key?('error')

    nodes = response_object['rows']
    hosts = nodes.select{|n| n['ec2']}.map{|n| n['ec2']['public_hostname']}

    if limit = options.delete(:limit)
      hosts = hosts.slice(0, limit)
    end

    hosts.each do |host|
      node = nodes.detect { |n| n['ec2']['public_hostname'] == host }
      puts "#{cap_role}: #{node['ec2']['instance_id']} - #{node['ec2']['public_hostname']}"
    end

    hosts << options
    role cap_role, *hosts
  end
4

1 に答える 1

1
role_from_chef :db, 'app', :limit => 1, :primary => true

と同等です

role_from_chef( :db, 'app', { :limit => 1, :primary => true } )

エラーによると、関数role_from_chefは3番目のパラメーターとして文字列を受け入れます。しかし、role_from_chef関数を貼り付けないと、確信が持てません。

とにかく、それを調査する必要があります。role_from_chef内の3番目のパラメーターに従って、どこかで文字列として使用されているかどうかを確認してください。

于 2013-03-05T00:23:14.980 に答える