dev-lxc 1.7.0 → 2.0.0
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.
- checksums.yaml +4 -4
- data/README.md +230 -452
- data/dev-lxc.gemspec +2 -1
- data/lib/dev-lxc/cli.rb +174 -309
- data/lib/dev-lxc/cluster.rb +772 -113
- data/lib/dev-lxc/container.rb +1 -107
- data/lib/dev-lxc/server.rb +107 -420
- data/lib/dev-lxc/version.rb +1 -1
- data/lib/dev-lxc.rb +72 -76
- metadata +18 -4
data/lib/dev-lxc/cluster.rb
CHANGED
@@ -1,141 +1,800 @@
|
|
1
1
|
require "dev-lxc/server"
|
2
|
+
require "mixlib/install"
|
3
|
+
require "open-uri"
|
2
4
|
|
3
5
|
module DevLXC
|
4
6
|
class Cluster
|
5
|
-
attr_reader :
|
7
|
+
attr_reader :config
|
6
8
|
|
7
9
|
def initialize(cluster_config)
|
8
|
-
|
10
|
+
FileUtils.mkdir_p('/var/dev-lxc') unless Dir.exist?('/var/dev-lxc')
|
11
|
+
validate_cluster_config(cluster_config)
|
9
12
|
|
10
|
-
@
|
11
|
-
@
|
13
|
+
@config = Hash.new { |hash, key| hash[key] = {} }
|
14
|
+
@server_configs = Hash.new
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
%w(adhoc analytics chef-backend chef-server compliance nodes supermarket).each do |server_type|
|
17
|
+
if cluster_config[server_type]
|
18
|
+
@config[server_type][:mounts] = cluster_config[server_type]["mounts"]
|
19
|
+
@config[server_type][:mounts] ||= cluster_config["mounts"]
|
20
|
+
@config[server_type][:mounts] ||= Array.new
|
21
|
+
@config[server_type][:mounts] << "/var/dev-lxc var/dev-lxc"
|
22
|
+
@config[server_type][:ssh_keys] = cluster_config[server_type]["ssh-keys"]
|
23
|
+
@config[server_type][:ssh_keys] ||= cluster_config["ssh-keys"]
|
24
|
+
@config[server_type][:base_container_name] = cluster_config[server_type]["base_container"]
|
25
|
+
@config[server_type][:base_container_name] ||= cluster_config["base_container"]
|
26
|
+
|
27
|
+
case server_type
|
28
|
+
when "adhoc"
|
29
|
+
if cluster_config[server_type]["servers"]
|
30
|
+
cluster_config[server_type]["servers"].each do |server_name, server_config|
|
31
|
+
products = server_config['products']
|
32
|
+
products ||= Hash.new
|
33
|
+
@server_configs[server_name] = {
|
34
|
+
server_type: server_type,
|
35
|
+
products: products,
|
36
|
+
ipaddress: server_config['ipaddress'],
|
37
|
+
additional_fqdn: nil,
|
38
|
+
mounts: @config[server_type][:mounts],
|
39
|
+
ssh_keys: @config[server_type][:ssh_keys]
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
when "analytics"
|
44
|
+
@config[server_type][:topology] = cluster_config[server_type]["topology"]
|
45
|
+
@config[server_type][:topology] ||= 'standalone'
|
46
|
+
@config[server_type][:fqdn] = cluster_config[server_type]["analytics_fqdn"]
|
47
|
+
@config[server_type][:frontends] = Array.new
|
48
|
+
|
49
|
+
if cluster_config[server_type]["servers"]
|
50
|
+
cluster_config[server_type]["servers"].each do |server_name, server_config|
|
51
|
+
additional_fqdn = nil
|
52
|
+
products = server_config['products']
|
53
|
+
products ||= Hash.new
|
54
|
+
@server_configs[server_name] = server_config
|
55
|
+
case @config[server_type][:topology]
|
56
|
+
when 'standalone'
|
57
|
+
@config[server_type][:bootstrap_backend] = server_name if server_config["role"].nil?
|
58
|
+
@config[server_type][:fqdn] ||= @config[server_type][:bootstrap_backend]
|
59
|
+
when 'tier'
|
60
|
+
@config[server_type][:bootstrap_backend] = server_name if server_config["role"] == "backend" && server_config["bootstrap"] == true
|
61
|
+
if server_config["role"] == "frontend"
|
62
|
+
additional_fqdn = @config[server_type][:fqdn]
|
63
|
+
@config[server_type][:frontends] << server_name
|
64
|
+
end
|
65
|
+
end
|
66
|
+
@server_configs[server_name] = {
|
67
|
+
server_type: server_type,
|
68
|
+
products: products,
|
69
|
+
ipaddress: server_config['ipaddress'],
|
70
|
+
additional_fqdn: additional_fqdn,
|
71
|
+
mounts: @config[server_type][:mounts],
|
72
|
+
ssh_keys: @config[server_type][:ssh_keys]
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
when "chef-backend"
|
77
|
+
@config[server_type][:fqdn] = cluster_config[server_type]["api_fqdn"]
|
78
|
+
@config[server_type][:backends] = Array.new
|
79
|
+
@config[server_type][:frontends] = Array.new
|
16
80
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
81
|
+
servers = cluster_config[server_type]["servers"]
|
82
|
+
if servers
|
83
|
+
@config[server_type][:leader_backend] = servers.select { |s,sc| sc['role'] == 'backend' && sc['leader'] == true }.keys.first
|
84
|
+
@config[server_type][:bootstrap_frontend] = servers.select { |s,sc| sc['role'] == 'frontend' && sc['bootstrap'] == true }.keys.first
|
85
|
+
@config[server_type][:backends] << @config[server_type][:leader_backend]
|
86
|
+
@config[server_type][:frontends] << @config[server_type][:bootstrap_frontend]
|
87
|
+
servers.each do |server_name, server_config|
|
88
|
+
additional_fqdn = nil
|
89
|
+
products = server_config['products']
|
90
|
+
products ||= Hash.new
|
91
|
+
case server_config["role"]
|
92
|
+
when "backend"
|
93
|
+
@config[server_type][:backends] << server_name unless server_name == @config[server_type][:leader_backend]
|
94
|
+
when "frontend"
|
95
|
+
additional_fqdn = @config[server_type][:fqdn]
|
96
|
+
@config[server_type][:frontends] << server_name unless server_name == @config[server_type][:bootstrap_frontend]
|
97
|
+
end
|
98
|
+
@server_configs[server_name] = {
|
99
|
+
server_type: server_type,
|
100
|
+
products: products,
|
101
|
+
ipaddress: server_config['ipaddress'],
|
102
|
+
additional_fqdn: additional_fqdn,
|
103
|
+
mounts: @config[server_type][:mounts],
|
104
|
+
ssh_keys: @config[server_type][:ssh_keys],
|
105
|
+
chef_server_type: 'chef-server'
|
106
|
+
}
|
107
|
+
end
|
108
|
+
end
|
109
|
+
when "chef-server"
|
110
|
+
@config[server_type][:topology] = cluster_config[server_type]["topology"]
|
111
|
+
@config[server_type][:topology] ||= 'standalone'
|
112
|
+
@config[server_type][:fqdn] = cluster_config[server_type]["api_fqdn"]
|
113
|
+
@config[server_type][:frontends] = Array.new
|
114
|
+
|
115
|
+
if cluster_config[server_type]["servers"]
|
116
|
+
cluster_config[server_type]["servers"].each do |server_name, server_config|
|
117
|
+
additional_fqdn = nil
|
118
|
+
products = server_config['products']
|
119
|
+
products ||= Hash.new
|
120
|
+
chef_server_type = 'private-chef' if products.has_key?('private-chef')
|
121
|
+
chef_server_type = 'chef-server' if products.has_key?('chef-server')
|
122
|
+
case @config[server_type][:topology]
|
123
|
+
when 'standalone'
|
124
|
+
@config[server_type][:bootstrap_backend] = server_name if server_config["role"].nil?
|
125
|
+
@config[server_type][:fqdn] ||= @config[server_type][:bootstrap_backend]
|
126
|
+
when 'tier'
|
127
|
+
@config[server_type][:bootstrap_backend] = server_name if server_config["role"] == "backend" && server_config["bootstrap"] == true
|
128
|
+
if server_config["role"] == "frontend"
|
129
|
+
additional_fqdn = @config[server_type][:fqdn]
|
130
|
+
@config[server_type][:frontends] << server_name
|
131
|
+
end
|
132
|
+
end
|
133
|
+
@server_configs[server_name] = {
|
134
|
+
server_type: server_type,
|
135
|
+
products: products,
|
136
|
+
ipaddress: server_config['ipaddress'],
|
137
|
+
additional_fqdn: additional_fqdn,
|
138
|
+
mounts: @config[server_type][:mounts],
|
139
|
+
ssh_keys: @config[server_type][:ssh_keys],
|
140
|
+
chef_server_type: chef_server_type
|
141
|
+
}
|
142
|
+
end
|
143
|
+
end
|
144
|
+
when "compliance", "supermarket"
|
145
|
+
unless cluster_config[server_type]["servers"].first.nil?
|
146
|
+
(server_name, server_config) = cluster_config[server_type]["servers"].first
|
147
|
+
@config[server_type][:fqdn] = server_name
|
148
|
+
products = server_config['products']
|
149
|
+
products ||= Hash.new
|
150
|
+
@server_configs[server_name] = {
|
151
|
+
server_type: server_type,
|
152
|
+
products: products,
|
153
|
+
ipaddress: server_config['ipaddress'],
|
154
|
+
additional_fqdn: nil,
|
155
|
+
mounts: @config[server_type][:mounts],
|
156
|
+
ssh_keys: @config[server_type][:ssh_keys]
|
157
|
+
}
|
158
|
+
end
|
159
|
+
when "nodes"
|
160
|
+
if cluster_config[server_type]["servers"]
|
161
|
+
cluster_config[server_type]["servers"].each do |server_name, server_config|
|
162
|
+
products = server_config['products']
|
163
|
+
products ||= Hash.new
|
164
|
+
@server_configs[server_name] = {
|
165
|
+
server_type: server_type,
|
166
|
+
products: products,
|
167
|
+
ipaddress: server_config['ipaddress'],
|
168
|
+
additional_fqdn: nil,
|
169
|
+
mounts: @config[server_type][:mounts],
|
170
|
+
ssh_keys: @config[server_type][:ssh_keys],
|
171
|
+
chef_server_url: server_config['chef_server_url'],
|
172
|
+
validation_client_name: server_config['validation_client_name'],
|
173
|
+
validation_key: server_config['validation_key']
|
174
|
+
}
|
175
|
+
end
|
176
|
+
end
|
31
177
|
end
|
32
178
|
end
|
33
179
|
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def validate_cluster_config(cluster_config)
|
183
|
+
hostnames = Array.new
|
184
|
+
mounts = Array.new
|
185
|
+
base_container_names = Array.new
|
186
|
+
ssh_keys = Array.new
|
34
187
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
188
|
+
base_container_names << cluster_config['base_container'] unless cluster_config['base_container'].nil?
|
189
|
+
mounts.concat(cluster_config['mounts']) unless cluster_config['mounts'].nil?
|
190
|
+
ssh_keys.concat(cluster_config['ssh-keys']) unless cluster_config['ssh-keys'].nil?
|
191
|
+
|
192
|
+
%w(adhoc analytics chef-backend chef-server compliance nodes supermarket).each do |server_type|
|
193
|
+
unless cluster_config[server_type].nil?
|
194
|
+
base_container_names << cluster_config[server_type]['base_container'] unless cluster_config[server_type]['base_container'].nil?
|
195
|
+
hostnames << cluster_config[server_type]['api_fqdn'] unless cluster_config[server_type]['api_fqdn'].nil?
|
196
|
+
hostnames << cluster_config[server_type]['analytics_fqdn'] unless cluster_config[server_type]['analytics_fqdn'].nil?
|
197
|
+
hostnames.concat(cluster_config[server_type]['servers'].keys) unless cluster_config[server_type]['servers'].nil?
|
198
|
+
mounts.concat(cluster_config[server_type]['mounts']) unless cluster_config[server_type]['mounts'].nil?
|
199
|
+
ssh_keys.concat(cluster_config[server_type]['ssh-keys']) unless cluster_config[server_type]['ssh-keys'].nil?
|
200
|
+
end
|
201
|
+
end
|
202
|
+
unless base_container_names.empty?
|
203
|
+
base_container_names.each do |base_container_name|
|
204
|
+
unless ::DevLXC::Container.new(base_container_name).defined?
|
205
|
+
puts "ERROR: Base container #{base_container_name} does not exist."
|
206
|
+
exit 1
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
unless hostnames.empty?
|
211
|
+
hostnames.each do |hostname|
|
212
|
+
unless hostname.end_with?(".lxc")
|
213
|
+
puts "ERROR: Hostname #{hostname} does not end with '.lxc'."
|
214
|
+
exit 1
|
49
215
|
end
|
50
216
|
end
|
51
217
|
end
|
218
|
+
unless mounts.empty?
|
219
|
+
mounts.each do |mount|
|
220
|
+
unless File.exists?(mount.split.first)
|
221
|
+
puts "ERROR: Mount source #{mount.split.first} does not exist."
|
222
|
+
exit 1
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
unless ssh_keys.empty?
|
227
|
+
ssh_keys.each do |ssh_key|
|
228
|
+
unless File.exists?(ssh_key)
|
229
|
+
puts "ERROR: SSH key #{ssh_key} does not exist."
|
230
|
+
exit 1
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def get_server(server_name)
|
237
|
+
ipaddress = @server_configs[server_name][:ipaddress]
|
238
|
+
additional_fqdn = @server_configs[server_name][:additional_fqdn]
|
239
|
+
mounts = @server_configs[server_name][:mounts]
|
240
|
+
ssh_keys = @server_configs[server_name][:ssh_keys]
|
241
|
+
Server.new(server_name, ipaddress, additional_fqdn, mounts, ssh_keys)
|
242
|
+
end
|
52
243
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
244
|
+
def get_sorted_servers(server_name_regex=nil)
|
245
|
+
servers = Array.new
|
246
|
+
|
247
|
+
# the order of this list of server_types matters
|
248
|
+
# it determines the order in which actions are applied to each server_type
|
249
|
+
%w(chef-backend chef-server analytics compliance supermarket nodes adhoc).each do |server_type|
|
250
|
+
unless @config[server_type].empty?
|
251
|
+
case server_type
|
252
|
+
when "chef-backend"
|
253
|
+
@config[server_type][:backends].each do |backend_name|
|
254
|
+
servers << get_server(backend_name)
|
255
|
+
end
|
256
|
+
@config[server_type][:frontends].each do |frontend_name|
|
257
|
+
servers << get_server(frontend_name)
|
258
|
+
end
|
259
|
+
when "analytics", "chef-server"
|
260
|
+
if @config[server_type][:bootstrap_backend]
|
261
|
+
server_name = @config[server_type][:bootstrap_backend]
|
262
|
+
servers << get_server(server_name)
|
263
|
+
end
|
264
|
+
@config[server_type][:frontends].each do |frontend_name|
|
265
|
+
servers << get_server(frontend_name)
|
266
|
+
end
|
267
|
+
when "adhoc", "compliance", "nodes", "supermarket"
|
268
|
+
server_configs = @server_configs.select { |server_name, server_config| server_config[:server_type] == server_type }
|
269
|
+
server_configs.each_key { |server_name| servers << get_server(server_name) }
|
270
|
+
end
|
57
271
|
end
|
58
272
|
end
|
273
|
+
servers.select { |s| s.name =~ /#{server_name_regex}/ }
|
274
|
+
end
|
59
275
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
276
|
+
def up(server_name_regex=nil)
|
277
|
+
abort_up = false
|
278
|
+
configured_servers = Array.new
|
279
|
+
servers = get_sorted_servers(server_name_regex)
|
280
|
+
servers.each do |server|
|
281
|
+
next if server.container.defined?
|
282
|
+
if (@config['chef-server'][:frontends] && @config['chef-server'][:frontends].include?(server.name)) || server.name == @config['analytics'][:bootstrap_backend]
|
283
|
+
if @config['chef-server'][:bootstrap_backend].nil?
|
284
|
+
puts "ERROR: '#{server.name}' requires a Chef Server bootstrap backend to be configured first."
|
285
|
+
abort_up = true
|
286
|
+
elsif !get_server(@config['chef-server'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
|
287
|
+
puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
|
288
|
+
abort_up = true
|
289
|
+
end
|
64
290
|
end
|
291
|
+
if @config['chef-server'][:bootstrap_backend] && @server_configs[server.name][:server_type] == 'supermarket'
|
292
|
+
if !get_server(@config['chef-server'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
|
293
|
+
puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
|
294
|
+
abort_up = true
|
295
|
+
end
|
296
|
+
end
|
297
|
+
if @config['analytics'][:frontends] && @config['analytics'][:frontends].include?(server.name)
|
298
|
+
if @config['analytics'][:bootstrap_backend].nil?
|
299
|
+
puts "ERROR: '#{server.name}' requires an Analytics Server bootstrap backend to be configured first."
|
300
|
+
abort_up = true
|
301
|
+
elsif !get_server(@config['analytics'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['analytics'][:bootstrap_backend] }.empty?
|
302
|
+
puts "ERROR: '#{server.name}' requires '#{@config['analytics'][:bootstrap_backend]}' to be configured first."
|
303
|
+
abort_up = true
|
304
|
+
end
|
305
|
+
end
|
306
|
+
if @config['chef-backend'][:frontends] && @config['chef-backend'][:frontends].include?(server.name) && server.name != @config['chef-backend'][:bootstrap_frontend]
|
307
|
+
if @config['chef-backend'][:bootstrap_frontend].nil?
|
308
|
+
puts "ERROR: '#{server.name}' requires a Chef Server bootstrap frontend to be configured first."
|
309
|
+
abort_up = true
|
310
|
+
elsif !get_server(@config['chef-backend'][:bootstrap_frontend]).container.defined? && servers.select { |s| s.name == @config['chef-backend'][:bootstrap_frontend] }.empty?
|
311
|
+
puts "ERROR: '#{server.name}' requires '#{@config['chef-backend'][:bootstrap_frontend]}' to be configured first."
|
312
|
+
abort_up = true
|
313
|
+
end
|
314
|
+
end
|
315
|
+
if server.name == @config['chef-backend'][:bootstrap_frontend]
|
316
|
+
if (@config['chef-backend'][:backends].select { |s| get_server(s).container.running? }.length + servers.select { |s| @config['chef-backend'][:backends].include?(s.name) }.length) < 2
|
317
|
+
puts "ERROR: '#{server.name}' requires at least two nodes in the backend cluster to be running first."
|
318
|
+
abort_up = true
|
319
|
+
end
|
320
|
+
end
|
321
|
+
if @config['chef-backend'][:backends] && @config['chef-backend'][:backends].include?(server.name) && server.name != @config['chef-backend'][:leader_backend]
|
322
|
+
if !get_server(@config['chef-backend'][:leader_backend]).container.running? && servers.select { |s| s.name == @config['chef-backend'][:leader_backend] }.empty?
|
323
|
+
puts "ERROR: '#{server.name}' requires '#{@config['chef-backend'][:leader_backend]}' to be running first."
|
324
|
+
abort_up = true
|
325
|
+
end
|
326
|
+
end
|
327
|
+
if @server_configs[server.name][:server_type] == 'nodes'
|
328
|
+
if @server_configs[server.name][:chef_server_url].nil? && @server_configs[server.name][:validation_client_name].nil? & @server_configs[server.name][:validation_key].nil?
|
329
|
+
if @config['chef-server'][:bootstrap_backend] && !get_server(@config['chef-server'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
|
330
|
+
puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
|
331
|
+
abort_up = true
|
332
|
+
elsif @config['chef-backend'][:bootstrap_frontend] && !get_server(@config['chef-backend'][:bootstrap_frontend]).container.defined? && servers.select { |s| s.name == @config['chef-backend'][:bootstrap_frontend] }.empty?
|
333
|
+
puts "ERROR: '#{server.name}' requires '#{@config['chef-backend'][:bootstrap_frontend]}' to be configured first."
|
334
|
+
abort_up = true
|
335
|
+
end
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|
339
|
+
exit 1 if abort_up
|
340
|
+
prep_product_cache(servers)
|
341
|
+
servers.each do |server|
|
342
|
+
clone_from_base_container(server) unless server.container.defined?
|
343
|
+
end
|
344
|
+
servers = get_sorted_servers(server_name_regex)
|
345
|
+
servers.each do |server|
|
346
|
+
install_products(server) unless @server_configs[server.name][:required_products].empty?
|
65
347
|
end
|
348
|
+
servers.each do |server|
|
349
|
+
if server.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: completed") }.empty?
|
350
|
+
if server.name == @config["chef-backend"][:bootstrap_frontend]
|
351
|
+
running_backends = Array.new
|
352
|
+
@config["chef-backend"][:backends].reverse_each do |server_name|
|
353
|
+
backend = get_server(server_name)
|
354
|
+
if backend.container.defined? && backend.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: backend cluster configured but frontend not bootstrapped") }.empty?
|
355
|
+
if backend.container.running?
|
356
|
+
running_backends << backend.name
|
357
|
+
backend.stop
|
358
|
+
end
|
359
|
+
backend.snapshot("dev-lxc build: backend cluster configured but frontend not bootstrapped")
|
360
|
+
snapshot = backend.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: completed") }.first
|
361
|
+
backend.snapshot_destroy(snapshot.first) if snapshot
|
362
|
+
end
|
363
|
+
end
|
364
|
+
@config["chef-backend"][:backends].each do |server_name|
|
365
|
+
if running_backends.include?(server_name)
|
366
|
+
get_server(server_name).start
|
367
|
+
configured_servers << server_name unless configured_servers.include?(server_name)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
configure_products(server)
|
372
|
+
configured_servers << server.name
|
373
|
+
end
|
374
|
+
server.start unless server.container.running?
|
375
|
+
end
|
376
|
+
configured_servers.reverse_each do |server_name|
|
377
|
+
server = get_server(server_name)
|
378
|
+
server.stop if server.container.running?
|
379
|
+
server.snapshot("dev-lxc build: completed")
|
380
|
+
end
|
381
|
+
configured_servers.each do |server_name|
|
382
|
+
server = get_server(server_name)
|
383
|
+
server.start if server.container.defined?
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
def clone_from_base_container(server)
|
388
|
+
server_type = @server_configs[server.name][:server_type]
|
389
|
+
base_container = DevLXC::Container.new(@config[server_type][:base_container_name])
|
390
|
+
puts "Cloning base container '#{base_container.name}' into container '#{server.name}'"
|
391
|
+
base_container.clone(server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT})
|
392
|
+
server.container.load_config
|
393
|
+
puts "Deleting SSH Server Host Keys"
|
394
|
+
FileUtils.rm_f(Dir.glob("#{server.container.config_item('lxc.rootfs')}/etc/ssh/ssh_host*_key*"))
|
395
|
+
puts "Adding lxc.hook.post-stop hook"
|
396
|
+
server.container.set_config_item("lxc.hook.post-stop", "/usr/local/share/lxc/hooks/post-stop-dhcp-release")
|
397
|
+
server.container.save_config
|
66
398
|
end
|
67
399
|
|
68
|
-
def
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
400
|
+
def get_product_url(server, product_name, product_options)
|
401
|
+
server_type = @server_configs[server.name][:server_type]
|
402
|
+
base_container = DevLXC::Container.new(@config[server_type][:base_container_name])
|
403
|
+
mixlib_install_platform_detection_path = "#{base_container.config_item('lxc.rootfs')}/mixlib-install-platform-detection"
|
404
|
+
IO.write(mixlib_install_platform_detection_path, Mixlib::Install::Generator::Bourne.detect_platform_sh)
|
405
|
+
platform_results = `chroot #{base_container.config_item('lxc.rootfs')} bash mixlib-install-platform-detection`
|
406
|
+
File.unlink(mixlib_install_platform_detection_path)
|
407
|
+
if platform_results.empty?
|
408
|
+
puts "ERROR: Unable to detect the platform of container '#{base_container.name}'"
|
409
|
+
exit 1
|
410
|
+
end
|
411
|
+
(platform, platform_version, architecture) = platform_results.split
|
412
|
+
product_version = product_options['version'] if product_options
|
413
|
+
product_version ||= 'latest'
|
414
|
+
channel = product_options['channel'] if product_options
|
415
|
+
channel ||= 'stable'
|
416
|
+
channel = channel.to_sym
|
417
|
+
options = {
|
418
|
+
product_name: product_name,
|
419
|
+
product_version: product_version,
|
420
|
+
channel: channel,
|
421
|
+
platform: platform,
|
422
|
+
platform_version: platform_version,
|
423
|
+
architecture: architecture
|
424
|
+
}
|
425
|
+
artifact = Mixlib::Install.new(options).artifact_info
|
426
|
+
if artifact.class != Mixlib::Install::ArtifactInfo
|
427
|
+
puts "ERROR: Unable to find download URL for the following product"
|
428
|
+
puts JSON.pretty_generate(options)
|
429
|
+
exit 1
|
430
|
+
end
|
431
|
+
artifact.url
|
432
|
+
end
|
433
|
+
|
434
|
+
def prep_product_cache(servers)
|
435
|
+
all_required_products = Hash.new
|
436
|
+
servers.each do |server|
|
437
|
+
products = @server_configs[server.name][:products]
|
438
|
+
@server_configs[server.name][:required_products] = Hash.new
|
439
|
+
if !server.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: products installed") }.empty?
|
440
|
+
puts "Skipping product cache preparation for container '#{server.name}' because it has a 'products installed' snapshot"
|
441
|
+
next
|
442
|
+
end
|
443
|
+
products.each do |product_name, product_options|
|
444
|
+
if product_options && product_options['package_source']
|
445
|
+
package_source = product_options['package_source']
|
446
|
+
all_required_products[package_source] = product_name
|
447
|
+
@server_configs[server.name][:required_products][product_name] = package_source
|
448
|
+
else
|
449
|
+
package_source = get_product_url(server, product_name, product_options)
|
450
|
+
all_required_products[package_source] = product_name
|
451
|
+
product_cache_path = "/var/dev-lxc/cache/chef-products/#{product_name}/#{File.basename(package_source)}"
|
452
|
+
@server_configs[server.name][:required_products][product_name] = product_cache_path
|
453
|
+
end
|
454
|
+
end
|
455
|
+
end
|
456
|
+
all_required_products.each do |package_source, product_name|
|
457
|
+
if package_source.start_with?('http')
|
458
|
+
product_cache_path = "/var/dev-lxc/cache/chef-products/#{product_name}/#{File.basename(package_source)}"
|
459
|
+
if !File.exist?(product_cache_path)
|
460
|
+
FileUtils.mkdir_p(File.dirname(product_cache_path)) unless Dir.exist?(File.dirname(product_cache_path))
|
461
|
+
puts "Downloading #{package_source} to #{product_cache_path}"
|
462
|
+
open(package_source) { |url| File.open(product_cache_path, 'wb') { |f| f.write(url.read) } }
|
463
|
+
end
|
464
|
+
elsif !File.exist?(package_source)
|
465
|
+
puts "ERROR: Package source #{package_source} does not exist."
|
466
|
+
exit 1
|
74
467
|
end
|
75
468
|
end
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
469
|
+
end
|
470
|
+
|
471
|
+
def install_products(server)
|
472
|
+
if !server.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: products installed") }.empty?
|
473
|
+
puts "Skipping product installation for container '#{server.name}' because it already has a 'products installed' snapshot"
|
474
|
+
return
|
475
|
+
end
|
476
|
+
if server.container.running?
|
477
|
+
server_was_running = true
|
478
|
+
else
|
479
|
+
server_was_running = false
|
480
|
+
server.start
|
481
|
+
end
|
482
|
+
@server_configs[server.name][:required_products].each do |product_name, package_source|
|
483
|
+
server.install_package(package_source)
|
484
|
+
end
|
485
|
+
server.stop
|
486
|
+
server.snapshot("dev-lxc build: products installed")
|
487
|
+
server.start if server_was_running
|
488
|
+
end
|
489
|
+
|
490
|
+
def configure_products(server)
|
491
|
+
puts "Configuring container '#{server.name}'"
|
492
|
+
server.start unless server.container.running?
|
493
|
+
required_products = @server_configs[server.name][:required_products].keys if @server_configs[server.name][:required_products]
|
494
|
+
required_products ||= Array.new
|
495
|
+
server_type = @server_configs[server.name][:server_type]
|
496
|
+
case server_type
|
497
|
+
when 'adhoc'
|
498
|
+
# Allow adhoc servers time to generate SSH Server Host Keys
|
499
|
+
sleep 5
|
500
|
+
when 'analytics'
|
501
|
+
configure_analytics(server) if required_products.include?('analytics')
|
502
|
+
when 'chef-backend'
|
503
|
+
configure_chef_backend(server) if required_products.include?('chef-backend')
|
504
|
+
if required_products.include?('chef-server')
|
505
|
+
configure_chef_frontend(server)
|
506
|
+
create_users(server) if server.name == @config['chef-backend'][:bootstrap_frontend]
|
507
|
+
end
|
508
|
+
configure_manage(server) if required_products.include?('manage')
|
509
|
+
when 'chef-server'
|
510
|
+
if required_products.include?('chef-server') || required_products.include?('private-chef')
|
511
|
+
configure_chef_server(server)
|
512
|
+
create_users(server) if server.name == @config['chef-server'][:bootstrap_backend]
|
81
513
|
end
|
514
|
+
configure_reporting(server) if required_products.include?('reporting')
|
515
|
+
configure_push_jobs_server(server) if required_products.include?('push-jobs-server')
|
516
|
+
configure_manage(server) if required_products.include?('manage')
|
517
|
+
when 'compliance'
|
518
|
+
configure_compliance(server) if required_products.include?('compliance')
|
519
|
+
when 'nodes'
|
520
|
+
configure_chef_client(server) if required_products.include?('chef') || required_products.include?('chefdk')
|
521
|
+
when 'supermarket'
|
522
|
+
configure_supermarket(server) if required_products.include?('supermarket')
|
523
|
+
end
|
524
|
+
end
|
525
|
+
|
526
|
+
def configure_chef_client(server)
|
527
|
+
if @server_configs[server.name][:chef_server_url] || @server_configs[server.name][:validation_client_name] || @server_configs[server.name][:validation_key]
|
528
|
+
chef_server_url = @server_configs[server.name][:chef_server_url]
|
529
|
+
validation_client_name = @server_configs[server.name][:validation_client_name]
|
530
|
+
validation_key = @server_configs[server.name][:validation_key]
|
531
|
+
elsif @config['chef-server'][:bootstrap_backend] && get_server(@config['chef-server'][:bootstrap_backend]).container.defined?
|
532
|
+
chef_server_url = "https://#{@config['chef-server'][:fqdn]}/organizations/demo"
|
533
|
+
validation_client_name = 'demo-validator'
|
534
|
+
validation_key = "#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/root/chef-repo/.chef/demo-validator.pem"
|
535
|
+
elsif @config['chef-backend'][:bootstrap_frontend] && get_server(@config['chef-backend'][:bootstrap_frontend]).container.defined?
|
536
|
+
chef_server_url = "https://#{@config['chef-backend'][:fqdn]}/organizations/demo"
|
537
|
+
validation_client_name = 'demo-validator'
|
538
|
+
validation_key = "#{get_server(@config['chef-backend'][:bootstrap_frontend]).container.config_item('lxc.rootfs')}/root/chef-repo/.chef/demo-validator.pem"
|
539
|
+
end
|
540
|
+
|
541
|
+
puts "Configuring Chef Client in container '#{server.name}' for Chef Server '#{chef_server_url}'"
|
542
|
+
|
543
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/chef")
|
544
|
+
|
545
|
+
client_rb = %Q(chef_server_url '#{chef_server_url}'
|
546
|
+
validation_client_name '#{validation_client_name}'
|
547
|
+
ssl_verify_mode :verify_none
|
548
|
+
)
|
549
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/etc/chef/client.rb", client_rb)
|
550
|
+
|
551
|
+
if validation_key && File.exist?(validation_key)
|
552
|
+
FileUtils.cp(validation_key, "#{server.container.config_item('lxc.rootfs')}/etc/chef/validation.pem")
|
553
|
+
else
|
554
|
+
puts "WARNING: The validation key '#{validation_key}' does not exist."
|
555
|
+
end
|
556
|
+
end
|
557
|
+
|
558
|
+
def configure_chef_backend(server)
|
559
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-backend")
|
560
|
+
FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-backend/.license.accepted")
|
561
|
+
if server.name == @config['chef-backend'][:leader_backend]
|
562
|
+
puts "Creating /etc/chef-backend/chef-backend.rb"
|
563
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/chef-backend")
|
564
|
+
chef_backend_config = "publish_address '#{@server_configs[server.name][:ipaddress]}'\n"
|
565
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/etc/chef-backend/chef-backend.rb", chef_backend_config)
|
566
|
+
run_ctl(server, "chef-backend", "bootstrap --yes")
|
567
|
+
else
|
568
|
+
puts "Joining #{server.name} to the chef-backend cluster"
|
569
|
+
leader_backend = get_server(@config['chef-backend'][:leader_backend])
|
570
|
+
FileUtils.cp("#{leader_backend.container.config_item('lxc.rootfs')}/etc/chef-backend/secrets.json",
|
571
|
+
"#{server.container.config_item('lxc.rootfs')}/root/")
|
572
|
+
run_ctl(server, "chef-backend", "join-cluster #{@server_configs[leader_backend.name][:ipaddress]} -p #{@server_configs[server.name][:ipaddress]} -s /root/secrets.json --yes")
|
82
573
|
end
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
574
|
+
end
|
575
|
+
|
576
|
+
def configure_chef_frontend(server)
|
577
|
+
puts "Creating /etc/opscode/chef-server.rb"
|
578
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/opscode")
|
579
|
+
leader_backend = get_server(@config['chef-backend'][:leader_backend])
|
580
|
+
run_ctl(leader_backend, "chef-backend", "gen-server-config #{server.name} --filename /tmp/#{server.name}.rb")
|
581
|
+
FileUtils.cp("#{leader_backend.container.config_item('lxc.rootfs')}/tmp/#{server.name}.rb",
|
582
|
+
"#{server.container.config_item('lxc.rootfs')}/etc/opscode/chef-server.rb")
|
583
|
+
unless server.name == @config['chef-backend'][:bootstrap_frontend]
|
584
|
+
bootstrap_frontend = get_server(@config['chef-backend'][:bootstrap_frontend])
|
585
|
+
puts "Copying /etc/opscode/private-chef-secrets.json from bootstrap frontend '#{bootstrap_frontend.name}'"
|
586
|
+
FileUtils.cp("#{bootstrap_frontend.container.config_item('lxc.rootfs')}/etc/opscode/private-chef-secrets.json",
|
587
|
+
"#{server.container.config_item('lxc.rootfs')}/etc/opscode/")
|
588
|
+
puts "Copying /etc/opscode/pivotal.pem from bootstrap frontend '#{bootstrap_frontend.name}'"
|
589
|
+
FileUtils.cp("#{bootstrap_frontend.container.config_item('lxc.rootfs')}/etc/opscode/pivotal.pem",
|
590
|
+
"#{server.container.config_item('lxc.rootfs')}/etc/opscode/")
|
591
|
+
end
|
592
|
+
run_ctl(server, "chef-server", "reconfigure")
|
593
|
+
end
|
594
|
+
|
595
|
+
def configure_chef_server(server)
|
596
|
+
if @config['chef-server'][:topology] == "standalone" || @config['chef-server'][:bootstrap_backend] == server.name
|
597
|
+
case @server_configs[server.name][:chef_server_type]
|
598
|
+
when 'private-chef'
|
599
|
+
puts "Creating /etc/opscode/private-chef.rb"
|
600
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/opscode")
|
601
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/etc/opscode/private-chef.rb", chef_server_config)
|
602
|
+
when 'chef-server'
|
603
|
+
puts "Creating /etc/opscode/chef-server.rb"
|
604
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/opscode")
|
605
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/etc/opscode/chef-server.rb", chef_server_config)
|
87
606
|
end
|
607
|
+
elsif @config['chef-server'][:frontends].include?(server.name)
|
608
|
+
puts "Copying /etc/opscode from bootstrap backend '#{@config['chef-server'][:bootstrap_backend]}'"
|
609
|
+
FileUtils.cp_r("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode",
|
610
|
+
"#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
|
611
|
+
end
|
612
|
+
run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
|
613
|
+
end
|
614
|
+
|
615
|
+
def configure_reporting(server)
|
616
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-reporting")
|
617
|
+
FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-reporting/.license.accepted")
|
618
|
+
if @config['chef-server'][:frontends].include?(server.name)
|
619
|
+
puts "Copying /etc/opscode-reporting from bootstrap backend '#{@config['chef-server'][:bootstrap_backend]}'"
|
620
|
+
FileUtils.cp_r("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode-reporting",
|
621
|
+
"#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
|
622
|
+
end
|
623
|
+
run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
|
624
|
+
run_ctl(server, "opscode-reporting", "reconfigure")
|
625
|
+
end
|
626
|
+
|
627
|
+
def configure_push_jobs_server(server)
|
628
|
+
run_ctl(server, "opscode-push-jobs-server", "reconfigure")
|
629
|
+
run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
|
630
|
+
end
|
631
|
+
|
632
|
+
def configure_manage(server)
|
633
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-manage")
|
634
|
+
FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-manage/.license.accepted")
|
635
|
+
if @server_configs[server.name][:chef_server_type] == 'private-chef'
|
636
|
+
puts "Disabling old opscode-webui in /etc/opscode/private-chef.rb"
|
637
|
+
DevLXC.search_file_delete_line("#{server.container.config_item('lxc.rootfs')}/etc/opscode/private-chef.rb", /opscode_webui[.enable.]/)
|
638
|
+
DevLXC.append_line_to_file("#{server.container.config_item('lxc.rootfs')}/etc/opscode/private-chef.rb", "\nopscode_webui['enable'] = false\n")
|
639
|
+
run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
|
640
|
+
end
|
641
|
+
run_ctl(server, "opscode-manage", "reconfigure")
|
642
|
+
end
|
643
|
+
|
644
|
+
def configure_analytics(server)
|
645
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-analytics")
|
646
|
+
FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-analytics/.license.accepted")
|
647
|
+
if @config['analytics'][:topology] == "standalone" || @config['analytics'][:bootstrap_backend] == server.name
|
648
|
+
puts "Copying /etc/opscode-analytics from Chef Server bootstrap backend '#{@config['chef-server'][:bootstrap_backend]}'"
|
649
|
+
FileUtils.cp_r("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode-analytics",
|
650
|
+
"#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
|
651
|
+
|
652
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/etc/opscode-analytics/opscode-analytics.rb", analytics_config)
|
653
|
+
elsif @config['analytics'][:frontends].include?(server.name)
|
654
|
+
puts "Copying /etc/opscode-analytics from Analytics bootstrap backend '#{@config['analytics'][:bootstrap_backend]}'"
|
655
|
+
FileUtils.cp_r("#{get_server(@config['analytics'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode-analytics",
|
656
|
+
"#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
|
657
|
+
end
|
658
|
+
run_ctl(server, "opscode-analytics", "reconfigure")
|
659
|
+
end
|
660
|
+
|
661
|
+
def configure_compliance(server)
|
662
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-compliance")
|
663
|
+
FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-compliance/.license.accepted")
|
664
|
+
run_ctl(server, "chef-compliance", "reconfigure")
|
665
|
+
end
|
666
|
+
|
667
|
+
def configure_supermarket(server)
|
668
|
+
if @config['chef-server'][:bootstrap_backend] && get_server(@config['chef-server'][:bootstrap_backend]).container.defined?
|
669
|
+
chef_server_supermarket_config = JSON.parse(IO.read("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode/oc-id-applications/supermarket.json"))
|
670
|
+
supermarket_config = {
|
671
|
+
'chef_server_url' => "https://#{@config['chef-server'][:fqdn]}/",
|
672
|
+
'chef_oauth2_app_id' => chef_server_supermarket_config['uid'],
|
673
|
+
'chef_oauth2_secret' => chef_server_supermarket_config['secret'],
|
674
|
+
'chef_oauth2_verify_ssl' => false
|
675
|
+
}
|
676
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/supermarket")
|
677
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/etc/supermarket/supermarket.json", JSON.pretty_generate(supermarket_config))
|
678
|
+
end
|
679
|
+
run_ctl(server, "supermarket", "reconfigure")
|
680
|
+
end
|
681
|
+
|
682
|
+
def run_ctl(server, component, subcommand)
|
683
|
+
server.run_command("#{component}-ctl #{subcommand}")
|
684
|
+
end
|
685
|
+
|
686
|
+
def create_users(server)
|
687
|
+
puts "Creating org, user, keys and knife.rb in /root/chef-repo/.chef"
|
688
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef")
|
689
|
+
|
690
|
+
chef_server_root = "https://127.0.0.1"
|
691
|
+
chef_server_url = "https://127.0.0.1/organizations/demo"
|
692
|
+
admin_username = "mary-admin"
|
693
|
+
username = "joe-user"
|
694
|
+
validator_name = "demo-validator"
|
695
|
+
|
696
|
+
FileUtils.cp( "#{server.container.config_item('lxc.rootfs')}/etc/opscode/pivotal.pem", "#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef" )
|
697
|
+
|
698
|
+
pivotal_rb = %Q(
|
699
|
+
current_dir = File.dirname(__FILE__)
|
700
|
+
|
701
|
+
chef_server_root "#{chef_server_root}"
|
702
|
+
chef_server_url "#{chef_server_root}"
|
703
|
+
|
704
|
+
node_name "pivotal"
|
705
|
+
client_key "\#{current_dir}/pivotal.pem"
|
706
|
+
|
707
|
+
cookbook_path Dir.pwd + "/cookbooks"
|
708
|
+
knife[:chef_repo_path] = Dir.pwd
|
709
|
+
|
710
|
+
ssl_verify_mode :verify_none
|
711
|
+
)
|
712
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/pivotal.rb", pivotal_rb)
|
713
|
+
|
714
|
+
knife_rb = %Q(
|
715
|
+
current_dir = File.dirname(__FILE__)
|
716
|
+
|
717
|
+
chef_server_url "#{chef_server_url}"
|
718
|
+
|
719
|
+
node_name "#{admin_username}"
|
720
|
+
client_key "\#{current_dir}/#{admin_username}.pem"
|
721
|
+
)
|
722
|
+
|
723
|
+
knife_rb += %Q(
|
724
|
+
#node_name "#{username}"
|
725
|
+
#client_key "\#{current_dir}/#{username}.pem"
|
726
|
+
) unless username.nil?
|
727
|
+
|
728
|
+
knife_rb += %Q(
|
729
|
+
validation_client_name "#{validator_name}"
|
730
|
+
validation_key "\#{current_dir}/#{validator_name}.pem"
|
731
|
+
|
732
|
+
cookbook_path Dir.pwd + "/cookbooks"
|
733
|
+
knife[:chef_repo_path] = Dir.pwd
|
734
|
+
|
735
|
+
ssl_verify_mode :verify_none
|
736
|
+
)
|
737
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/knife.rb", knife_rb)
|
738
|
+
|
739
|
+
case @server_configs[server.name][:chef_server_type]
|
740
|
+
when 'private-chef'
|
741
|
+
# give time for all services to come up completely
|
742
|
+
sleep 60
|
743
|
+
server.run_command("/opt/opscode/embedded/bin/gem install knife-opc --no-ri --no-rdoc -v 0.3.1")
|
744
|
+
server.run_command("/opt/opscode/embedded/bin/knife opc org create demo demo --filename /root/chef-repo/.chef/demo-validator.pem -c /root/chef-repo/.chef/pivotal.rb")
|
745
|
+
server.run_command("/opt/opscode/embedded/bin/knife opc user create mary-admin mary admin mary-admin@noreply.com mary-admin --filename /root/chef-repo/.chef/mary-admin.pem -c /root/chef-repo/.chef/pivotal.rb")
|
746
|
+
server.run_command("/opt/opscode/embedded/bin/knife opc org user add demo mary-admin --admin -c /root/chef-repo/.chef/pivotal.rb")
|
747
|
+
server.run_command("/opt/opscode/embedded/bin/knife opc user create joe-user joe user joe-user@noreply.com joe-user --filename /root/chef-repo/.chef/joe-user.pem -c /root/chef-repo/.chef/pivotal.rb")
|
748
|
+
server.run_command("/opt/opscode/embedded/bin/knife opc org user add demo joe-user -c /root/chef-repo/.chef/pivotal.rb")
|
749
|
+
when 'chef-server'
|
750
|
+
# give time for all services to come up completely
|
751
|
+
sleep 10
|
752
|
+
run_ctl(server, "chef-server", "org-create demo demo --filename /root/chef-repo/.chef/demo-validator.pem")
|
753
|
+
run_ctl(server, "chef-server", "user-create mary-admin mary admin mary-admin@noreply.com mary-admin --filename /root/chef-repo/.chef/mary-admin.pem")
|
754
|
+
run_ctl(server, "chef-server", "org-user-add demo mary-admin --admin")
|
755
|
+
run_ctl(server, "chef-server", "user-create joe-user joe user joe-user@noreply.com joe-user --filename /root/chef-repo/.chef/joe-user.pem")
|
756
|
+
run_ctl(server, "chef-server", "org-user-add demo joe-user")
|
88
757
|
end
|
89
|
-
servers = chef_servers + analytics_servers
|
90
|
-
servers << Server.new(@compliance_fqdn, 'compliance', @cluster_config) if @compliance_fqdn
|
91
|
-
servers << Server.new(@supermarket_fqdn, 'supermarket', @cluster_config) if @supermarket_fqdn
|
92
|
-
servers += adhoc_servers
|
93
|
-
servers
|
94
758
|
end
|
95
759
|
|
96
760
|
def chef_repo(force=false, pivotal=false)
|
97
|
-
if @
|
761
|
+
if @config['chef-server'][:bootstrap_backend].nil?
|
98
762
|
puts "ERROR: A bootstrap backend Chef Server is not defined in the cluster's config. Please define it first."
|
99
763
|
exit 1
|
100
764
|
end
|
101
|
-
chef_server =
|
102
|
-
if ! chef_server.
|
103
|
-
puts "ERROR: The '#{chef_server.
|
765
|
+
chef_server = get_server(@config['chef-server'][:bootstrap_backend])
|
766
|
+
if ! chef_server.container.defined?
|
767
|
+
puts "ERROR: The '#{chef_server.name}' Chef Server does not exist."
|
104
768
|
exit 1
|
105
769
|
end
|
106
770
|
|
107
771
|
puts "Creating chef-repo with pem files and knife.rb in the current directory"
|
108
772
|
FileUtils.mkdir_p("./chef-repo/.chef")
|
109
773
|
|
110
|
-
pem_files = Dir.glob("#{chef_server.
|
774
|
+
pem_files = Dir.glob("#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/*.pem")
|
111
775
|
if pem_files.empty?
|
112
|
-
puts "The pem files can not be copied because they do not exist in '#{chef_server.
|
776
|
+
puts "The pem files can not be copied because they do not exist in '#{chef_server.name}' Chef Server's `/root/chef-repo/.chef` directory"
|
113
777
|
else
|
114
778
|
pem_files.delete_if { |pem_file| pem_file.end_with?("/pivotal.pem") } unless pivotal
|
115
779
|
FileUtils.cp( pem_files, "./chef-repo/.chef" )
|
116
780
|
end
|
117
781
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
else
|
122
|
-
chef_server_root = "https://#{@api_fqdn}"
|
123
|
-
chef_server_url = "https://#{@api_fqdn}/organizations/demo"
|
124
|
-
validator_name = "demo-validator"
|
782
|
+
chef_server_root = "https://#{@config['chef-server'][:fqdn]}"
|
783
|
+
chef_server_url = "https://#{@config['chef-server'][:fqdn]}/organizations/demo"
|
784
|
+
validator_name = "demo-validator"
|
125
785
|
|
126
|
-
|
127
|
-
|
128
|
-
|
786
|
+
if pivotal
|
787
|
+
if File.exists?("./chef-repo/.chef/pivotal.rb") && ! force
|
788
|
+
puts "Skipping pivotal.rb because it already exists in `./chef-repo/.chef`"
|
789
|
+
else
|
790
|
+
pivotal_rb_path = "#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/pivotal.rb"
|
791
|
+
if File.exists?(pivotal_rb_path)
|
792
|
+
pivotal_rb = IO.read(pivotal_rb_path)
|
793
|
+
pivotal_rb.sub!(/^chef_server_root .*/, "chef_server_root \"#{chef_server_root}\"")
|
794
|
+
pivotal_rb.sub!(/^chef_server_url .*/, "chef_server_url \"#{chef_server_root}\"")
|
795
|
+
IO.write("./chef-repo/.chef/pivotal.rb", pivotal_rb)
|
129
796
|
else
|
130
|
-
|
131
|
-
if File.exists?(pivotal_rb_path)
|
132
|
-
pivotal_rb = IO.read(pivotal_rb_path)
|
133
|
-
pivotal_rb.sub!(/^chef_server_root .*/, "chef_server_root \"#{chef_server_root}\"")
|
134
|
-
pivotal_rb.sub!(/^chef_server_url .*/, "chef_server_url \"#{chef_server_root}\"")
|
135
|
-
IO.write("./chef-repo/.chef/pivotal.rb", pivotal_rb)
|
136
|
-
else
|
137
|
-
puts "The pivotal.rb file can not be copied because it does not exist in '#{chef_server.server.name}' Chef Server's `/root/chef-repo/.chef` directory"
|
138
|
-
end
|
797
|
+
puts "The pivotal.rb file can not be copied because it does not exist in '#{chef_server.name}' Chef Server's `/root/chef-repo/.chef` directory"
|
139
798
|
end
|
140
799
|
end
|
141
800
|
end
|
@@ -143,54 +802,54 @@ module DevLXC
|
|
143
802
|
if File.exists?("./chef-repo/.chef/knife.rb") && ! force
|
144
803
|
puts "Skipping knife.rb because it already exists in `./chef-repo/.chef`"
|
145
804
|
else
|
146
|
-
knife_rb_path = "#{chef_server.
|
805
|
+
knife_rb_path = "#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/knife.rb"
|
147
806
|
if File.exists?(knife_rb_path)
|
148
807
|
knife_rb = IO.read(knife_rb_path)
|
149
808
|
knife_rb.sub!(/^chef_server_url .*/, "chef_server_url \"#{chef_server_url}\"")
|
150
809
|
IO.write("./chef-repo/.chef/knife.rb", knife_rb)
|
151
810
|
else
|
152
|
-
puts "The knife.rb file can not be copied because it does not exist in '#{chef_server.
|
811
|
+
puts "The knife.rb file can not be copied because it does not exist in '#{chef_server.name}' Chef Server's `/root/chef-repo/.chef` directory"
|
153
812
|
end
|
154
813
|
end
|
155
814
|
end
|
156
815
|
|
157
816
|
def chef_server_config
|
158
|
-
chef_server_config = %Q(api_fqdn "#{@
|
159
|
-
if @
|
817
|
+
chef_server_config = %Q(api_fqdn "#{@config['chef-server'][:fqdn]}"\n)
|
818
|
+
if @config['chef-server'][:topology] == 'tier'
|
160
819
|
chef_server_config += %Q(
|
161
|
-
topology "#{@
|
820
|
+
topology "#{@config['chef-server'][:topology]}"
|
162
821
|
|
163
|
-
server "#{@
|
164
|
-
:ipaddress => "#{@
|
822
|
+
server "#{@config['chef-server'][:bootstrap_backend]}",
|
823
|
+
:ipaddress => "#{@server_configs[@config['chef-server'][:bootstrap_backend]][:ipaddress]}",
|
165
824
|
:role => "backend",
|
166
825
|
:bootstrap => true
|
167
826
|
|
168
|
-
backend_vip "#{@
|
169
|
-
:ipaddress => "#{@
|
827
|
+
backend_vip "#{@config['chef-server'][:bootstrap_backend]}",
|
828
|
+
:ipaddress => "#{@server_configs[@config['chef-server'][:bootstrap_backend]][:ipaddress]}"
|
170
829
|
)
|
171
|
-
@
|
830
|
+
@config['chef-server'][:frontends].each do |frontend_name|
|
172
831
|
chef_server_config += %Q(
|
173
832
|
server "#{frontend_name}",
|
174
|
-
:ipaddress => "#{@
|
833
|
+
:ipaddress => "#{@server_configs[frontend_name][:ipaddress]}",
|
175
834
|
:role => "frontend"
|
176
835
|
)
|
177
836
|
end
|
178
837
|
end
|
179
|
-
if @
|
838
|
+
if @config['analytics'][:fqdn]
|
180
839
|
chef_server_config += %Q(
|
181
840
|
oc_id['applications'] ||= {}
|
182
841
|
oc_id['applications']['analytics'] = {
|
183
|
-
'redirect_uri' => 'https://#{@
|
842
|
+
'redirect_uri' => 'https://#{@config['analytics'][:fqdn]}/'
|
184
843
|
}
|
185
|
-
rabbitmq['vip'] = '#{@
|
844
|
+
rabbitmq['vip'] = '#{@config['chef-server'][:bootstrap_backend]}'
|
186
845
|
rabbitmq['node_ip_address'] = '0.0.0.0'
|
187
846
|
)
|
188
847
|
end
|
189
|
-
if @
|
848
|
+
if @config['supermarket'][:fqdn]
|
190
849
|
chef_server_config += %Q(
|
191
850
|
oc_id['applications'] ||= {}
|
192
851
|
oc_id['applications']['supermarket'] = {
|
193
|
-
'redirect_uri' => 'https://#{@
|
852
|
+
'redirect_uri' => 'https://#{@config['supermarket'][:fqdn]}/auth/chef_oauth2/callback'
|
194
853
|
}
|
195
854
|
)
|
196
855
|
end
|
@@ -198,23 +857,23 @@ oc_id['applications']['supermarket'] = {
|
|
198
857
|
end
|
199
858
|
|
200
859
|
def analytics_config
|
201
|
-
analytics_config = %Q(analytics_fqdn "#{@
|
202
|
-
topology "#{@
|
860
|
+
analytics_config = %Q(analytics_fqdn "#{@config['analytics'][:fqdn]}"
|
861
|
+
topology "#{@config['analytics'][:topology]}"
|
203
862
|
)
|
204
|
-
if @
|
863
|
+
if @config['analytics'][:topology] == 'tier'
|
205
864
|
analytics_config += %Q(
|
206
|
-
server "#{@
|
207
|
-
:ipaddress => "#{@
|
865
|
+
server "#{@config['analytics'][:bootstrap_backend]}",
|
866
|
+
:ipaddress => "#{@server_configs[@config['analytics'][:bootstrap_backend]][:ipaddress]}",
|
208
867
|
:role => "backend",
|
209
868
|
:bootstrap => true
|
210
869
|
|
211
|
-
backend_vip "#{@
|
212
|
-
:ipaddress => "#{@
|
870
|
+
backend_vip "#{@config['analytics'][:bootstrap_backend]}",
|
871
|
+
:ipaddress => "#{@server_configs[@config['analytics'][:bootstrap_backend]][:ipaddress]}"
|
213
872
|
)
|
214
|
-
@
|
873
|
+
@config['analytics'][:frontends].each do |frontend_name|
|
215
874
|
analytics_config += %Q(
|
216
875
|
server "#{frontend_name}",
|
217
|
-
:ipaddress => "#{@
|
876
|
+
:ipaddress => "#{@server_configs[frontend_name][:ipaddress]}",
|
218
877
|
:role => "frontend"
|
219
878
|
)
|
220
879
|
end
|