2013-03-04 20 views
0

我试图通过capistrano出于某种原因部署,我越来越:无法将“散”到“字符串”

/Users/mysite/.rvm/gems/[email protected]/gems/json-1.4.6/lib/json/common.rb:146:in `initialize': can't convert Hash into String (TypeError) 
    from /Users/mysite/.rvm/gems/[email protected]/gems/json-1.4.6/lib/json/common.rb:146:in `new' 
    from /Users/mysite/.rvm/gems/[email protected]/gems/json-1.4.6/lib/json/common.rb:146:in `parse' 
    from /Users/mysite/.rvm/gems/[email protected]/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 

第二行是行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 

回答

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

相当于

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

按照错误,我要说的是,你的功能role_from_chef不接受String作为第三个参数。但是,如果没有粘贴role_from_chef函数,我无法确定。

总之这是你应调查什么:按照第三个参数里面role_from_chef,看看它作为一个字符串某处

+0

我更新的'role_from_chef'做什么码 – Shamoon 2013-03-05 16:35:53