provisionator 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/provisionator/ec2_launcher.rb +15 -14
- data/lib/provisionator/ec2_userdata.rb +35 -28
- data/lib/provisionator/version.rb +1 -1
- data/pre_bootstrap.txt +44 -0
- metadata +5 -4
@@ -9,22 +9,23 @@ module Provisionator
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def initialize options={}
|
12
|
-
options
|
13
|
-
|
14
|
-
options[:
|
15
|
-
options[:
|
16
|
-
options[:
|
17
|
-
options[:
|
18
|
-
options[:
|
19
|
-
options[:
|
20
|
-
options[:
|
21
|
-
options[:
|
22
|
-
options[:
|
12
|
+
@options = options
|
13
|
+
|
14
|
+
@options[:instance_type] ||= ENV['P_INSTANCE_TYPE'] || 'm1.small'
|
15
|
+
@options[:no_release] ||= ENV['P_NO_RELEASE']
|
16
|
+
@options[:ec2_region] ||= ENV['P_EC2_REGION'] || 'us-east-1'
|
17
|
+
@options[:ec2_endpoint] ||= ENV['P_EC2_ENDPOINT'] || "ec2.#{@options[:ec2_region]}.amazonaws.com"
|
18
|
+
@options[:ami_id] ||= ENV['P_AMI_ID']
|
19
|
+
@options[:ebs_volumes] ||= []
|
20
|
+
@options[:key_name] ||= ENV['P_KEY_NAME']
|
21
|
+
@options[:security_groups] ||= ENV['P_SECURITY_GROUPS'].try(:split, ',')
|
22
|
+
@options[:availability_zones] ||= ENV['P_AVAILABILITY_ZONES'].try(:split, ',') || ec2.regions[@options[:ec2_region]].availability_zones.map(&:name)
|
23
|
+
@options[:instance_count] ||= ENV['P_INSTANCE_COUNT'].try(:to_i) || 1
|
24
|
+
@options[:load_balancer_name] ||= ENV['P_LOAD_BALANCER_NAME']
|
23
25
|
|
24
|
-
[:app_name, :
|
26
|
+
[:app_name, :chef_node, :ami_id, :key_name, :security_groups].each do |option|
|
25
27
|
raise "option ':#{option}' is required" if options[option].nil?
|
26
28
|
end
|
27
|
-
@options = options
|
28
29
|
end
|
29
30
|
|
30
31
|
def launch
|
@@ -72,7 +73,7 @@ module Provisionator
|
|
72
73
|
puts instance_options.inspect
|
73
74
|
instance = ec2.instances.create(instance_options)
|
74
75
|
|
75
|
-
instance.tags['Name'] = "#{@options[:
|
76
|
+
instance.tags['Name'] = "#{@options[:app_name]}-#{@options[:chef_node]}-#{availability_zone.split('').last}-#{instance.id}"
|
76
77
|
puts "Launching instance '#{instance.id}' in availability_zone '#{availability_zone}...'"
|
77
78
|
instance
|
78
79
|
end
|
@@ -3,13 +3,12 @@ require 'erb'
|
|
3
3
|
module Provisionator
|
4
4
|
class Ec2Userdata
|
5
5
|
def initialize options={}
|
6
|
-
[:app_name, :
|
6
|
+
[:app_name, :chef_node, :chef_repo, :config_repo, :app_repo].each do |option|
|
7
7
|
raise "option ':#{option}' is required" if options[option].nil?
|
8
8
|
end
|
9
|
+
@app_dir = "/home/ubuntu/.#{options[:app_name]}"
|
10
|
+
@chef_dir = "#{@app_dir}/#{options[:chef_dir] || 'provision/chef'}"
|
9
11
|
|
10
|
-
options[:chef_solo_rb_path] ||= "/home/ubuntu/.#{options[:app_name]}/provision/chef/solo.rb"
|
11
|
-
options[:chef_node_definition_base_file] ||= "/home/ubuntu/.#{options[:app_name]}/provision/chef/base.json"
|
12
|
-
options[:chef_node_definition_file] ||= "/home/ubuntu/.#{options[:app_name]}/provision/chef/#{options[:chef_node_definition]}.json"
|
13
12
|
options[:ruby_patch] ||= 'p195'
|
14
13
|
options[:ebs_mount_paths] = ebs_mount_paths(options[:ebs_volumes]) if options[:ebs_volumes]
|
15
14
|
options[:rails_env] ||= 'production'
|
@@ -45,16 +44,18 @@ exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
|
|
45
44
|
apt-get update
|
46
45
|
apt-get upgrade -y
|
47
46
|
ntpdate ntp.ubuntu.com
|
48
|
-
export LC_CTYPE=en_US.UTF-8
|
49
|
-
export LANG=en_US.UTF-8
|
50
|
-
unset LC_ALL
|
51
47
|
|
52
|
-
|
53
|
-
echo "
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
48
|
+
function add_line_to_file {
|
49
|
+
(test -f "$2" && grep "$1" $2) || echo "$1" >> $2
|
50
|
+
}
|
51
|
+
|
52
|
+
add_line_to_file "StrictHostKeyChecking no" /etc/ssh/ssh_config
|
53
|
+
add_line_to_file "UserKnownHostsFile=/dev/null" /etc/ssh/ssh_config
|
54
|
+
|
55
|
+
add_line_to_file "install: --no-document" /etc/skel/.gemrc
|
56
|
+
add_line_to_file "install: --no-document" /root/.gemrc
|
57
|
+
add_line_to_file "install: --no-document" /home/ubuntu/.gemrc
|
58
|
+
add_line_to_file "install: --no-document" /etc/gemrc
|
58
59
|
|
59
60
|
#install ruby
|
60
61
|
RUBY_PATCH=<%= @options[:ruby_patch] %>
|
@@ -70,16 +71,19 @@ function install_ruby {
|
|
70
71
|
}
|
71
72
|
ruby -v | grep 2.0.0$RUBY_PATCH || install_ruby
|
72
73
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
gem
|
80
|
-
gem install
|
81
|
-
|
82
|
-
|
74
|
+
function install_chef {
|
75
|
+
#install ruby 2.0 compatible version of chef
|
76
|
+
cd /tmp
|
77
|
+
curl -o chef.tar.gz -L https://api.github.com/repos/opscode/chef/tarball/CHEF-3935
|
78
|
+
tar -xvzf chef.tar.gz
|
79
|
+
cd opscode-chef-634ad58
|
80
|
+
gem build chef.gemspec
|
81
|
+
gem install chef-11.4.0.gem
|
82
|
+
gem install ruby-shadow
|
83
|
+
mkdir -p /var/cache/chef
|
84
|
+
chown ubuntu:ubuntu /var/cache/chef
|
85
|
+
}
|
86
|
+
gem list | grep chef || install_chef
|
83
87
|
|
84
88
|
apt-get install git-core -y
|
85
89
|
|
@@ -104,8 +108,8 @@ su ubuntu -c 'git clone <%= @options[:app_repo] %> /home/ubuntu/.<%= @options[:a
|
|
104
108
|
ln -s /home/ubuntu/.config/$APP_NAME/<%= @options[:rails_env] %>/app.sh /etc/profile.d/$APP_NAME.sh
|
105
109
|
|
106
110
|
. /etc/profile.d/$APP_NAME.sh
|
107
|
-
|
108
|
-
|
111
|
+
echo <%= @options[:chef_node] %> > /home/ubuntu/.chef_node
|
112
|
+
chown ubuntu:ubuntu /home/ubuntu/.chef_node
|
109
113
|
|
110
114
|
<% unless @options[:no_release] %>
|
111
115
|
mkdir -p $APP_PATH $APP_PATH/releases $APP_PATH/shared $APP_PATH/shared/system $APP_PATH/shared/log $APP_PATH/shared/pids $APP_PATH/shared/sockets
|
@@ -120,13 +124,16 @@ chef-solo -c <%= @options[:chef_solo_rb_path] %> -o recipe[base] -l debug
|
|
120
124
|
ln -s $APP_PATH/shared/log $APP_PATH/current/log
|
121
125
|
mkdir $APP_PATH/current/tmp
|
122
126
|
ln -s $APP_PATH/shared/pids/ $APP_PATH/current/tmp/pids
|
127
|
+
|
128
|
+
<% if @options[:chef_pre_bundle] %>
|
129
|
+
chef-solo -c <%= "#{@chef_dir}/solo.rb" %> -j <%= "#{@chef_dir}/#{@options[:chef_pre_bundle]}.json" %> -l debug
|
130
|
+
<% end %>
|
131
|
+
|
123
132
|
bundle install --gemfile $APP_PATH/releases/20130516070710/Gemfile --path $APP_PATH/shared/bundle --deployment --without development test
|
124
133
|
chown -R ubuntu:ubuntu /u/
|
125
134
|
<% end %>
|
126
135
|
|
127
|
-
|
128
|
-
chown ubuntu:ubuntu /home/ubuntu/.chef_node_definition
|
129
|
-
chef-solo -c <%= @options[:chef_solo_rb_path] %> -j <%= @options[:chef_node_definition_file] %> -l debug
|
136
|
+
chef-solo -c <%= "#{@chef_dir}/solo.rb" %> -j <%= "#{@chef_dir}/#{@options[:chef_node]}.json" %> -l debug
|
130
137
|
TEMPLATE
|
131
138
|
end
|
132
139
|
end
|
data/pre_bootstrap.txt
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/bin/bash -xe
|
2
|
+
|
3
|
+
apt-get update
|
4
|
+
apt-get upgrade -y
|
5
|
+
ntpdate ntp.ubuntu.com
|
6
|
+
|
7
|
+
RUBY_PATCH=p195
|
8
|
+
function install_ruby {
|
9
|
+
apt-get -y install build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libcurl4-openssl-dev
|
10
|
+
cd /tmp
|
11
|
+
wget ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-$RUBY_PATCH.tar.gz
|
12
|
+
tar -xvzf ruby-2.0.0-$RUBY_PATCH.tar.gz
|
13
|
+
cd ruby-2.0.0-$RUBY_PATCH/
|
14
|
+
./configure --prefix=/usr/local
|
15
|
+
make
|
16
|
+
make install
|
17
|
+
}
|
18
|
+
ruby -v | grep 2.0.0$RUBY_PATCH || install_ruby
|
19
|
+
|
20
|
+
function install_chef {
|
21
|
+
#install ruby 2.0 compatible version of chef
|
22
|
+
cd /tmp
|
23
|
+
curl -o chef.tar.gz -L https://api.github.com/repos/opscode/chef/tarball/CHEF-3935
|
24
|
+
tar -xvzf chef.tar.gz
|
25
|
+
cd opscode-chef-634ad58
|
26
|
+
gem build chef.gemspec
|
27
|
+
gem install chef-11.4.0.gem
|
28
|
+
gem install ruby-shadow
|
29
|
+
mkdir -p /var/cache/chef
|
30
|
+
chown ubuntu:ubuntu /var/cache/chef
|
31
|
+
}
|
32
|
+
gem list | grep chef || install_chef
|
33
|
+
|
34
|
+
function add_line_to_file {
|
35
|
+
(test -f "$2" && grep "$1" $2) || echo "$1" >> $2
|
36
|
+
}
|
37
|
+
|
38
|
+
add_line_to_file "StrictHostKeyChecking no" /etc/ssh/ssh_config
|
39
|
+
add_line_to_file "UserKnownHostsFile=/dev/null" /etc/ssh/ssh_config
|
40
|
+
|
41
|
+
add_line_to_file "install: --no-document" /etc/skel/.gemrc
|
42
|
+
add_line_to_file "install: --no-document" /root/.gemrc
|
43
|
+
add_line_to_file "install: --no-document" /home/ubuntu/.gemrc
|
44
|
+
add_line_to_file "install: --no-document" /etc/gemrc
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: provisionator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
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-05-
|
12
|
+
date: 2013-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/provisionator/ec2_launcher.rb
|
81
81
|
- lib/provisionator/ec2_userdata.rb
|
82
82
|
- lib/provisionator/version.rb
|
83
|
+
- pre_bootstrap.txt
|
83
84
|
- provisionator.gemspec
|
84
85
|
homepage: ''
|
85
86
|
licenses:
|
@@ -96,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
97
|
version: '0'
|
97
98
|
segments:
|
98
99
|
- 0
|
99
|
-
hash:
|
100
|
+
hash: 4334713208859455962
|
100
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
102
|
none: false
|
102
103
|
requirements:
|
@@ -105,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
106
|
version: '0'
|
106
107
|
segments:
|
107
108
|
- 0
|
108
|
-
hash:
|
109
|
+
hash: 4334713208859455962
|
109
110
|
requirements: []
|
110
111
|
rubyforge_project:
|
111
112
|
rubygems_version: 1.8.23
|