veronic 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/veronic +3 -0
- data/lib/config/config.rb +2 -2
- data/lib/providers/chefserver/chefserver.rb +1 -1
- data/lib/providers/chefserver/instance.rb +57 -40
- data/lib/providers/ec2/ec2.rb +3 -1
- data/lib/providers/ec2/instance.rb +34 -15
- data/lib/providers/route53/record.rb +3 -2
- data/lib/veronic.rb +40 -12
- data/veronic.gemspec +1 -1
- data/veronic.yml +2 -1
- metadata +1 -1
data/bin/veronic
CHANGED
@@ -25,6 +25,7 @@ opt_parser = OptionParser.new do |opt|
|
|
25
25
|
opt.separator " stop: stop box"
|
26
26
|
opt.separator " start: start box"
|
27
27
|
opt.separator " list: list boxes"
|
28
|
+
opt.separator " status: status boxes"
|
28
29
|
opt.separator ""
|
29
30
|
opt.separator "Options"
|
30
31
|
|
@@ -116,6 +117,8 @@ when "start"
|
|
116
117
|
Veronic::Deployer.new(options).start
|
117
118
|
when "list"
|
118
119
|
Veronic::Deployer.new(options).instances_list
|
120
|
+
when "status"
|
121
|
+
puts Veronic::Deployer.new(options).status
|
119
122
|
else
|
120
123
|
puts opt_parser
|
121
124
|
end
|
data/lib/config/config.rb
CHANGED
@@ -26,10 +26,10 @@ module Veronic
|
|
26
26
|
@ssl_version = options[:ssl_version] || config_from_file['ssl_version']
|
27
27
|
@identity_file = options[:identity_file] || config_from_file['identity_file']
|
28
28
|
@branch = options[:branch] || config_from_file['branch']
|
29
|
-
@environment = options[:environment] || config_from_file['environment']
|
29
|
+
@environment = options[:environment] || config_from_file['environment']
|
30
30
|
@ssh_user = options[:ssh_user] || config_from_file['ssh_user'] || 'ubuntu'
|
31
31
|
@ssh_port = options[:ssh_port] || config_from_file['ssh_port'] || 22
|
32
|
-
@role = options[:role] || config_from_file['role']
|
32
|
+
@role = options[:role] || config_from_file['role']
|
33
33
|
@flavor = options[:flavor] || config_from_file['flavor'] || 'm1.medium'
|
34
34
|
@security_groups = [options[:security_groups]] || [config_from_file['security_groups']]
|
35
35
|
@deploy_cmd = options[:deploy_cmd] || config_from_file['deploy_cmd'] || 'sudo chef-client'
|
@@ -22,7 +22,7 @@ module Provider
|
|
22
22
|
Chef::Config[:validation_key] = config[:validation_key]
|
23
23
|
Chef::Config[:chef_server_url] = config[:chef_server_url]
|
24
24
|
Chef::Config[:ssl_version] = config[:ssl_version]
|
25
|
-
Chef::Config[:log_level] = :
|
25
|
+
Chef::Config[:log_level] = config[:verbose]
|
26
26
|
@knife = knife
|
27
27
|
end
|
28
28
|
|
@@ -6,6 +6,8 @@ require 'chef/knife/ssh'
|
|
6
6
|
require 'chef/knife/node_run_list_add'
|
7
7
|
require 'chef/knife/core/bootstrap_context'
|
8
8
|
require 'chef/knife/ec2_base'
|
9
|
+
require 'chef/node'
|
10
|
+
|
9
11
|
require_relative 'rest_request'
|
10
12
|
|
11
13
|
module Provider
|
@@ -27,6 +29,7 @@ module Provider
|
|
27
29
|
@flavor = config[:flavor]
|
28
30
|
@region = config[:region]
|
29
31
|
@availability_zone = config[:availability_zone]
|
32
|
+
@verbose = config[:verbose]
|
30
33
|
Chef::Config[:knife][:image] = @image
|
31
34
|
Chef::Config[:knife][:aws_ssh_key_id] = @aws_ssh_key_id
|
32
35
|
Chef::Config[:knife][:aws_access_key_id] = @access_key_id
|
@@ -39,56 +42,61 @@ module Provider
|
|
39
42
|
def create
|
40
43
|
puts "Creating ec2 server #{@name} ..."
|
41
44
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
puts
|
56
|
-
|
45
|
+
node = Chef::Knife::Ec2ServerCreate.new()
|
46
|
+
|
47
|
+
node.config[:run_list] = [@roles]
|
48
|
+
node.config[:image] = @image
|
49
|
+
node.config[:flavor] = @flavor
|
50
|
+
node.config[:security_groups] = @security_groups
|
51
|
+
node.config[:ssh_user] = @ssh_user
|
52
|
+
node.config[:ssh_port] = @ssh_port
|
53
|
+
node.config[:chef_node_name] = @name
|
54
|
+
node.config[:identity_file] = @identity_file
|
55
|
+
node.config[:environment] = @environment
|
56
|
+
node.config[:log_level] = @verbose
|
57
|
+
|
58
|
+
puts node.config
|
59
|
+
node.run
|
57
60
|
end
|
58
61
|
|
59
|
-
def bootstrap
|
62
|
+
def bootstrap(recursive_count=0)
|
60
63
|
puts "Bootstrapping ec2 server #{@name} ..."
|
61
64
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
puts
|
75
|
-
|
65
|
+
node = Chef::Knife::Ec2ServerCreate.new()
|
66
|
+
|
67
|
+
node.config[:image] = @image
|
68
|
+
node.config[:flavor] = @flavor
|
69
|
+
node.config[:security_groups] = @security_groups
|
70
|
+
node.config[:ssh_user] = @ssh_user
|
71
|
+
node.config[:ssh_port] = @ssh_port
|
72
|
+
node.config[:chef_node_name] = @name
|
73
|
+
node.config[:identity_file] = @identity_file
|
74
|
+
node.config[:environment] = @environment
|
75
|
+
node.config[:log_level] = @verbose
|
76
|
+
|
77
|
+
puts node.config
|
78
|
+
begin
|
79
|
+
node.run
|
80
|
+
rescue
|
81
|
+
self.destroy([node.server.id])
|
82
|
+
self.bootstrap(recursive_count+=1) if recursive_count < 3
|
83
|
+
end
|
76
84
|
end
|
77
85
|
|
78
86
|
def destroy(instance_ids = [])
|
79
87
|
puts "Deleting ec2 server #{@name} ..."
|
80
88
|
|
81
|
-
|
89
|
+
node = Chef::Knife::Ec2ServerDelete.new()
|
82
90
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
91
|
+
node.config[:purge] = true
|
92
|
+
node.config[:chef_node_name] = @name
|
93
|
+
node.config[:yes] = true
|
94
|
+
node.name_args = instance_ids
|
87
95
|
|
88
|
-
puts
|
89
|
-
|
90
|
-
|
91
|
-
|
96
|
+
puts node.config
|
97
|
+
node.run
|
98
|
+
node.destroy_item(Chef::Node, @name, "node")
|
99
|
+
node.destroy_item(Chef::ApiClient, @name, "client")
|
92
100
|
end
|
93
101
|
|
94
102
|
def set_role
|
@@ -97,13 +105,22 @@ module Provider
|
|
97
105
|
node.run
|
98
106
|
end
|
99
107
|
|
108
|
+
def set_environment
|
109
|
+
node = Chef::Node.new.tap do |n|
|
110
|
+
n.name( @name )
|
111
|
+
n.chef_environment( @environment )
|
112
|
+
end
|
113
|
+
node.save
|
114
|
+
puts "Environment: #{@environment}"
|
115
|
+
end
|
116
|
+
|
100
117
|
def ssh(query, cmd_line, manual)
|
101
118
|
knife_ssh = Chef::Knife::Ssh.new()
|
102
119
|
|
103
120
|
knife_ssh.config[:manual] = manual
|
104
121
|
knife_ssh.config[:ssh_user] = @ssh_user
|
105
122
|
knife_ssh.config[:identity_file] = @identity_file
|
106
|
-
knife_ssh.config[:log_level] =
|
123
|
+
knife_ssh.config[:log_level] = @verbose
|
107
124
|
|
108
125
|
knife_ssh.name_args = [query, cmd_line]
|
109
126
|
sys_status = knife_ssh.run
|
data/lib/providers/ec2/ec2.rb
CHANGED
@@ -5,32 +5,45 @@ module Provider
|
|
5
5
|
def initialize(ec2, name)
|
6
6
|
@ec2 = ec2
|
7
7
|
@name = name
|
8
|
-
|
8
|
+
@instance = instance
|
9
9
|
end
|
10
10
|
|
11
11
|
def stop
|
12
12
|
print "Stopping instance #{@name}..."
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
if self.exist?
|
14
|
+
@instance.stop
|
15
|
+
@i = 0
|
16
|
+
while self.status != :stopped
|
17
|
+
if @i > 120
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
print "." ; sleep 3 ; @i += 1
|
21
|
+
end
|
17
22
|
end
|
18
23
|
puts "\nInstance #{@name} is stopped"
|
19
24
|
end
|
20
25
|
|
21
26
|
def start
|
22
27
|
print "Starting instance #{@name}..."
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
28
|
+
if self.exist?
|
29
|
+
while self.status == :stopping
|
30
|
+
sleep 2
|
31
|
+
end
|
32
|
+
@instance.start
|
33
|
+
@i = 0
|
34
|
+
while self.status != :running
|
35
|
+
if @i > 120
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
print "." ; sleep 3 ; @i += 1
|
39
|
+
end
|
27
40
|
end
|
28
41
|
puts "\nInstance #{@name} is started"
|
29
42
|
end
|
30
43
|
|
31
44
|
def exist?
|
32
45
|
puts "Checking for ec2 server #{@name} ..."
|
33
|
-
if @ec2.instances.any? {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated}
|
46
|
+
if AWS.memoize do @ec2.instances.any? {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated} end
|
34
47
|
puts "Instance #{@name} found"
|
35
48
|
return true
|
36
49
|
else
|
@@ -40,11 +53,7 @@ module Provider
|
|
40
53
|
end
|
41
54
|
|
42
55
|
def status
|
43
|
-
|
44
|
-
@instance.status
|
45
|
-
rescue Exception => e
|
46
|
-
return :missing
|
47
|
-
end
|
56
|
+
@instance.status if @instance
|
48
57
|
end
|
49
58
|
|
50
59
|
def dns_name
|
@@ -58,6 +67,16 @@ module Provider
|
|
58
67
|
def id
|
59
68
|
@instance.id
|
60
69
|
end
|
70
|
+
|
71
|
+
def instance
|
72
|
+
@instance ||= get_instance
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_instance
|
76
|
+
AWS.memoize do
|
77
|
+
@ec2.instances.select {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated}.first
|
78
|
+
end
|
79
|
+
end
|
61
80
|
|
62
81
|
end
|
63
82
|
end
|
@@ -45,8 +45,9 @@ module Route53
|
|
45
45
|
|
46
46
|
def delete
|
47
47
|
if self.exist?
|
48
|
-
record =
|
49
|
-
record.
|
48
|
+
record = self.get
|
49
|
+
delete_record = Route53::DNSRecord.new(record.name, record.type, record.ttl, record.values, @zone)
|
50
|
+
delete_record.delete
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
data/lib/veronic.rb
CHANGED
@@ -54,7 +54,7 @@ module Veronic
|
|
54
54
|
deploy_stacks
|
55
55
|
end
|
56
56
|
query = cloudprovider.instance.dns_name
|
57
|
-
deploy_cmd =
|
57
|
+
deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_deploy]' #{config_hash[:verbose] ? '-l ' + config_hash[:verbose] : ''}"
|
58
58
|
manual = true
|
59
59
|
configprovider.ssh(query, deploy_cmd, manual)
|
60
60
|
end
|
@@ -65,7 +65,7 @@ module Veronic
|
|
65
65
|
deploy_apps
|
66
66
|
end
|
67
67
|
query = cloudprovider.instance.dns_name
|
68
|
-
deploy_cmd =
|
68
|
+
deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_testing]' #{config_hash[:verbose] ? '-l ' + config_hash[:verbose] : ''}"
|
69
69
|
manual = true
|
70
70
|
configprovider.ssh(query, deploy_cmd, manual)
|
71
71
|
end
|
@@ -76,7 +76,7 @@ module Veronic
|
|
76
76
|
@config.zone_url = z['zone_url']
|
77
77
|
dns = "#{config_hash[:name]}.#{z['zone_name']}"
|
78
78
|
puts "Setting DNS #{dns} ..."
|
79
|
-
record = dnsprovider.zone.record(dns, [
|
79
|
+
record = dnsprovider.zone.record(dns, [], "A", "1").delete
|
80
80
|
puts "DNS #{dns} deleted"
|
81
81
|
end
|
82
82
|
if cloudprovider.instance.exist?
|
@@ -106,7 +106,7 @@ module Veronic
|
|
106
106
|
@config.zone_url = z['zone_url']
|
107
107
|
dns = "#{config_hash[:name]}.#{z['zone_name']}"
|
108
108
|
puts "Setting DNS #{dns} ..."
|
109
|
-
record = dnsprovider.zone.record(dns, [cloudprovider.instance.public_ip_address], "A", "
|
109
|
+
record = dnsprovider.zone.record(dns, [cloudprovider.instance.public_ip_address], "A", "1").wait_set
|
110
110
|
puts "DNS #{dns} updated"
|
111
111
|
end
|
112
112
|
end
|
@@ -120,23 +120,51 @@ module Veronic
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def start
|
123
|
-
cloudprovider.instance.start
|
124
|
-
|
123
|
+
unless cloudprovider.instance.start == false
|
124
|
+
update_instance_dns
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def status
|
129
|
+
if config_hash[:name]
|
130
|
+
return cloudprovider.instance.status
|
131
|
+
else
|
132
|
+
return "Arguments name missing"
|
133
|
+
end
|
125
134
|
end
|
126
135
|
|
127
136
|
def bootstrap
|
128
|
-
|
137
|
+
get_image
|
129
138
|
if cloudprovider.instance.status == :running
|
130
|
-
|
139
|
+
puts "#{config_hash[:name]} is running"
|
131
140
|
elsif cloudprovider.instance.status == :stopped
|
132
141
|
start
|
133
|
-
configprovider.instance.bootstrap
|
134
142
|
elsif cloudprovider.instance.exist? == false
|
135
|
-
configprovider.instance.bootstrap
|
136
|
-
|
143
|
+
configprovider.instance.bootstrap
|
144
|
+
set_node
|
145
|
+
update_instance_dns
|
137
146
|
return true
|
138
147
|
else
|
139
|
-
|
148
|
+
abort('Error during connecting instance')
|
149
|
+
end
|
150
|
+
set_node
|
151
|
+
return false
|
152
|
+
end
|
153
|
+
|
154
|
+
def set_node
|
155
|
+
if config_hash[:role] && config_hash[:environment]
|
156
|
+
configprovider.instance.set_environment
|
157
|
+
configprovider.instance.set_role
|
158
|
+
else
|
159
|
+
abort('Arguments "role" or "environment" missing')
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def get_image
|
164
|
+
if config_hash[:environment]
|
165
|
+
@config.image = cloudprovider.image.id
|
166
|
+
else
|
167
|
+
abort('Arguments "environment" missing')
|
140
168
|
end
|
141
169
|
end
|
142
170
|
end
|
data/veronic.gemspec
CHANGED
data/veronic.yml
CHANGED