veronic 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/veronic +15 -1
- data/lib/config/config.rb +3 -2
- data/lib/providers/chefserver/chefserver.rb +17 -1
- data/lib/providers/chefserver/client.rb +27 -0
- data/lib/providers/chefserver/instance.rb +8 -12
- data/lib/providers/cloudprovider.rb +2 -2
- data/lib/providers/configprovider.rb +4 -0
- data/lib/providers/ec2/ec2.rb +3 -3
- data/lib/providers/ec2/image.rb +49 -3
- data/lib/providers/ec2/instance.rb +18 -1
- data/lib/veronic.rb +31 -16
- data/veronic.gemspec +1 -1
- data/veronic.yml +1 -0
- metadata +2 -1
data/bin/veronic
CHANGED
|
@@ -26,6 +26,7 @@ opt_parser = OptionParser.new do |opt|
|
|
|
26
26
|
opt.separator " start: start box"
|
|
27
27
|
opt.separator " list: list boxes"
|
|
28
28
|
opt.separator " status: status boxes"
|
|
29
|
+
opt.separator " create_image: create an image with the box"
|
|
29
30
|
opt.separator ""
|
|
30
31
|
opt.separator "Options"
|
|
31
32
|
|
|
@@ -84,11 +85,21 @@ opt_parser = OptionParser.new do |opt|
|
|
|
84
85
|
options[:security_groups] = s
|
|
85
86
|
end
|
|
86
87
|
|
|
88
|
+
options[:ami_image] = ENV['ami_image']
|
|
89
|
+
opt.on("-I","--ami_image ami_image","Which ami_image use for the box") do |i|
|
|
90
|
+
options[:ami_image] = i
|
|
91
|
+
end
|
|
92
|
+
|
|
87
93
|
options[:deploy_cmd] = ENV['deploy_cmd']
|
|
88
|
-
opt.on("-D","--deploy_cmd
|
|
94
|
+
opt.on("-D","--deploy_cmd commad-line","Which command line us to deploy the box") do |dc|
|
|
89
95
|
options[:deploy_cmd] = dc
|
|
90
96
|
end
|
|
91
97
|
|
|
98
|
+
options[:verbose] = ENV['verbose']
|
|
99
|
+
opt.on("-v","--verbose debug","Which verbose level us to deploy the box") do |v|
|
|
100
|
+
options[:verbose] = v
|
|
101
|
+
end
|
|
102
|
+
|
|
92
103
|
opt.on("-h","--help","help")
|
|
93
104
|
end
|
|
94
105
|
|
|
@@ -119,6 +130,9 @@ when "list"
|
|
|
119
130
|
Veronic::Deployer.new(options).instances_list
|
|
120
131
|
when "status"
|
|
121
132
|
puts Veronic::Deployer.new(options).status
|
|
133
|
+
when "create_image"
|
|
134
|
+
image = Veronic::Deployer.new(options).create_image
|
|
135
|
+
puts "ID: #{image.id}", "NAME: #{image.name}", "STATE: #{image.state}"
|
|
122
136
|
else
|
|
123
137
|
puts opt_parser
|
|
124
138
|
end
|
data/lib/config/config.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Veronic
|
|
2
2
|
class Config
|
|
3
|
-
attr_accessor :dnsprovider, :cloudprovider, :configprovider, :dnsprovider_access_key_id, :dnsprovider_secret_access_key, :cloudprovider_access_key_id, :cloudprovider_secret_access_key, :cloudprovider_images_owner_id, :dnsprovider_zones, :region, :availability_zone, :aws_ssh_key_id, :node_name, :client_key, :validation_client_name, :validation_key, :chef_server_url, :ssl_version, :identity_file, :branch, :environment, :ssh_user, :ssh_port, :role, :flavor, :security_groups, :deploy_cmd, :name, :image, :zone_name, :zone_url
|
|
3
|
+
attr_accessor :dnsprovider, :cloudprovider, :configprovider, :dnsprovider_access_key_id, :dnsprovider_secret_access_key, :cloudprovider_access_key_id, :cloudprovider_secret_access_key, :cloudprovider_images_owner_id, :dnsprovider_zones, :region, :availability_zone, :aws_ssh_key_id, :node_name, :client_key, :validation_client_name, :validation_key, :chef_server_url, :ssl_version, :identity_file, :branch, :environment, :ssh_user, :ssh_port, :role, :flavor, :security_groups, :deploy_cmd, :name, :image, :zone_name, :zone_url, :verbose
|
|
4
4
|
|
|
5
5
|
def initialize(options={})
|
|
6
6
|
config_file = File.exists?('/etc/veronic/veronic.yml') ? '/etc/veronic/veronic.yml' : '../../' + File.dirname($0) + '/veronic.yml'
|
|
@@ -34,7 +34,8 @@ module Veronic
|
|
|
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'
|
|
36
36
|
@name = (options[:branch] || config_from_file['branch']) ? (options[:branch] || config_from_file['branch']) : (options[:name] || config_from_file['name'])
|
|
37
|
-
@image =
|
|
37
|
+
@image = options[:ami_image] || config_from_file['ami_image']
|
|
38
|
+
@verbose = options[:verbose] || config_from_file['verbose']
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
def to_hash
|
|
@@ -7,7 +7,19 @@ require 'tempfile'
|
|
|
7
7
|
require 'highline'
|
|
8
8
|
require 'net/ssh'
|
|
9
9
|
require 'net/ssh/multi'
|
|
10
|
+
require 'chef/knife'
|
|
11
|
+
require 'chef/knife/ec2_server_create'
|
|
12
|
+
require 'chef/knife/ec2_server_delete'
|
|
13
|
+
require 'chef/knife/bootstrap'
|
|
14
|
+
require 'chef/knife/ssh'
|
|
15
|
+
require 'chef/knife/node_run_list_add'
|
|
16
|
+
require 'chef/knife/core/bootstrap_context'
|
|
17
|
+
require 'chef/knife/ec2_base'
|
|
18
|
+
require 'chef/node'
|
|
19
|
+
|
|
20
|
+
require_relative 'rest_request'
|
|
10
21
|
require_relative 'instance'
|
|
22
|
+
require_relative 'client'
|
|
11
23
|
|
|
12
24
|
module Provider
|
|
13
25
|
class ChefServer
|
|
@@ -47,7 +59,11 @@ module Provider
|
|
|
47
59
|
end
|
|
48
60
|
|
|
49
61
|
def instance
|
|
50
|
-
|
|
62
|
+
node = Provider::ChefServer::Instance.new(@config)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def client
|
|
66
|
+
node = Provider::ChefServer::Client.new(@config)
|
|
51
67
|
end
|
|
52
68
|
|
|
53
69
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Provider
|
|
2
|
+
class ChefServer
|
|
3
|
+
class Client
|
|
4
|
+
|
|
5
|
+
def initialize(name)
|
|
6
|
+
@name = name
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def destroy(name=nil)
|
|
10
|
+
puts "Destroying client #{@name} ..."
|
|
11
|
+
|
|
12
|
+
knife = Chef::Knife.new()
|
|
13
|
+
knife.config[:yes] = true
|
|
14
|
+
knife.delete_object(Chef::ApiClient, @name) if self.exists?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def exists?
|
|
18
|
+
begin
|
|
19
|
+
Chef::ApiClient.load(@name)
|
|
20
|
+
rescue
|
|
21
|
+
return false
|
|
22
|
+
end
|
|
23
|
+
return true
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
require 'chef/knife'
|
|
2
|
-
require 'chef/knife/ec2_server_create'
|
|
3
|
-
require 'chef/knife/ec2_server_delete'
|
|
4
|
-
require 'chef/knife/bootstrap'
|
|
5
|
-
require 'chef/knife/ssh'
|
|
6
|
-
require 'chef/knife/node_run_list_add'
|
|
7
|
-
require 'chef/knife/core/bootstrap_context'
|
|
8
|
-
require 'chef/knife/ec2_base'
|
|
9
|
-
require 'chef/node'
|
|
10
|
-
|
|
11
|
-
require_relative 'rest_request'
|
|
12
|
-
|
|
13
1
|
module Provider
|
|
14
2
|
class ChefServer
|
|
15
3
|
class Instance
|
|
@@ -126,6 +114,14 @@ module Provider
|
|
|
126
114
|
sys_status = knife_ssh.run
|
|
127
115
|
end
|
|
128
116
|
|
|
117
|
+
def client
|
|
118
|
+
Provider::ChefServer::Client.new(@name)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def delete_client_key(node, client_key="/etc/chef/client.pem")
|
|
122
|
+
puts "Deleting client_key #{client_key}"
|
|
123
|
+
self.ssh(node, "sudo rm -f #{client_key}", true)
|
|
124
|
+
end
|
|
129
125
|
end
|
|
130
126
|
end
|
|
131
127
|
end
|
data/lib/providers/ec2/ec2.rb
CHANGED
|
@@ -14,12 +14,12 @@ module Provider
|
|
|
14
14
|
@ec2 = ec2
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def image
|
|
18
|
-
Provider::Ec2::Image.new(@ec2, @environment, @owner_id)
|
|
17
|
+
def image(name=nil)
|
|
18
|
+
Provider::Ec2::Image.new(@ec2, @environment, @owner_id, name)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def instance
|
|
22
|
-
Provider::Ec2::Instance.new(@ec2, @name)
|
|
22
|
+
Provider::Ec2::Instance.new(@ec2, @name, @environment)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def instances
|
data/lib/providers/ec2/image.rb
CHANGED
|
@@ -2,12 +2,58 @@ module Provider
|
|
|
2
2
|
class Ec2
|
|
3
3
|
class Image
|
|
4
4
|
|
|
5
|
-
def initialize(ec2, environment, owner_id)
|
|
6
|
-
@
|
|
5
|
+
def initialize(ec2, environment, owner_id, name=nil)
|
|
6
|
+
@ec2 = ec2
|
|
7
|
+
@environment = environment
|
|
8
|
+
@name = name
|
|
9
|
+
@ami_name = @name || @environment + '-ami'
|
|
10
|
+
@owner_id = owner_id
|
|
7
11
|
end
|
|
8
12
|
|
|
9
13
|
def id
|
|
10
|
-
|
|
14
|
+
if image
|
|
15
|
+
@image.id
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def detroy
|
|
20
|
+
puts "Destroying image #{@ami_name}..."
|
|
21
|
+
if image
|
|
22
|
+
begin
|
|
23
|
+
@image.deregister
|
|
24
|
+
puts "Image #{@ami_name} destroyed"
|
|
25
|
+
rescue
|
|
26
|
+
return false
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
return true
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def image
|
|
33
|
+
puts "Getting image #{@ami_name}..."
|
|
34
|
+
@image = get_image
|
|
35
|
+
unless @image
|
|
36
|
+
sleep 5
|
|
37
|
+
@image = get_image
|
|
38
|
+
end
|
|
39
|
+
if @image
|
|
40
|
+
while @image.exists? == false && @image.state != :failed
|
|
41
|
+
print "."
|
|
42
|
+
sleep 1
|
|
43
|
+
end
|
|
44
|
+
while @image.state == :pending && @image.state != :failed
|
|
45
|
+
print "."
|
|
46
|
+
sleep 1
|
|
47
|
+
end
|
|
48
|
+
puts ""
|
|
49
|
+
return @image
|
|
50
|
+
else
|
|
51
|
+
return false
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def get_image
|
|
56
|
+
@ec2.images.with_owner(@owner_id).select {|x| x.name == @ami_name}.first
|
|
11
57
|
end
|
|
12
58
|
|
|
13
59
|
end
|
|
@@ -2,9 +2,10 @@ module Provider
|
|
|
2
2
|
class Ec2
|
|
3
3
|
class Instance
|
|
4
4
|
|
|
5
|
-
def initialize(ec2, name)
|
|
5
|
+
def initialize(ec2, name, environment)
|
|
6
6
|
@ec2 = ec2
|
|
7
7
|
@name = name
|
|
8
|
+
@environment = environment
|
|
8
9
|
@instance = instance
|
|
9
10
|
end
|
|
10
11
|
|
|
@@ -77,6 +78,22 @@ module Provider
|
|
|
77
78
|
@ec2.instances.select {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated}.first
|
|
78
79
|
end
|
|
79
80
|
end
|
|
81
|
+
|
|
82
|
+
def create_image(name=nil)
|
|
83
|
+
@ami_name = name || @environment + '-ami'
|
|
84
|
+
puts "Create image #{@ami_name}"
|
|
85
|
+
image = @instance.create_image(@ami_name, { :no_reboot => true })
|
|
86
|
+
while image.exists? == false && image.state != :failed
|
|
87
|
+
print "."
|
|
88
|
+
sleep 1
|
|
89
|
+
end
|
|
90
|
+
while image.state == :pending && image.state != :failed
|
|
91
|
+
print "."
|
|
92
|
+
sleep 1
|
|
93
|
+
end
|
|
94
|
+
puts ""
|
|
95
|
+
return image
|
|
96
|
+
end
|
|
80
97
|
|
|
81
98
|
end
|
|
82
99
|
end
|
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 = "sudo chef-client -o 'recipe[lift_envs::app_deploy]' #{
|
|
57
|
+
deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_deploy]' #{@config.verbose ? '-l ' + @config.verbose : ''}"
|
|
58
58
|
manual = true
|
|
59
59
|
configprovider.ssh(query, deploy_cmd, manual)
|
|
60
60
|
end
|
|
@@ -65,16 +65,16 @@ module Veronic
|
|
|
65
65
|
deploy_apps
|
|
66
66
|
end
|
|
67
67
|
query = cloudprovider.instance.dns_name
|
|
68
|
-
deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_testing]' #{
|
|
68
|
+
deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_testing]' #{@config.verbose ? '-l ' + @config.verbose : ''}"
|
|
69
69
|
manual = true
|
|
70
70
|
configprovider.ssh(query, deploy_cmd, manual)
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
def destroy
|
|
74
|
-
|
|
74
|
+
@config.dnsprovider_zones.each do |z|
|
|
75
75
|
@config.zone_name = z['zone_name']
|
|
76
76
|
@config.zone_url = z['zone_url']
|
|
77
|
-
dns = "#{
|
|
77
|
+
dns = "#{@config.name}.#{z['zone_name']}"
|
|
78
78
|
puts "Setting DNS #{dns} ..."
|
|
79
79
|
record = dnsprovider.zone.record(dns, [], "A", "1").delete
|
|
80
80
|
puts "DNS #{dns} deleted"
|
|
@@ -101,10 +101,10 @@ module Veronic
|
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
def update_instance_dns
|
|
104
|
-
|
|
104
|
+
@config.dnsprovider_zones.each do |z|
|
|
105
105
|
@config.zone_name = z['zone_name']
|
|
106
106
|
@config.zone_url = z['zone_url']
|
|
107
|
-
dns = "#{
|
|
107
|
+
dns = "#{@config.name}.#{z['zone_name']}"
|
|
108
108
|
puts "Setting DNS #{dns} ..."
|
|
109
109
|
record = dnsprovider.zone.record(dns, [cloudprovider.instance.public_ip_address], "A", "1").wait_set
|
|
110
110
|
puts "DNS #{dns} updated"
|
|
@@ -126,7 +126,7 @@ module Veronic
|
|
|
126
126
|
end
|
|
127
127
|
|
|
128
128
|
def status
|
|
129
|
-
if
|
|
129
|
+
if @config.name
|
|
130
130
|
return cloudprovider.instance.status
|
|
131
131
|
else
|
|
132
132
|
return "Arguments name missing"
|
|
@@ -134,25 +134,36 @@ module Veronic
|
|
|
134
134
|
end
|
|
135
135
|
|
|
136
136
|
def bootstrap
|
|
137
|
-
|
|
137
|
+
status = false
|
|
138
138
|
if cloudprovider.instance.status == :running
|
|
139
|
-
puts "#{
|
|
139
|
+
puts "#{@config.name} is running"
|
|
140
140
|
elsif cloudprovider.instance.status == :stopped
|
|
141
141
|
start
|
|
142
142
|
elsif cloudprovider.instance.exist? == false
|
|
143
|
+
get_image
|
|
143
144
|
configprovider.instance.bootstrap
|
|
144
|
-
set_node
|
|
145
145
|
update_instance_dns
|
|
146
|
-
|
|
146
|
+
status = true
|
|
147
147
|
else
|
|
148
148
|
abort('Error during connecting instance')
|
|
149
149
|
end
|
|
150
150
|
set_node
|
|
151
|
-
return
|
|
151
|
+
return status
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def create_image
|
|
155
|
+
unless @config.environment
|
|
156
|
+
abort('Arguments "environment" missing')
|
|
157
|
+
else
|
|
158
|
+
configprovider.instance.client.destroy
|
|
159
|
+
configprovider.instance.delete_client_key(cloudprovider.instance.dns_name)
|
|
160
|
+
cloudprovider.image.detroy
|
|
161
|
+
cloudprovider.instance.create_image
|
|
162
|
+
end
|
|
152
163
|
end
|
|
153
164
|
|
|
154
165
|
def set_node
|
|
155
|
-
if
|
|
166
|
+
if @config.role && @config.environment
|
|
156
167
|
configprovider.instance.set_environment
|
|
157
168
|
configprovider.instance.set_role
|
|
158
169
|
else
|
|
@@ -161,10 +172,14 @@ module Veronic
|
|
|
161
172
|
end
|
|
162
173
|
|
|
163
174
|
def get_image
|
|
164
|
-
if
|
|
165
|
-
@config.
|
|
175
|
+
if @config.image.nil?
|
|
176
|
+
unless @config.environment
|
|
177
|
+
abort('Arguments "environment" missing')
|
|
178
|
+
else
|
|
179
|
+
@config.image = cloudprovider.image.id
|
|
180
|
+
end
|
|
166
181
|
else
|
|
167
|
-
|
|
182
|
+
@config.image = cloudprovider.image(@config.image).id
|
|
168
183
|
end
|
|
169
184
|
end
|
|
170
185
|
end
|
data/veronic.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.name = 'veronic'
|
|
3
|
-
s.version = '0.0.
|
|
3
|
+
s.version = '0.0.11'
|
|
4
4
|
s.date = '2013-04-05'
|
|
5
5
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
6
6
|
s.summary = "Veronic, deux qui la tiennent trois qui la niquent"
|
data/veronic.yml
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: veronic
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.11
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -88,6 +88,7 @@ files:
|
|
|
88
88
|
- bin/veronic
|
|
89
89
|
- lib/config/config.rb
|
|
90
90
|
- lib/providers/chefserver/chefserver.rb
|
|
91
|
+
- lib/providers/chefserver/client.rb
|
|
91
92
|
- lib/providers/chefserver/instance.rb
|
|
92
93
|
- lib/providers/chefserver/rest_request.rb
|
|
93
94
|
- lib/providers/cloudprovider.rb
|