ironfan 4.5.1 → 4.5.2
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/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/ironfan.gemspec +5 -4
- data/lib/chef/knife/bootstrap/chef-full-ironfan.erb +97 -0
- data/lib/chef/knife/cluster_bootstrap.rb +1 -13
- data/lib/chef/knife/cluster_launch.rb +7 -0
- data/lib/chef/knife/cluster_ssh.rb +1 -0
- data/lib/chef/knife/cluster_sync.rb +3 -5
- data/lib/chef/knife/ironfan_knife_common.rb +13 -0
- data/lib/ironfan/broker/computer.rb +1 -1
- data/spec/chef/cluster_launch_spec.rb +39 -0
- metadata +6 -5
- data/spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb +0 -9
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# v4.5.2:
|
2
|
+
* 'knife cluster launch --bootstrap' should ensure that Chef::Config[:environment] is set, just as 'knife cluster bootstrap' does
|
3
|
+
* Cleaning up knife commands to skip bogus servers (fixes #213)
|
4
|
+
* EXPERIMENTAL: Adding (cross-platform) ironfaned chef omnibus bootstrap
|
5
|
+
|
1
6
|
# v4.5.1:
|
2
7
|
* Clean up on 12.04 template - do dist-upgrade, include omnibus bin in $PATH, nicer first-boot.json
|
3
8
|
* Removing superfluous raise on duplicate machines during load
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.5.
|
1
|
+
4.5.2
|
data/ironfan.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ironfan"
|
8
|
-
s.version = "4.5.
|
8
|
+
s.version = "4.5.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Infochimps"]
|
12
|
-
s.date = "2012-11-
|
12
|
+
s.date = "2012-11-27"
|
13
13
|
s.description = "Ironfan allows you to orchestrate not just systems but clusters of machines. It includes a powerful layer on top of knife and a collection of cloud cookbooks."
|
14
14
|
s.email = "coders@infochimps.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
|
|
38
38
|
"config/ubuntu12.04-ironfan.erb",
|
39
39
|
"ironfan.gemspec",
|
40
40
|
"lib/chef/knife/bootstrap/centos6.2-ironfan.erb",
|
41
|
+
"lib/chef/knife/bootstrap/chef-full-ironfan.erb",
|
41
42
|
"lib/chef/knife/bootstrap/ubuntu10.04-ironfan.erb",
|
42
43
|
"lib/chef/knife/bootstrap/ubuntu12.04-ironfan.erb",
|
43
44
|
"lib/chef/knife/cluster_bootstrap.rb",
|
@@ -120,6 +121,7 @@ Gem::Specification.new do |s|
|
|
120
121
|
"notes/walkthrough-hadoop.md",
|
121
122
|
"notes/walkthrough-web.md",
|
122
123
|
"spec/chef/cluster_bootstrap_spec.rb",
|
124
|
+
"spec/chef/cluster_launch_spec.rb",
|
123
125
|
"spec/fixtures/ec2/elb/snakeoil.crt",
|
124
126
|
"spec/fixtures/ec2/elb/snakeoil.key",
|
125
127
|
"spec/fixtures/gunbai.rb",
|
@@ -127,7 +129,6 @@ Gem::Specification.new do |s|
|
|
127
129
|
"spec/integration/minimal-chef-repo/chefignore",
|
128
130
|
"spec/integration/minimal-chef-repo/environments/_default.json",
|
129
131
|
"spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb",
|
130
|
-
"spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb",
|
131
132
|
"spec/integration/minimal-chef-repo/knife/knife.rb",
|
132
133
|
"spec/integration/minimal-chef-repo/roles/systemwide.rb",
|
133
134
|
"spec/integration/spec/elb_build_spec.rb",
|
@@ -148,7 +149,7 @@ Gem::Specification.new do |s|
|
|
148
149
|
s.require_paths = ["lib"]
|
149
150
|
s.rubygems_version = "1.8.24"
|
150
151
|
s.summary = "Ironfan allows you to orchestrate not just systems but clusters of machines. It includes a powerful layer on top of knife and a collection of cloud cookbooks."
|
151
|
-
s.test_files = ["spec/spec_helper/dummy_chef.rb", "spec/integration/spec_helper/launch_cluster.rb", "spec/integration/minimal-chef-repo/roles/systemwide.rb", "spec/integration/minimal-chef-repo/environments/_default.json", "spec/integration/minimal-chef-repo/chefignore", "spec/integration/minimal-chef-repo/knife/knife.rb", "spec/integration/minimal-chef-repo/knife/credentials/knife-
|
152
|
+
s.test_files = ["spec/spec_helper/dummy_chef.rb", "spec/integration/spec_helper/launch_cluster.rb", "spec/integration/minimal-chef-repo/roles/systemwide.rb", "spec/integration/minimal-chef-repo/environments/_default.json", "spec/integration/minimal-chef-repo/chefignore", "spec/integration/minimal-chef-repo/knife/knife.rb", "spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb", "spec/integration/spec/simple_cluster_spec.rb", "spec/integration/spec/elb_build_spec.rb", "spec/integration/spec_helper.rb", "spec/ironfan/cluster_spec.rb", "spec/ironfan/ec2/cloud_provider_spec.rb", "spec/ironfan/ec2/elb_spec.rb", "spec/ironfan/ec2/security_group_spec.rb", "spec/chef/cluster_launch_spec.rb", "spec/chef/cluster_bootstrap_spec.rb", "spec/fixtures/gunbai_slice.json", "spec/fixtures/ec2/elb/snakeoil.key", "spec/fixtures/ec2/elb/snakeoil.crt", "spec/fixtures/gunbai.rb", "spec/spec_helper.rb", "spec/test_config.rb"]
|
152
153
|
|
153
154
|
if s.respond_to? :specification_version then
|
154
155
|
s.specification_version = 3
|
@@ -0,0 +1,97 @@
|
|
1
|
+
bash -c '
|
2
|
+
|
3
|
+
##
|
4
|
+
# EXPERIMENTAL
|
5
|
+
##
|
6
|
+
# This code was submitted as an alternative to the per-distribution scripts, just after a new bootstrap
|
7
|
+
# (Ubuntu 12.04) was put into production at Infochimps; therefore, we have had no time to validate it
|
8
|
+
# internally. Please exercise caution in applying it.
|
9
|
+
#
|
10
|
+
# Submitter: Ryan Schlesinger (https://github.com/ryansch)
|
11
|
+
# Source: https://github.com/infochimps-labs/ironfan/pull/212
|
12
|
+
#
|
13
|
+
|
14
|
+
<%= "export http_proxy=\"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] -%>
|
15
|
+
|
16
|
+
exists() {
|
17
|
+
if command -v $1 &>/dev/null
|
18
|
+
then
|
19
|
+
return 0
|
20
|
+
else
|
21
|
+
return 1
|
22
|
+
fi
|
23
|
+
}
|
24
|
+
|
25
|
+
install_sh="http://opscode.com/chef/install.sh"
|
26
|
+
version_string="-v <%= chef_version %>"
|
27
|
+
|
28
|
+
if ! exists /usr/bin/chef-client; then
|
29
|
+
if exists wget; then
|
30
|
+
bash <(wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %> ${install_sh} -O -) ${version_string}
|
31
|
+
else
|
32
|
+
if exists curl; then
|
33
|
+
bash <(curl -L <%= "--proxy=on " if knife_config[:bootstrap_proxy] %> ${install_sh}) ${version_string}
|
34
|
+
fi
|
35
|
+
fi
|
36
|
+
fi
|
37
|
+
|
38
|
+
mkdir -p /etc/chef
|
39
|
+
|
40
|
+
<%- if @config[:client_key] %>
|
41
|
+
(
|
42
|
+
cat <<'EOP'
|
43
|
+
<%= @config[:client_key] %>
|
44
|
+
EOP
|
45
|
+
) > /tmp/client.pem
|
46
|
+
awk NF /tmp/client.pem > /etc/chef/client.pem
|
47
|
+
rm /tmp/client.pem
|
48
|
+
chmod 0600 /etc/chef/client.pem
|
49
|
+
<%- else %>
|
50
|
+
(
|
51
|
+
cat <<'EOP'
|
52
|
+
<%= validation_key %>
|
53
|
+
EOP
|
54
|
+
) > /tmp/validation.pem
|
55
|
+
awk NF /tmp/validation.pem > /etc/chef/validation.pem
|
56
|
+
rm /tmp/validation.pem
|
57
|
+
chmod 0600 /etc/chef/validation.pem
|
58
|
+
<% end -%>
|
59
|
+
|
60
|
+
<% if @chef_config[:encrypted_data_bag_secret] -%>
|
61
|
+
(
|
62
|
+
cat <<'EOP'
|
63
|
+
<%= encrypted_data_bag_secret %>
|
64
|
+
EOP
|
65
|
+
) > /tmp/encrypted_data_bag_secret
|
66
|
+
awk NF /tmp/encrypted_data_bag_secret > /etc/chef/encrypted_data_bag_secret
|
67
|
+
rm /tmp/encrypted_data_bag_secret
|
68
|
+
chmod 0600 /etc/chef/encrypted_data_bag_secret
|
69
|
+
<% end -%>
|
70
|
+
|
71
|
+
<%# Generate Ohai Hints -%>
|
72
|
+
<% unless @chef_config[:knife][:hints].nil? || @chef_config[:knife][:hints].empty? -%>
|
73
|
+
mkdir -p /etc/chef/ohai/hints
|
74
|
+
|
75
|
+
<% @chef_config[:knife][:hints].each do |name, hash| -%>
|
76
|
+
(
|
77
|
+
cat <<'EOP'
|
78
|
+
<%= hash.to_json %>
|
79
|
+
EOP
|
80
|
+
) > /etc/chef/ohai/hints/<%= name %>.json
|
81
|
+
<% end -%>
|
82
|
+
<% end -%>
|
83
|
+
|
84
|
+
(
|
85
|
+
cat <<'EOP'
|
86
|
+
<%= config_content %>
|
87
|
+
<%= @config[:computer].chef_client_script_content %>
|
88
|
+
EOP
|
89
|
+
) > /etc/chef/client.rb
|
90
|
+
|
91
|
+
(
|
92
|
+
cat <<'EOP'
|
93
|
+
<%= { "run_list" => @run_list, "cluster_name" => @config[:server].cluster_name, "facet_name" => @config[:server].facet_name, "facet_index" => @config[:server].index }.to_json %>
|
94
|
+
EOP
|
95
|
+
) > /etc/chef/first-boot.json
|
96
|
+
|
97
|
+
<%= start_chef %>'
|
@@ -59,7 +59,7 @@ class Chef
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def perform_execution(target)
|
62
|
-
|
62
|
+
ensure_common_environment(target)
|
63
63
|
# Execute across all servers in parallel
|
64
64
|
Ironfan.parallel(target.values) {|computer| run_bootstrap(computer)}
|
65
65
|
# threads = target.servers.map{ |server| Thread.new(server) { |svr| run_bootstrap(svr, svr.public_hostname) } }
|
@@ -70,18 +70,6 @@ class Chef
|
|
70
70
|
confirm_or_exit("Are you absolutely certain that you want to perform this action? (Type 'Yes' to confirm) ", 'Yes')
|
71
71
|
end
|
72
72
|
|
73
|
-
protected
|
74
|
-
|
75
|
-
def reconcile_chef_config(target)
|
76
|
-
environments = target.environments
|
77
|
-
if environments.length > 1
|
78
|
-
ui.error "You cannot bootstrap machines in multiple chef environments: got #{environments.inspect} from #{target.map(&:name)}"
|
79
|
-
ui.error "Re-run this command on each subgroup of machines that share an environment"
|
80
|
-
raise StandardError, "Cannot bootstrap multiple chef environments"
|
81
|
-
end
|
82
|
-
Chef::Config[:environment] = environments.first
|
83
|
-
end
|
84
|
-
|
85
73
|
end
|
86
74
|
end
|
87
75
|
end
|
@@ -71,6 +71,13 @@ class Chef
|
|
71
71
|
|
72
72
|
die("", "#{ui.color("All computers are running -- not launching any.",:blue)}", "", 1) if target.empty?
|
73
73
|
|
74
|
+
# If a bootstrap was requested, ensure that we will be able to perform the
|
75
|
+
# bootstrap *before* trying to launch all of the servers in target. This
|
76
|
+
# will save the user a lot of time if they've made a configuration mistake
|
77
|
+
if config[:bootstrap]
|
78
|
+
ensure_common_environment(target)
|
79
|
+
end
|
80
|
+
|
74
81
|
# Pre-populate information in chef
|
75
82
|
section("Syncing to chef")
|
76
83
|
target.save :providers => :chef
|
@@ -50,6 +50,7 @@ class Chef
|
|
50
50
|
# config[:identity_file] ||= target.ssh_identity_file
|
51
51
|
|
52
52
|
# @action_nodes = target.chef_nodes
|
53
|
+
target = target.select {|t| not t.bogus? }
|
53
54
|
addresses = target.map {|c| c.machine.public_hostname }.compact
|
54
55
|
|
55
56
|
(ui.fatal("No nodes returned from search!"); exit 10) if addresses.nil? || addresses.length == 0
|
@@ -41,11 +41,9 @@ class Chef
|
|
41
41
|
|
42
42
|
|
43
43
|
def relevant?(computer)
|
44
|
-
if
|
45
|
-
|
46
|
-
|
47
|
-
computer.created? or computer.node?
|
48
|
-
end
|
44
|
+
return false if computer.bogus?
|
45
|
+
return true if config[:sync_all]
|
46
|
+
computer.created? or computer.node?
|
49
47
|
end
|
50
48
|
|
51
49
|
def perform_execution(target)
|
@@ -236,5 +236,18 @@ module Ironfan
|
|
236
236
|
extend ClassMethods
|
237
237
|
end
|
238
238
|
end
|
239
|
+
|
240
|
+
protected
|
241
|
+
|
242
|
+
def ensure_common_environment(target)
|
243
|
+
environments = target.environments
|
244
|
+
if environments.length > 1
|
245
|
+
ui.error "You cannot bootstrap machines in multiple chef environments: got #{environments.inspect} from #{target.map(&:name)}"
|
246
|
+
ui.error "Re-run this command on each subgroup of machines that share an environment"
|
247
|
+
raise StandardError, "Cannot bootstrap multiple chef environments"
|
248
|
+
end
|
249
|
+
Chef::Config[:environment] = environments.first
|
250
|
+
end
|
251
|
+
|
239
252
|
end
|
240
253
|
end
|
@@ -301,7 +301,7 @@ module Ironfan
|
|
301
301
|
def aggregate
|
302
302
|
computers = self
|
303
303
|
provider_keys = values.map {|c| c.chosen_providers({ :providers => :iaas})}.flatten.uniq
|
304
|
-
providers = provider_keys.map { |pk| values.map { |c| c.providers[pk] } }.flatten.uniq
|
304
|
+
providers = provider_keys.map { |pk| values.map { |c| c.providers[pk] } }.flatten.compact.uniq
|
305
305
|
providers.each { |p| p.aggregate! computers }
|
306
306
|
end
|
307
307
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
ironfan_go!
|
4
|
+
require 'chef/knife/cluster_launch'
|
5
|
+
|
6
|
+
describe Chef::Knife::ClusterLaunch do
|
7
|
+
let(:cluster) do
|
8
|
+
Ironfan.load_cluster(:gunbai)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:target) do
|
12
|
+
Ironfan.broker.discover!(cluster)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:computers) do
|
16
|
+
Ironfan::Broker::Computers.receive(
|
17
|
+
MultiJson.load(
|
18
|
+
File.open(Pathname.path_to(:fixtures, 'gunbai_slice.json'))))
|
19
|
+
end
|
20
|
+
|
21
|
+
subject do
|
22
|
+
described_class.new(slice)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'getting slice' do
|
26
|
+
before do
|
27
|
+
subject.stub(:relevant?){ true }
|
28
|
+
subject.config[:yes] = true
|
29
|
+
subject.config[:bootstrap] = true
|
30
|
+
end
|
31
|
+
context 'full slice' do
|
32
|
+
let(:slice){ ['gunbai'] }
|
33
|
+
it 'fails if there are multiple environments' do
|
34
|
+
expect{ subject.run }.to raise_error("Cannot bootstrap multiple chef environments")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ironfan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 4.5.
|
5
|
+
version: 4.5.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Infochimps
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-11-
|
13
|
+
date: 2012-11-27 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: chef
|
@@ -164,6 +164,7 @@ files:
|
|
164
164
|
- config/ubuntu12.04-ironfan.erb
|
165
165
|
- ironfan.gemspec
|
166
166
|
- lib/chef/knife/bootstrap/centos6.2-ironfan.erb
|
167
|
+
- lib/chef/knife/bootstrap/chef-full-ironfan.erb
|
167
168
|
- lib/chef/knife/bootstrap/ubuntu10.04-ironfan.erb
|
168
169
|
- lib/chef/knife/bootstrap/ubuntu12.04-ironfan.erb
|
169
170
|
- lib/chef/knife/cluster_bootstrap.rb
|
@@ -246,6 +247,7 @@ files:
|
|
246
247
|
- notes/walkthrough-hadoop.md
|
247
248
|
- notes/walkthrough-web.md
|
248
249
|
- spec/chef/cluster_bootstrap_spec.rb
|
250
|
+
- spec/chef/cluster_launch_spec.rb
|
249
251
|
- spec/fixtures/ec2/elb/snakeoil.crt
|
250
252
|
- spec/fixtures/ec2/elb/snakeoil.key
|
251
253
|
- spec/fixtures/gunbai.rb
|
@@ -253,7 +255,6 @@ files:
|
|
253
255
|
- spec/integration/minimal-chef-repo/chefignore
|
254
256
|
- spec/integration/minimal-chef-repo/environments/_default.json
|
255
257
|
- spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb
|
256
|
-
- spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb
|
257
258
|
- spec/integration/minimal-chef-repo/knife/knife.rb
|
258
259
|
- spec/integration/minimal-chef-repo/roles/systemwide.rb
|
259
260
|
- spec/integration/spec/elb_build_spec.rb
|
@@ -281,7 +282,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
281
282
|
requirements:
|
282
283
|
- - ">="
|
283
284
|
- !ruby/object:Gem::Version
|
284
|
-
hash: -
|
285
|
+
hash: -2019769305702491484
|
285
286
|
segments:
|
286
287
|
- 0
|
287
288
|
version: "0"
|
@@ -305,7 +306,6 @@ test_files:
|
|
305
306
|
- spec/integration/minimal-chef-repo/environments/_default.json
|
306
307
|
- spec/integration/minimal-chef-repo/chefignore
|
307
308
|
- spec/integration/minimal-chef-repo/knife/knife.rb
|
308
|
-
- spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb
|
309
309
|
- spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb
|
310
310
|
- spec/integration/spec/simple_cluster_spec.rb
|
311
311
|
- spec/integration/spec/elb_build_spec.rb
|
@@ -314,6 +314,7 @@ test_files:
|
|
314
314
|
- spec/ironfan/ec2/cloud_provider_spec.rb
|
315
315
|
- spec/ironfan/ec2/elb_spec.rb
|
316
316
|
- spec/ironfan/ec2/security_group_spec.rb
|
317
|
+
- spec/chef/cluster_launch_spec.rb
|
317
318
|
- spec/chef/cluster_bootstrap_spec.rb
|
318
319
|
- spec/fixtures/gunbai_slice.json
|
319
320
|
- spec/fixtures/ec2/elb/snakeoil.key
|
@@ -1,9 +0,0 @@
|
|
1
|
-
Chef::Config.instance_eval do
|
2
|
-
organization "infochimps_test"
|
3
|
-
chef_server_url "https://api.opscode.com/organizations/#{organization}"
|
4
|
-
knife[:aws_account_id] = "346633265723"
|
5
|
-
|
6
|
-
knife[:aws_access_key_id] = "AKIAIFPVHWHGTQDXOF6Q"
|
7
|
-
knife[:aws_secret_access_key] = "f8e/XwVSIx9ApupaZaoW/xGme64YuQhKWZM/nn5Y"
|
8
|
-
end
|
9
|
-
|