stack-kicker 0.0.22 → 0.0.23
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -1
- data/doc/examples/apache-via-cloud-init-centos/README.md +6 -0
- data/doc/examples/apache-via-cloud-init-centos/Stackfile +40 -0
- data/doc/examples/apache-via-cloud-init-centos/cloud-init.sh +8 -0
- data/doc/examples/apache-via-cloud-init-centos/cloud-init.yaml +24 -0
- data/doc/examples/apache-via-cloud-init-centos/secgroup_ips.json +1 -0
- data/lib/stack-kicker/version.rb +1 -1
- data/lib/stack.rb +21 -19
- metadata +7 -2
data/README.md
CHANGED
@@ -94,7 +94,11 @@ This can be an array of strings, such that node X will be assigned :floating_ips
|
|
94
94
|
These are used to construct a command to execute, which is executed locally where you executed stack-kicker. :post_install_args can contain %PUBLIC_IP%, which will be replaced by the public IP of the just created node. :post_install_script scripts are executed as soon the the instance returns a status='ACTIVE'. They can be used delay the creation of further nodes of the same role (for example, when creating a rabbitmq cluster, you need to wait for the rabbitmq process to be running before creating the next member of the cluster, or when you are creating a chef-server, you need to wait for the packages to install & daemons to start before attempting to create Chef users & retrieve keys)
|
95
95
|
|
96
96
|
## [ERB Templates](id:erbtemplates)
|
97
|
-
Both the :cloud_config_yaml & :bootstrap role attributes can point to plain files, files with simple tokens (%HOSTNAME%, %CHEF_SERVER%, %CHEF_ENVIRONMENT%, %CHEF_VALIDATION_PEM%, %SERVER_NAME%, %ROLE% and %DATA_DIR%) or [Ruby ERB](http://www.ruby-doc.org/stdlib-2.0/libdoc/erb/rdoc/ERB.html) templates.
|
97
|
+
Both the :cloud_config_yaml & :bootstrap role attributes can point to plain files, files with simple tokens (%HOSTNAME%, %CHEF_SERVER%, %CHEF_SERVER_HOSTNAME%, %CHEF_ENVIRONMENT%, %CHEF_VALIDATION_PEM%, %SERVER_NAME%, %ROLE% and %DATA_DIR%) or [Ruby ERB](http://www.ruby-doc.org/stdlib-2.0/libdoc/erb/rdoc/ERB.html) templates.
|
98
|
+
|
99
|
+
%HOSTNAME% is the short name of the instance being built
|
100
|
+
%CHEF_SERVER% is the IP address of the Chef Server, private address if the chef server & current instance are in the same AZ, public IP if they are in different AZs
|
101
|
+
%CHEF_SERVER_HOSTNAME% name of the chef server, Fully Qualified if config[:domain] is set
|
98
102
|
|
99
103
|
There are 3 key data sets exposed to the ERB templates:
|
100
104
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module StackConfig
|
2
|
+
Stacks = Hash.new
|
3
|
+
|
4
|
+
Stacks['apache-cloud-init'] = {
|
5
|
+
# (we can access environment variable via ENV['foo'] instead of hard coding u/p here)
|
6
|
+
'REGION' => ENV['OS_REGION_NAME'],
|
7
|
+
'USERNAME' => ENV['OS_USERNAME'],
|
8
|
+
'PASSWORD' => ENV['OS_PASSWORD'],
|
9
|
+
'AUTH_URL' => ENV['OS_AUTH_URL'],
|
10
|
+
'TENANT_NAME' => ENV['OS_TENANT_NAME'],
|
11
|
+
|
12
|
+
# generic instance info
|
13
|
+
'flavor_id' => 103,
|
14
|
+
'image_id' => 78265, # CentOS 6.3 64bit
|
15
|
+
# per-az image_id's
|
16
|
+
'az-2.region-a.geo-1' => { 'image_id' => 78265 },
|
17
|
+
|
18
|
+
# provisioning info
|
19
|
+
:key_pair => ENV['USER'],
|
20
|
+
:key_public => '~/.ssh/id_rsa.pub',
|
21
|
+
|
22
|
+
:name_template => '%s-%s-%s%04d', # service-site-role0001
|
23
|
+
:global_service_name => 'webci',
|
24
|
+
:site_template => '%s',
|
25
|
+
|
26
|
+
# role specification
|
27
|
+
# role names & chef roles should match
|
28
|
+
:roles => {
|
29
|
+
:web => { :count => 1,
|
30
|
+
# use the default security group
|
31
|
+
:security_group => 'default',
|
32
|
+
# don't use chef as the second-stage provisioner
|
33
|
+
:skip_chef_prereg => true,
|
34
|
+
:bootstrap => 'cloud-init.sh',
|
35
|
+
# use the yaml template that supports configuring the ephemeral space early in the boot process
|
36
|
+
:cloud_config_yaml => 'cloud-init.yaml',
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
cat > /tmp/index.html <<HEREDOC
|
4
|
+
<html><body><h1>Stack-Kicker was 'ere!</h1>
|
5
|
+
<p>This file is dropped in place by a shell script passed to the host via cloud-init</p>
|
6
|
+
<p>The web server software is running but no content has been added, yet.</p>
|
7
|
+
</body></html>
|
8
|
+
HEREDOC
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#cloud-config
|
2
|
+
|
3
|
+
manage_etc_hosts: True
|
4
|
+
|
5
|
+
hostname: %HOSTNAME%
|
6
|
+
fqdn: %HOSTNAME%.mccartney.ie
|
7
|
+
|
8
|
+
output:
|
9
|
+
all: ">> /var/log/cloud-init.log"
|
10
|
+
|
11
|
+
# use the HPCS Ubuntu Mirror for security-updates too
|
12
|
+
#bootcmd:
|
13
|
+
# - echo 127.0.1.1 %HOSTNAME% >> /etc/hosts
|
14
|
+
|
15
|
+
# Run apt-get update
|
16
|
+
package_update: true
|
17
|
+
|
18
|
+
# Run apt-get update
|
19
|
+
package_upgrade: true
|
20
|
+
|
21
|
+
# Install some packages
|
22
|
+
packages:
|
23
|
+
- apache2
|
24
|
+
- php5
|
@@ -0,0 +1 @@
|
|
1
|
+
{"web":["15.185.111.243"]}
|
data/lib/stack-kicker/version.rb
CHANGED
data/lib/stack.rb
CHANGED
@@ -248,20 +248,6 @@ module Stack
|
|
248
248
|
def Stack.generate_knife_rb(config)
|
249
249
|
# generate a project/.chef/knife.rb from our config
|
250
250
|
|
251
|
-
Stack.check_config(config)
|
252
|
-
|
253
|
-
# find the chef server, if we need to
|
254
|
-
if config[:chef_server_hostname].nil? || config[:chef_server_private].nil? || config[:chef_server_public]
|
255
|
-
Logger.debug { "Attempting to discover the chef server details" }
|
256
|
-
ours = Stack.get_our_instances(config)
|
257
|
-
ours.each do |node, node_details|
|
258
|
-
if node_details[:role] == :chef
|
259
|
-
Logger.debug { "Found the Chef server: #{node} #{node_details}" }
|
260
|
-
Stack.set_chef_server(config, node)
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
251
|
# CWD shoud be chef-repo/bootstrap, so the project .chef directory should be
|
266
252
|
dot_chef_abs = File.absolute_path(File.join(config[:stackhome],config[:dot_chef]))
|
267
253
|
|
@@ -636,23 +622,29 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
636
622
|
# called either after we create the Chef Server, or skip over it
|
637
623
|
Logger.debug "Setting :chef_server_hostname, chef_server_private & chef_server_public details (using #{chef_server})"
|
638
624
|
|
625
|
+
Stack.check_config(config)
|
626
|
+
Stack.get_our_instances(config)
|
627
|
+
|
639
628
|
config[:chef_server_hostname] = chef_server
|
629
|
+
|
640
630
|
# get the internal IP of this instance....which we should have stored in config[:all_instances]
|
641
631
|
if config[:all_instances][chef_server] && config[:all_instances][chef_server][:addresses]
|
642
632
|
config[:all_instances][chef_server][:addresses].each do |address|
|
643
633
|
# find the private IP, any old private IP will do...
|
644
634
|
if (address.label == 'private')
|
645
|
-
config[:chef_server_private] = "
|
635
|
+
config[:chef_server_private] = "#{address.address}"
|
646
636
|
Logger.info "Setting the internal Chef URL to #{config[:chef_server_private]}"
|
647
637
|
end
|
648
638
|
|
649
639
|
# only set the public url if it hasn't been set in the config
|
650
640
|
if ((config[:chef_server_public].nil? || config[:chef_server_public].empty?) && address.label == 'public')
|
651
|
-
config[:chef_server_public] = "
|
641
|
+
config[:chef_server_public] = "#{address.address}"
|
652
642
|
Logger.info "Setting the public Chef URL to #{config[:chef_server_public]}"
|
653
643
|
end
|
654
644
|
end
|
655
645
|
end
|
646
|
+
|
647
|
+
|
656
648
|
end
|
657
649
|
|
658
650
|
def Stack.secgroup_sync(config)
|
@@ -774,12 +766,13 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
774
766
|
# 2) replace the tokens (CHEF_SERVER, CHEF_ENVIRONMENT, SERVER_NAME, ROLE)
|
775
767
|
Logger.debug { "Replacing %HOSTNAME% with #{hostname} in multipart" }
|
776
768
|
multipart.gsub!(%q!%HOSTNAME%!, hostname)
|
769
|
+
Logger.debug { "Replaced %HOSTNAME% with #{hostname} in multipart" }
|
777
770
|
|
778
771
|
if config[:chef_server_hostname].nil?
|
779
772
|
Logger.info "config[:chef_server_hostname] is nil, skipping chef server substitution"
|
780
773
|
elsif (role_details[:chef_server])
|
781
774
|
Logger.info "This is the Chef Server - setting up to talk to ourselves"
|
782
|
-
multipart.gsub!(%q!%CHEF_SERVER%!, '
|
775
|
+
multipart.gsub!(%q!%CHEF_SERVER%!, '127.0.0.1')
|
783
776
|
multipart.gsub!(%q!%CHEF_ENVIRONMENT%!, config[:chef_environment])
|
784
777
|
else
|
785
778
|
Logger.info "Chef server is #{config[:chef_server_hostname]}, which is in #{config[:node_details][config[:chef_server_hostname]][:region]}"
|
@@ -794,6 +787,12 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
794
787
|
Logger.warn { "Not setting the chef url for #{hostname} as neither chef_server_private or chef_server_public are valid yet" }
|
795
788
|
end
|
796
789
|
|
790
|
+
if config[:domain].nil?
|
791
|
+
multipart.gsub!(%q!%CHEF_SERVER_HOSTNAME%!, config[:chef_server_hostname])
|
792
|
+
else
|
793
|
+
multipart.gsub!(%q!%CHEF_SERVER_HOSTNAME%!, config[:chef_server_hostname] + '.' + config[:domain])
|
794
|
+
end
|
795
|
+
|
797
796
|
multipart.gsub!(%q!%CHEF_ENVIRONMENT%!, config[:chef_environment])
|
798
797
|
|
799
798
|
if File.exists?(config[:chef_validation_pem])
|
@@ -867,7 +866,7 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
867
866
|
# refresh the chef_server details..we should have IPs now
|
868
867
|
if role_details[:chef_server]
|
869
868
|
Stack.set_chef_server(config, hostname)
|
870
|
-
Stack.generate_knife_rb(config)
|
869
|
+
#Stack.generate_knife_rb(config)
|
871
870
|
end
|
872
871
|
|
873
872
|
# attach a floating IP to this if we have one
|
@@ -915,15 +914,18 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
|
|
915
914
|
raise ArgumentError
|
916
915
|
end
|
917
916
|
|
917
|
+
filename_fqp = ''
|
918
|
+
|
919
|
+
# Relative path, to somewhere!
|
918
920
|
dirs = [ '.' ] # current directory
|
919
921
|
dirs.push(config[:stackhome])
|
920
922
|
config[:find_file_paths].each { |fp| dirs.push(File.join(config[:stackhome], fp)) }
|
921
923
|
dirs.push(File.join(@@gemhome, 'lib'))
|
924
|
+
dirs.push(ENV['HOME'])
|
922
925
|
dirs.push('') # find absolute paths
|
923
926
|
dirs.flatten!
|
924
927
|
|
925
928
|
Logger.debug "find_file, looking for #{filename} in #{dirs}"
|
926
|
-
filename_fqp = ''
|
927
929
|
dirs.each do |dir|
|
928
930
|
fqp = File.join(dir, filename)
|
929
931
|
Logger.debug "find_file: checking #{fqp}"
|
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.23
|
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-
|
12
|
+
date: 2013-09-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
@@ -143,6 +143,11 @@ files:
|
|
143
143
|
- doc/examples/.rvmrc
|
144
144
|
- doc/examples/Gemfile
|
145
145
|
- doc/examples/apache-via-chef-server/Stackfile
|
146
|
+
- doc/examples/apache-via-cloud-init-centos/README.md
|
147
|
+
- doc/examples/apache-via-cloud-init-centos/Stackfile
|
148
|
+
- doc/examples/apache-via-cloud-init-centos/cloud-init.sh
|
149
|
+
- doc/examples/apache-via-cloud-init-centos/cloud-init.yaml
|
150
|
+
- doc/examples/apache-via-cloud-init-centos/secgroup_ips.json
|
146
151
|
- doc/examples/apache-via-cloud-init/README.md
|
147
152
|
- doc/examples/apache-via-cloud-init/Stackfile
|
148
153
|
- doc/examples/apache-via-cloud-init/cloud-init.sh
|