rig 0.6.2 → 0.6.3
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/rig +6 -1
- data/conf/userdata/chef/userdata.sh.erb +6 -4
- data/lib/rig/capistrano.rb +4 -4
- data/lib/rig/command/abstract.rb +4 -0
- data/lib/rig/command/server.rb +13 -7
- data/lib/rig/log.rb +8 -1
- data/lib/rig/model/balancer.rb +13 -0
- data/lib/rig/model/dns.rb +19 -0
- data/lib/rig/model/environment.rb +50 -19
- data/lib/rig/model/userdata.rb +1 -1
- data/lib/rig/template.rb +71 -24
- data/lib/rig/version.rb +1 -1
- metadata +2 -2
data/bin/rig
CHANGED
@@ -25,10 +25,10 @@ update_rubygems
|
|
25
25
|
gem install <%= gem %> --no-ri --no-rdoc
|
26
26
|
<% end %>
|
27
27
|
|
28
|
-
cat <<FACTS > /etc/
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
cat <<FACTS > /etc/rig.yml
|
29
|
+
name: <%= @name %>
|
30
|
+
roles: <%= @roles.join(",") %>
|
31
|
+
environment: <%= @environment %>
|
32
32
|
FACTS
|
33
33
|
|
34
34
|
cat <<JSON > /etc/chef/bootstrap.json
|
@@ -52,6 +52,8 @@ file_backup_path "/var/backups/chef"
|
|
52
52
|
pid_file "/var/run/chef/client.pid"
|
53
53
|
node_name "<%= @name %>";
|
54
54
|
Chef::Log::Formatter.show_time = true
|
55
|
+
|
56
|
+
Ohai::Config[:plugin_path] << '/etc/ohai/plugins'
|
55
57
|
CLIENT
|
56
58
|
|
57
59
|
<% @files.each do |file|; local = file["local"]; remote = file["remote"] %>
|
data/lib/rig/capistrano.rb
CHANGED
@@ -9,8 +9,8 @@ require 'capistrano'
|
|
9
9
|
module Rig
|
10
10
|
module Capistrano
|
11
11
|
def servers
|
12
|
-
env =
|
13
|
-
role =
|
12
|
+
env = Rig.config[:environment]
|
13
|
+
role = Rig.config[:role]
|
14
14
|
servers = Rig::Model::Environment.find(env).servers
|
15
15
|
list = role == 'all' ? servers : servers.select { |s| (s.tags['Roles']||"").split(",").include?(role) }
|
16
16
|
|
@@ -33,8 +33,8 @@ configuration = Capistrano::Configuration.respond_to?(:instance) ?
|
|
33
33
|
configuration.load do
|
34
34
|
puts " * reading rig information..."
|
35
35
|
|
36
|
-
Rig.config[:environment] = ARGV[0]
|
37
|
-
Rig.config[:role]
|
36
|
+
Rig.config[:environment] = ENV['ENVIRONMENT'] || ARGV[0]
|
37
|
+
Rig.config[:role] = ENV['ROLE'] || ARGV[1]
|
38
38
|
|
39
39
|
# create dummy tasks for environment and role
|
40
40
|
begin
|
data/lib/rig/command/abstract.rb
CHANGED
data/lib/rig/command/server.rb
CHANGED
@@ -14,13 +14,13 @@ module Rig
|
|
14
14
|
option %w{--add}, :flag, "add this to the existing servers of this role and environment"
|
15
15
|
option "--[no-]chef", :flag, "use chef to bootstrap", :default => true
|
16
16
|
|
17
|
+
parameter "NAME", "the name of the server, will automatically add a number"
|
17
18
|
parameter "ENVIRONMENT", "the environment this server should belong to"
|
18
|
-
parameter "ROLE", "the server
|
19
|
+
parameter "ROLE ...", "the server roles"
|
19
20
|
|
20
21
|
def execute
|
21
|
-
name = role
|
22
22
|
# figure out if there are others of this role, if there are add a number to name to distinguish.
|
23
|
-
n = "#{name}.#{environment}.env"
|
23
|
+
n = "#{name}1.#{environment}.env"
|
24
24
|
chef = Rig.config[:chef] ? true : false
|
25
25
|
|
26
26
|
unless flavor
|
@@ -32,9 +32,9 @@ module Rig
|
|
32
32
|
:flavor_id => flavor,
|
33
33
|
:key_name => keypair,
|
34
34
|
:groups => groups.split(','),
|
35
|
-
:user_data => Rig::Model::Userdata.create(n,
|
35
|
+
:user_data => Rig::Model::Userdata.create(n, role_list, environment, :chef => chef)
|
36
36
|
}
|
37
|
-
tags = { 'Name' => n, 'Environment' => environment, 'Role' =>
|
37
|
+
tags = { 'Name' => n, 'Environment' => environment, 'Role' => role_list.join(",") }
|
38
38
|
server = Rig::Model::Instance.create(o, tags)
|
39
39
|
puts "created: #{server.id}"
|
40
40
|
rescue => e
|
@@ -42,6 +42,10 @@ module Rig
|
|
42
42
|
raise Clamp::HelpWanted, self
|
43
43
|
end
|
44
44
|
|
45
|
+
def default_flavor
|
46
|
+
Rig.account[:flavor]
|
47
|
+
end
|
48
|
+
|
45
49
|
def default_image
|
46
50
|
Rig.account[:image].is_a?(Hash) ? Rig.account[:image].first.last : Rig.account[:image]
|
47
51
|
end
|
@@ -84,8 +88,10 @@ module Rig
|
|
84
88
|
parameter "NAME", "the name of the server to get tags for"
|
85
89
|
|
86
90
|
def execute
|
87
|
-
|
88
|
-
raise "server not found #{name}" unless
|
91
|
+
list = Rig::Model::Instance.find(name)
|
92
|
+
raise "server not found #{name}" unless list && list.count > 0
|
93
|
+
raise "search found more than one server" if list.count > 1
|
94
|
+
instance = list.first
|
89
95
|
puts "#{instance.tags.inspect}"
|
90
96
|
end
|
91
97
|
end
|
data/lib/rig/log.rb
CHANGED
@@ -22,7 +22,7 @@ module Rig
|
|
22
22
|
console_level = LEVELS[console_config[:level].to_sym]
|
23
23
|
end
|
24
24
|
console.level = console_level || Logger::INFO
|
25
|
-
add(console, proc {|s, _, _, m| "#{m}\n"})
|
25
|
+
add(console, proc {|s, _, _, m| "#{"debug: " if s=='DEBUG'}#{m}\n"})
|
26
26
|
|
27
27
|
logging.each do |name, data|
|
28
28
|
level = data[:level]
|
@@ -71,6 +71,13 @@ module Rig
|
|
71
71
|
end
|
72
72
|
METHOD_DEFN
|
73
73
|
end
|
74
|
+
|
75
|
+
def trace(backtrace)
|
76
|
+
debug "trace: #{backtrace.shift}"
|
77
|
+
backtrace.each do |l|
|
78
|
+
debug " #{l}"
|
79
|
+
end
|
80
|
+
end
|
74
81
|
end
|
75
82
|
end
|
76
83
|
end
|
data/lib/rig/model/balancer.rb
CHANGED
@@ -99,6 +99,19 @@ module Rig
|
|
99
99
|
'PolicyNames' => policy_names
|
100
100
|
}
|
101
101
|
end
|
102
|
+
|
103
|
+
def sticky(type, balancer_name, expires_or_cookie, policy_name='LBCookieStickinessPolicy')
|
104
|
+
elb = find(balancer_name)
|
105
|
+
raise "balancer #{balancer_name} not found" unless elb
|
106
|
+
case type.to_sym
|
107
|
+
when :app, :application
|
108
|
+
Rig::Connection.balancer.create_app_cookie_stickiness_policy(balancer_name, policy_name, expires_or_cookie)
|
109
|
+
when :lb, :load_balancer
|
110
|
+
Rig::Connection.balancer.create_lb_cookie_stickiness_policy(balancer_name, policy_name, expires_or_cookie)
|
111
|
+
else
|
112
|
+
raise "unknown sticky type #{type}"
|
113
|
+
end
|
114
|
+
end
|
102
115
|
end
|
103
116
|
end
|
104
117
|
end
|
data/lib/rig/model/dns.rb
CHANGED
@@ -49,6 +49,25 @@ module Rig
|
|
49
49
|
Rig::Log.info "record not found: #{name}"
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
def remove_environment(name)
|
54
|
+
zone = zone(Rig.get_config(:dns_zone))
|
55
|
+
list = zone.records.all.select {|e| e.attributes[:name] =~ /\.#{name}\.env/ }
|
56
|
+
list.each do |e|
|
57
|
+
Rig::Log.info "record: #{e.attributes[:name]}"
|
58
|
+
destroy(e.attributes[:name])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def remove_instance(dns)
|
63
|
+
zone = zone(Rig.get_config(:dns_zone))
|
64
|
+
dns = dns.gsub(/\.$/, '')
|
65
|
+
list = zone.records.all.select {|e| e.attributes[:value] == "#{dns}." }
|
66
|
+
list.each do |e|
|
67
|
+
Rig::Log.info "record: #{e.attributes[:name]}"
|
68
|
+
destroy(e.attributes[:name])
|
69
|
+
end
|
70
|
+
end
|
52
71
|
end
|
53
72
|
end
|
54
73
|
end
|
@@ -49,11 +49,12 @@ module Rig
|
|
49
49
|
|
50
50
|
}.merge(opts)
|
51
51
|
|
52
|
-
@name
|
53
|
-
@template
|
52
|
+
@name = name
|
53
|
+
@template = Rig.get_template(template) unless template.nil?
|
54
54
|
@template_name = template
|
55
|
-
@servers
|
56
|
-
@
|
55
|
+
@servers = []
|
56
|
+
@dnsdelayed = []
|
57
|
+
@balancers = []
|
57
58
|
end
|
58
59
|
|
59
60
|
def save
|
@@ -62,14 +63,17 @@ module Rig
|
|
62
63
|
set = { }
|
63
64
|
|
64
65
|
@template.servers.each do |s|
|
66
|
+
Rig::Log.debug "server[#{s.count}]= #{s.inspect}"
|
65
67
|
1.upto(s.count) do |i|
|
66
68
|
n = "#{s.name}#{i}.#@name.env"
|
69
|
+
Rig::Log.debug " name= #{n}"
|
70
|
+
userdata = s.userdata || Rig.get_config(:userdata)
|
67
71
|
o = {
|
68
72
|
:image_id => s.image || @image,
|
69
73
|
:flavor_id => s.flavor || @flavor,
|
70
74
|
:key_name => s.keypair || @keypair,
|
71
75
|
:groups => s.groups || @groups,
|
72
|
-
:user_data => Rig::Model::Userdata.create(n, s.roles, @name)
|
76
|
+
:user_data => Rig::Model::Userdata.create(n, s.roles, @name, :package => userdata)
|
73
77
|
}
|
74
78
|
|
75
79
|
# throw this error, because Fog and AWS don't care if you don't set a keypair
|
@@ -78,9 +82,22 @@ module Rig
|
|
78
82
|
|
79
83
|
Rig::Log.info "creating instance: name:#{n} environment:#@name roles:#{s.roles.inspect}"
|
80
84
|
instance = Rig::Model::Instance.create(o, 'Name' => n, 'Environment' => name, 'Roles' => s.roles.join(","))
|
81
|
-
|
82
|
-
|
85
|
+
if s.balancer
|
86
|
+
set[s.balancer] ||= []
|
87
|
+
set[s.balancer] << instance
|
88
|
+
end
|
83
89
|
@servers << instance
|
90
|
+
@dnsdelayed << {
|
91
|
+
:server => instance.id,
|
92
|
+
}
|
93
|
+
if s.count == 1 && s.dnsnames.count > 0
|
94
|
+
s.dnsnames.each do |dns|
|
95
|
+
@dnsdelayed << {
|
96
|
+
:record => "#{dns}.#{Rig.get_config(:dns_zone)}",
|
97
|
+
:server => instance.id,
|
98
|
+
}
|
99
|
+
end
|
100
|
+
end
|
84
101
|
end
|
85
102
|
end
|
86
103
|
|
@@ -100,22 +117,31 @@ module Rig
|
|
100
117
|
end
|
101
118
|
end
|
102
119
|
|
103
|
-
|
104
|
-
|
105
|
-
|
120
|
+
server_count = @servers.count
|
121
|
+
Rig::Log.info "waiting "
|
122
|
+
begin
|
123
|
+
sleep 1
|
124
|
+
reload
|
125
|
+
Rig::Log.info " . #{server_count} != #{@servers.count} : dns=#{@servers.select{|e| e.dns_name.nil? }.count == 0}"
|
126
|
+
end while server_count != @servers.count && @servers.select{|e| e.dns_name.nil? }.count == 0
|
106
127
|
|
107
128
|
Rig::Log.info "associating servers' DNS"
|
108
|
-
@
|
109
|
-
|
129
|
+
@dnsdelayed.each do |h|
|
130
|
+
server = @server_hash[h[:server]]
|
131
|
+
record = h[:record]
|
132
|
+
record ||= "#{server.tags['Name']}.#{Rig.get_config(:dns_zone)}" if server.tags
|
133
|
+
next unless record
|
110
134
|
dns = server.attributes[:dns_name]
|
111
135
|
ip = server.attributes[:public_ip_address]
|
112
136
|
|
113
137
|
Rig::Log.info ".. #{record} dns=#{dns} ip=#{ip}"
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
138
|
+
|
139
|
+
unless dns
|
140
|
+
Rig::Log.warn "server #{server.id} doesn't have dns_name"
|
141
|
+
next
|
118
142
|
end
|
143
|
+
|
144
|
+
Rig::Model::Dns.create(record, dns)
|
119
145
|
end
|
120
146
|
|
121
147
|
Rig::Plugin.run "environment:create", self
|
@@ -125,14 +151,18 @@ module Rig
|
|
125
151
|
end
|
126
152
|
|
127
153
|
def destroy
|
128
|
-
Rig::Log.info "removing dns
|
154
|
+
Rig::Log.info "removing all server dns entries"
|
129
155
|
@servers.each do |server|
|
130
|
-
Rig::Model::Dns.destroy("#{server.tags['Name']}.#{Rig.get_config(:dns_zone)}") if server.tags['Name']
|
156
|
+
#Rig::Model::Dns.destroy("#{server.tags['Name']}.#{Rig.get_config(:dns_zone)}") if server.tags['Name']
|
157
|
+
Rig::Model::Dns.remove_instance(server.dns_name) if server.dns_name
|
131
158
|
end
|
159
|
+
Rig::Log.info "removing all environment dns entries"
|
160
|
+
Rig::Model::Dns.remove_environment(@name)
|
161
|
+
|
132
162
|
|
133
163
|
roles = @servers.collect { |s| s.tags['Role'] }.compact
|
134
164
|
roles.each do |r|
|
135
|
-
Rig::Log.info "removing role balancer dns"
|
165
|
+
Rig::Log.info "removing role balancer dns (#{r})"
|
136
166
|
Rig::Model::Dns.destroy("#{r}.#{name}.env.#{Rig.get_config(:dns_zone)}")
|
137
167
|
end
|
138
168
|
|
@@ -183,6 +213,7 @@ module Rig
|
|
183
213
|
|
184
214
|
def find_servers
|
185
215
|
@servers = Rig::Model::Instance.find_by_environment(@name) || []
|
216
|
+
@server_hash = @servers.inject({}){|h, e| h[e.id] = e; h}
|
186
217
|
end
|
187
218
|
|
188
219
|
def find_balancers
|
data/lib/rig/model/userdata.rb
CHANGED
@@ -6,7 +6,7 @@ module Rig
|
|
6
6
|
class Userdata
|
7
7
|
class << self
|
8
8
|
def create(name, roles, environment, opts={ })
|
9
|
-
package = Rig.get_config(:userdata)
|
9
|
+
package = opts.delete(:package) || Rig.get_config(:userdata)
|
10
10
|
directory = "#{Rig::Config.dir}/userdata/#{package}"
|
11
11
|
config = YAML.load_file("#{directory}/userdata.yml")
|
12
12
|
|
data/lib/rig/template.rb
CHANGED
@@ -64,55 +64,97 @@ module Rig
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
class
|
68
|
-
|
67
|
+
class Base
|
68
|
+
def attr(name, value=nil)
|
69
|
+
@attrs[name] = value unless value.nil?
|
70
|
+
@attrs[name]
|
71
|
+
end
|
72
|
+
|
73
|
+
def list_attr(name, value=nil)
|
74
|
+
@attrs[name] ||= []
|
75
|
+
unless value.nil?
|
76
|
+
if value.kind_of?(Array)
|
77
|
+
@attrs[name] += value
|
78
|
+
else
|
79
|
+
@attrs[name] << value
|
80
|
+
end
|
81
|
+
end
|
82
|
+
@attrs[name]
|
83
|
+
end
|
84
|
+
end
|
69
85
|
|
86
|
+
class Server < Base
|
70
87
|
def initialize(name)
|
71
|
-
@
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
88
|
+
@attrs = {
|
89
|
+
:name => name.to_sym,
|
90
|
+
:roles => [],
|
91
|
+
:groups => [],
|
92
|
+
:count => 1,
|
93
|
+
:image => nil,
|
94
|
+
:flavor => nil,
|
95
|
+
:keypair => nil,
|
96
|
+
:userdata => "default",
|
97
|
+
:dnsnames => [],
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def name
|
102
|
+
@attrs[:name]
|
103
|
+
end
|
104
|
+
def roles
|
105
|
+
@attrs[:roles]
|
106
|
+
end
|
107
|
+
def groups
|
108
|
+
@attrs[:groups]
|
109
|
+
end
|
110
|
+
def dnsnames
|
111
|
+
@attrs[:dnsnames]
|
79
112
|
end
|
80
113
|
|
81
114
|
def role(r)
|
82
|
-
|
115
|
+
list_attr(:roles, r)
|
83
116
|
end
|
84
117
|
|
85
118
|
def count(c=nil)
|
86
|
-
|
119
|
+
attr(:count, c)
|
87
120
|
end
|
88
121
|
|
89
122
|
def image(i=nil)
|
90
|
-
|
123
|
+
attr(:image, i)
|
91
124
|
end
|
92
125
|
|
93
126
|
def flavor(f=nil)
|
94
|
-
|
127
|
+
attr(:flavor, f)
|
95
128
|
end
|
96
129
|
|
97
130
|
def group(g)
|
98
|
-
|
131
|
+
list_attr(:groups, g)
|
99
132
|
end
|
100
133
|
|
101
134
|
def keypair(k=nil)
|
102
|
-
|
135
|
+
attr(:keypair, k)
|
103
136
|
end
|
104
137
|
|
105
138
|
def userdata(u=nil)
|
106
|
-
|
139
|
+
attr(:userdata, u)
|
107
140
|
end
|
108
141
|
|
109
|
-
def balancer(b=nil)
|
110
|
-
|
142
|
+
def balancer(b=nil, &block)
|
143
|
+
if block_given?
|
144
|
+
raise "balancer block must specify name" unless b
|
145
|
+
Rig::Template::DSL.balancer(b, &block)
|
146
|
+
end
|
147
|
+
attr(:balancer, b)
|
148
|
+
end
|
149
|
+
|
150
|
+
def dns(name)
|
151
|
+
n = name.gsub(Rig.get_config(:dns_zone), "")
|
152
|
+
list_attr(:dnsnames, n)
|
111
153
|
end
|
112
154
|
end
|
113
155
|
|
114
156
|
class Balancer
|
115
|
-
attr_reader :name
|
157
|
+
attr_reader :name, :sticky_type, :sticky_arg
|
116
158
|
|
117
159
|
def initialize(name)
|
118
160
|
@listeners = []
|
@@ -131,7 +173,12 @@ module Rig
|
|
131
173
|
end
|
132
174
|
|
133
175
|
def listeners
|
134
|
-
@listeners.map {|e| e.spec}
|
176
|
+
@listeners.map { |e| e.spec }
|
177
|
+
end
|
178
|
+
|
179
|
+
def sticky(type, expires_or_cookie)
|
180
|
+
@sticky_type = type
|
181
|
+
@sticky_arg = expires_or_cookie
|
135
182
|
end
|
136
183
|
end
|
137
184
|
|
@@ -160,9 +207,9 @@ module Rig
|
|
160
207
|
|
161
208
|
def spec
|
162
209
|
{
|
163
|
-
|
164
|
-
|
165
|
-
|
210
|
+
:from => "#@from_proto:#@from_port",
|
211
|
+
:to => "#@to_proto:#@to_port",
|
212
|
+
:cert => @cert,
|
166
213
|
}
|
167
214
|
end
|
168
215
|
end
|
data/lib/rig/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: clamp
|