bootstrap stack servers

This commit is contained in:
amartynov 2015-08-12 12:24:48 +03:00
parent 9fece78466
commit d09ae85ab4
3 changed files with 53 additions and 50 deletions

View File

@ -49,46 +49,4 @@ module ServerCommands
end
end
def two_phase_bootstrap s, options, out
provider = ::Provider::ProviderFactory.get(s.provider)
mongo = ::Devops::Db.connector
out << "\n\nBootstrap...\n"
out.flush if out.respond_to?(:flush)
options[:run_list] = provider.run_list
status = bootstrap(s, options, out)
out.flush if out.respond_to?(:flush)
if status == 0
DevopsLogger.logger.info "Server with id '#{s.id}' is bootstraped"
if check_server(s)
out << "Server #{s.chef_node_name} is created"
else
out << roll_back(s, provider)
mongo.server_delete s.id
return 5
end
out << "\n"
out.flush if out.respond_to?(:flush)
run_list = s.run_list + provider.run_list
out << "\nRun list: #{run_list.inspect}"
# s.options[:run_list] += run_list
KnifeCommands.set_run_list(s.chef_node_name, run_list)
status = deploy_server(out, s, cert_path)
if status != 0
msg = "Failed on chef-client with project run list, server with id '#{s.id}'"
DevopsLogger.logger.error msg
out << "\n" + msg + "\n"
end
else
msg = "Failed while bootstraping server with id '#{s.id}'"
DevopsLogger.logger.error msg
out << "\n" + msg + "\n"
out << roll_back(s, provider)
mongo.server_delete s.id
end
return status
end
end

View File

@ -28,6 +28,7 @@ module Devops
@knife_instance = KnifeFactory.instance
@server = server
@out = out
@out.class.send(:define_method, :flush) { } unless @out.respond_to?(:flush)
end
def project= p
@ -44,7 +45,7 @@ module Devops
mongo = ::Devops::Db.connector
begin
@out << "Create server...\n"
@out.flush if @out.respond_to?(:flush)
@out.flush
@server.run_list = options["run_list"] || []
@server.chef_node_name = options["name"]
@ -61,7 +62,7 @@ module Devops
@out << "\nAfter create hooks...\n"
res[:after] = self.run_hook :after_create
@out.flush if @out.respond_to?(:flush)
@out.flush
DevopsLogger.logger.info "Server with parameters: #{@server.to_hash.inspect} is running"
unless options["without_bootstrap"]
@server.run_list = Set.new.merge(@project.run_list).merge(@deploy_env.run_list).merge(@server.run_list)
@ -69,7 +70,7 @@ module Devops
bootstrap_options = {
bootstrap_template: i.bootstrap_template
}
return bootstrap(bootstrap_options)
return two_phase_bootstrap(bootstrap_options)
else
return 0
end
@ -83,6 +84,8 @@ module Devops
end
def bootstrap options
@out << "\n\nBootstrap...\n"
@out.flush
k = Devops::Db.connector.key(@server.key)
cert_path = k.path
@out << "\nBefore bootstrap hooks...\n"
@ -102,7 +105,7 @@ module Devops
@out << "\nPublic IP is present\n"
end
@out << "\nWaiting for SSH..."
@out.flush if @out.respond_to?(:flush)
@out.flush
i = 0
cmd = "ssh -i #{cert_path} -q #{@server.remote_user}@#{ip} 'exit' 2>&1"
begin
@ -128,8 +131,10 @@ module Devops
@out << "After bootstrap hooks...\n"
res = self.run_hook(:after_bootstrap, @out)
@out << "Done\n"
DevopsLogger.logger.info "Server with id '#{@server.id}' is bootstraped"
else
end
@out.flush
r
end
@ -148,6 +153,42 @@ module Devops
bootstrap_options
end
def two_phase_bootstrap options
provider = @server.provider_instance
mongo = ::Devops::Db.connector
options[:run_list] = provider.run_list
status = bootstrap(options)
if status == 0
if check_server
@out << "Server #{@server.chef_node_name} is created"
else
@out << roll_back
mongo.server_delete @server.id
return 5
end
@out << "\n"
@out.flush
run_list = @server.run_list + provider.run_list
@out << "\nRun list: #{run_list.inspect}"
# s.options[:run_list] += run_list
@knife_instance.set_run_list(@server.chef_node_name, run_list)
status = deploy_server({})
if status != 0
msg = "Failed on chef-client with project run list, server with id '#{@server.id}'"
DevopsLogger.logger.error msg
@out << "\n" + msg + "\n"
end
else
msg = "Failed while bootstraping server with id '#{s.id}'"
DevopsLogger.logger.error msg
@out << "\n" + msg + "\n"
@out << roll_back
mongo.server_delete @server.id
end
return status
end
def check_server
@knife_instance.chef_node_list.include?(@server.chef_node_name) and @knife_instance.chef_client_list.include?(@server.chef_node_name)
end
@ -218,7 +259,7 @@ module Devops
File.open(File.join(dir, file), "w") do |f|
f.write json
end
@out.flush if @out.respond_to?(:flush)
@out.flush
cmd << " -j http://#{DevopsConfig.config[:address]}:#{DevopsConfig.config[:port]}/#{DevopsConfig.config[:url_prefix]}/v2.0/deploy/data/#{file}"
end
ip = if @server.public_ip.nil?
@ -227,7 +268,7 @@ module Devops
@out << "Public IP detected\n"
@server.public_ip
end
@out.flush if @out.respond_to?(:flush)
@out.flush
k = Devops::Db.connector.key(@server.key)
lline = @knife_instance.ssh_stream(@out, cmd, ip, @server.remote_user, k.path)
r = /Chef\sClient\sfinished/i

View File

@ -17,7 +17,10 @@ class StackBootstrapWorker < Worker
save_report(mongo, stack, file)
sync_bootstrap_proc.call(out, stack, mongo)
persist_stack_servers!(stack, provider)
servers = persist_stack_servers!(stack, provider)
statuses = servers.map do |s|
Devops::Executor::ServerExecutor.new(s, out).two_phase_bootstrap({})
end
end
end
@ -40,7 +43,7 @@ class StackBootstrapWorker < Worker
project = mongo.project(stack.project)
deploy_env = project.deploy_env(stack.deploy_env)
stack.resources.each do |resource|
stack.resources.map do |resource|
extended_info = stack.resource(resource.resource_name)
server_attrs = {
'provider' => provider.name,
@ -58,6 +61,7 @@ class StackBootstrapWorker < Worker
server = ::Devops::Model::Server.new(server_attrs)
mongo.server_insert(server)
server
end
end