require "commands/knife_commands" require "commands/ssh" module DeployCommands def deploy_server_proc lambda do |out, s, mongo, tags, deploy_info| old_tags_str = nil new_tags_str = nil unless tags.empty? old_tags_str = KnifeCommands.tags_list(s.chef_node_name).join(" ") out << "Server tags: #{old_tags_str}\n" KnifeCommands.tags_delete(s.chef_node_name, old_tags_str) new_tags_str = tags.join(" ") out << "Server new tags: #{new_tags_str}\n" cmd = KnifeCommands.tags_create(s.chef_node_name, new_tags_str) unless cmd[1] m = "Error: Cannot add tags '#{new_tags_str}' to server '#{s.chef_node_name}'" DevopsLogger.logger.error(m) out << m + "\n" return 3 end DevopsLogger.logger.info("Set tags for '#{s.chef_node_name}': #{new_tags_str}") end k = mongo.key s.key r = deploy_server out, s, k.path, deploy_info unless tags.empty? out << "Restore tags\n" cmd = KnifeCommands.tags_delete(s.chef_node_name, new_tags_str) DevopsLogger.logger.info("Deleted tags for #{s.chef_node_name}: #{new_tags_str}") cmd = KnifeCommands.tags_create(s.chef_node_name, old_tags_str) DevopsLogger.logger.info("Set tags for #{s.chef_node_name}: #{old_tags_str}") end return r end end def deploy_server out, server, cert_path, deploy_info out << "Before deploy hooks...\n" res = server.run_hook(:before_deploy, out, deploy_info) out << "Done\n" out << "\nRun chef-client on '#{server.chef_node_name}'\n" cmd = "chef-client --no-color" if deploy_info["use_json_file"] deploy_info.delete["use_json_file"] out << "Build information:\n" json = JSON.pretty_generate(deploy_info) out << json out << "\n" file = "#{server.project}_#{server.deploy_env}_#{Time.new.to_i}" dir = DevopsConfig.config[:project_info_dir] File.open(File.join(dir, file), "w") do |f| f.write json end out.flush if out.respond_to?(:flush) cmd << " -j http://#{DevopsConfig.config[:address]}:#{DevopsConfig.config[:port]}/#{DevopsConfig.config[:url_prefix]}/v2.0/chef/client/data/#{file}" end ip = if server.public_ip.nil? server.private_ip else out << "Public IP detected\n" server.public_ip end out.flush if out.respond_to?(:flush) lline = KnifeCommands.ssh_stream(out, cmd, ip, server.remote_user, cert_path) r = /Chef\sClient\sfinished/i if lline[r].nil? 1 else out << "After deploy hooks...\n" res = server.run_hook(:after_deploy, out, deploy_info) out << "Done\n" 0 end end end