stack-kicker 0.0.19 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/stack-kicker +9 -0
- data/lib/stack-kicker/version.rb +1 -1
- data/lib/stack.rb +27 -18
- metadata +2 -2
data/bin/stack-kicker
CHANGED
@@ -56,6 +56,12 @@ class App
|
|
56
56
|
Stack.delete_all(config)
|
57
57
|
when 'secgroup-sync'
|
58
58
|
Stack.secgroup_sync(config)
|
59
|
+
when 'ssh'
|
60
|
+
debug { "ssh-host = #{options['ssh-host']}" }
|
61
|
+
debug { "ssh-user = #{options['ssh-user']}" }
|
62
|
+
debug { "ssh-command = #{options['ssh-command']}" }
|
63
|
+
|
64
|
+
Stack.ssh(config, options['sshhost'], options['ssh-user'], options['ssh-command'] )
|
59
65
|
else
|
60
66
|
error "Sorry, #{task} hasn't been implemented yet"
|
61
67
|
end
|
@@ -76,9 +82,12 @@ class App
|
|
76
82
|
#
|
77
83
|
|
78
84
|
options[:stackfile] = 'Stackfile'
|
85
|
+
options['ssh-user'] = ENV['USER']
|
79
86
|
on("--stackfile Stackfile", "Specify an alternative Stackfile")
|
80
87
|
on("--stack mystack", "Specify the stack in Stackfile that you want to work with")
|
88
|
+
on("--ssh-host HOST", "Specify a single host, if none supplied, all hosts are executed against")
|
81
89
|
on("--ssh-user USER", "User to be used for SSH access")
|
90
|
+
on("--ssh-command \"do/something\"", "Command to be run over ssh")
|
82
91
|
on("--skip-secgroup-sync-deletes", "Skip deletes during secgroup-sync, handy for running multiple stacks in the one account with overlapping group names")
|
83
92
|
|
84
93
|
arg :task, "task to be performed validate|configure-knife|show-stacks|show-stack|show-running|build|replace|delete|secgroup-sync|ssh"
|
data/lib/stack-kicker/version.rb
CHANGED
data/lib/stack.rb
CHANGED
@@ -64,8 +64,8 @@ module Stack
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def Stack.show_stack(config)
|
67
|
-
#
|
68
|
-
Stack.
|
67
|
+
# check_config is a light weight check that doesn't talk to OpenStalk
|
68
|
+
Stack.check_config(config)
|
69
69
|
# generate an array of hostnames that this stack would create
|
70
70
|
hostnames = Stack.generate_server_names(config)
|
71
71
|
|
@@ -130,7 +130,7 @@ module Stack
|
|
130
130
|
end
|
131
131
|
|
132
132
|
# check that all the required config items are set
|
133
|
-
def Stack.
|
133
|
+
def Stack.check_config(config)
|
134
134
|
if config['REGION'].nil? || config['USERNAME'].nil? || config['PASSWORD'].nil? || config['AUTH_URL'].nil? || config['TENANT_NAME'].nil? &&
|
135
135
|
config['REGION'].empty? || config['USERNAME'].empty? || config['PASSWORD'].empty? || config['AUTH_URL'].empty? || config['TENANT_NAME'].empty?
|
136
136
|
Logger.error { "REGION, USERNAME, PASSWORD, AUTH_URL & TENANT_NAME must all be set" }
|
@@ -162,7 +162,10 @@ module Stack
|
|
162
162
|
# validate that all our OpenStack creds, image_id, flavors, keys etc are valid
|
163
163
|
def Stack.validate(config)
|
164
164
|
|
165
|
-
Stack.
|
165
|
+
Stack.check_config(config)
|
166
|
+
|
167
|
+
# populate the config & then walk through the AZs verifying the config
|
168
|
+
Stack.populate_config(config)
|
166
169
|
|
167
170
|
# check that the ssh-key is loaded, otherwise most post-install scripts will fail
|
168
171
|
# this lazily assumes that the :key_pair name matches the file the keys were loaded
|
@@ -180,9 +183,6 @@ module Stack
|
|
180
183
|
end
|
181
184
|
end
|
182
185
|
|
183
|
-
# populate the config & then walk through the AZs verifying the config
|
184
|
-
Stack.populate_config(config)
|
185
|
-
|
186
186
|
# Check that we have valid details for each AZ
|
187
187
|
config[:azs].each do |az|
|
188
188
|
|
@@ -229,7 +229,8 @@ module Stack
|
|
229
229
|
|
230
230
|
def Stack.generate_knife_rb(config)
|
231
231
|
# generate a project/.chef/knife.rb from our config
|
232
|
-
|
232
|
+
|
233
|
+
Stack.check_config(config)
|
233
234
|
|
234
235
|
# find the chef server, if we need to
|
235
236
|
if config[:chef_server_hostname].nil? || config[:chef_server_private].nil? || config[:chef_server_public]
|
@@ -299,7 +300,7 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
299
300
|
end
|
300
301
|
|
301
302
|
def Stack.generate_server_names(config)
|
302
|
-
Stack.
|
303
|
+
Stack.check_config(config)
|
303
304
|
config[:hostnames] = config[:node_details].keys
|
304
305
|
config[:hostnames]
|
305
306
|
end
|
@@ -332,7 +333,9 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
332
333
|
Logger.warn { "Defaulting to .chef/validation.pem for config[:chef_validation_pem]" }
|
333
334
|
config[:chef_validation_pem] = '.chef/validation.pem'
|
334
335
|
end
|
335
|
-
|
336
|
+
chef_validation_pem_abs = Stack.find_file(config, config[:chef_validation_pem])
|
337
|
+
# only store the abs if we found it...
|
338
|
+
config[:chef_validation_pem] = chef_validation_pem_abs unless chef_validation_pem_abs.nil?
|
336
339
|
|
337
340
|
if config[:name_template].nil?
|
338
341
|
Logger.warn { "Defaulting to '%s-%s-%s%04d' for config[:name_template]" }
|
@@ -441,7 +444,7 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
441
444
|
def Stack.get_all_instances(config, refresh = false)
|
442
445
|
if config[:all_instances].nil? || refresh
|
443
446
|
# we need to get the server list for each AZ mentioned in the config[:roles][:role][:azs], this is populated by Stack.populate_config
|
444
|
-
Stack.
|
447
|
+
Stack.check_config(config)
|
445
448
|
|
446
449
|
# get the current list of servers from OpenStack & generate a hash, keyed on name
|
447
450
|
servers = Hash.new
|
@@ -523,8 +526,15 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
523
526
|
end
|
524
527
|
end
|
525
528
|
|
529
|
+
# ssh to a host, or all hosts
|
526
530
|
def Stack.ssh(config, hostname = nil, user = ENV['USER'], command = nil)
|
527
|
-
#
|
531
|
+
# check that we have something to run
|
532
|
+
if command.nil?
|
533
|
+
Logger.error "No command passed to Stack.ssh!"
|
534
|
+
end
|
535
|
+
|
536
|
+
# sanity check our config, load defaults etc
|
537
|
+
Stack.check_config(config)
|
528
538
|
|
529
539
|
# get all running instances
|
530
540
|
servers = Stack.get_our_instances(config)
|
@@ -546,7 +556,7 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
546
556
|
def Stack.get_our_instances(config)
|
547
557
|
Logger.debug { ">>> Stack.get_our_instances" }
|
548
558
|
# build an hash of running instances that match our generated hostnames
|
549
|
-
|
559
|
+
Stack.check_config(config)
|
550
560
|
|
551
561
|
# get all of our hostnames
|
552
562
|
hostnames = Stack.generate_server_names(config)
|
@@ -559,7 +569,7 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
559
569
|
hostnames.each do |hostname|
|
560
570
|
if (servers.include?(hostname))
|
561
571
|
# return the instance details merged with the node_details (info like role)
|
562
|
-
running[hostname] = servers[hostname].merge(node_details[hostname])
|
572
|
+
running[hostname] = servers[hostname].merge(config[:node_details][hostname])
|
563
573
|
end
|
564
574
|
end
|
565
575
|
|
@@ -570,7 +580,7 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
570
580
|
|
571
581
|
def Stack.delete_node(config, node)
|
572
582
|
# this also populates out unspecified defaults, like az
|
573
|
-
Stack.
|
583
|
+
Stack.check_config(config)
|
574
584
|
# get info about all instances running in our account & AZs
|
575
585
|
Stack.get_all_instances(config)
|
576
586
|
|
@@ -585,10 +595,8 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
585
595
|
end
|
586
596
|
|
587
597
|
def Stack.delete_all(config)
|
588
|
-
# check that we have OS_* vars loaded etc
|
589
|
-
Stack.syntax_check(config)
|
590
598
|
# this also populates out unspecified defaults, like az
|
591
|
-
Stack.
|
599
|
+
Stack.check_config(config)
|
592
600
|
|
593
601
|
# get the list of nodes we consider 'ours', i.e. with hostnames that match
|
594
602
|
# those generated by this stack
|
@@ -907,6 +915,7 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
907
915
|
|
908
916
|
if filename_fqp.empty?
|
909
917
|
Logger.warn "couldn't find #{filename} in #{dirs}"
|
918
|
+
filename_fqp = nil
|
910
919
|
end
|
911
920
|
filename_fqp
|
912
921
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stack-kicker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
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: 2013-06-
|
12
|
+
date: 2013-06-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|