ironfan 3.1.1 → 3.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,247 +1,41 @@
1
- # Ironfan Core: knife tools and core models
1
+ # Ironfan Core: Knife Tools and Core Models
2
2
 
3
- The ironfan project is an expressive toolset for constructing scalable, resilient architectures. It works in the cloud, in the data center, and on your laptop, and makes your system diagram visible and inevitable.
3
+ Ironfan, the foundation of The Infochimps Platform, is an expressive toolset for constructing scalable, resilient architectures. It works in the cloud, in the data center, and on your laptop, and it makes your system diagram visible and inevitable. Inevitable systems coordinate automatically to interconnect, removing the hassle of manual configuration of connection points (and the associated danger of human error).
4
+ For more information about Ironfan and The Infochimps Platform, visit the [Infochimps Blog introducing the Infochimps Platform](http://blog.infochimps.com/2012/02/22/infochimps-platform/).
4
5
 
5
- This repo implements
6
+ This repo implements:
6
7
 
7
- * core models to describe your system diagram with a clean, expressive domain-specific language
8
- * knife plugins to orchestrate clusters of machines using simple commands like `knife cluster launch`
9
- * logic to coordinate truth among chef server and cloud providers.
10
-
11
- To get started with ironfan, clone the [homebase repo](https://github.com/infochimps-labs/ironfan-homebase) and follow the [installation instructions](https://github.com/infochimps-labs/ironfan/wiki/install). Please file all issues on [ironfan issues](https://github.com/infochimps-labs/ironfan/issues).
12
-
13
- ## Index
14
-
15
- ironfan core works together with the full ironfan toolset:
16
-
17
- * [ironfan-homebase](https://github.com/infochimps-labs/ironfan-homebase): centralizes the cookbooks, roles and clusters. A solid foundation for any chef user.
18
- * [ironfan gem](https://github.com/infochimps-labs/ironfan): core ironfan models, and knife plugins to orchestrate machines and coordinate truth among you homebase, cloud and chef server.
19
- * [ironfan-pantry](https://github.com/infochimps-labs/ironfan-pantry): Our collection of industrial-strength, cloud-ready recipes for Hadoop, HBase, Cassandra, Elasticsearch, Zabbix and more.
20
- * [silverware cookbook](https://github.com/infochimps-labs/ironfan-homebase/tree/master/cookbooks/silverware): coordinate discovery of services ("list all the machines for `awesome_webapp`, that I might load balance them") and aspects ("list all components that write logs, that I might logrotate them, or that I might monitor the free space on their volumes".
21
- * [ironfan-ci](https://github.com/infochimps-labs/ironfan-ci): Continuous integration testing of not just your cookbooks but your *architecture*.
22
-
23
- * [ironfan wiki](https://github.com/infochimps-labs/ironfan/wiki): high-level documentation and install instructions
24
- * [ironfan issues](https://github.com/infochimps-labs/ironfan/issues): bugs, questions and feature requests for *any* part of the ironfan toolset.
25
- * [ironfan gem docs](http://rdoc.info/gems/ironfan): rdoc docs for ironfan
26
-
27
- __________________________________________________________________________
28
-
29
- # Ironfan
30
-
31
- Infrastructure as code: describe and orchestrate whole clusters of cloud or virtual machines.
32
-
33
- ## Walkthrough
34
-
35
- Here's a very simple cluster:
36
-
37
- ```ruby
38
- Ironfan.cluster 'webapp_demo' do
39
- cloud(:ec2) do
40
- flavor 't1.micro'
41
- end
42
-
43
- role :base_role
44
- role :chef_client
45
- role :ssh
46
-
47
- # The database server
48
- facet :dbnode do
49
- instances 1
50
- role :mysql_server
51
-
52
- cloud do
53
- flavor 'm1.large'
54
- backing 'ebs'
55
- end
56
- end
57
-
58
- # A throwaway facet for development.
59
- facet :webnode do
60
- instances 2
61
- role :nginx_server
62
- role :awesome_webapp
63
- end
64
- end
65
- ```
66
-
67
- This code defines a cluster named demosimple. A cluster is a group of servers united around a common purpose, in this case to serve a scalable web application.
68
-
69
- The webapp_demo cluster has two 'facets' -- dbnode and webnode. A facet is a subgroup of interchangeable servers that provide a logical set of systems: in this case, the systems that store the website's data and those that render it.
70
-
71
- The dbnode facet has one server, which will be named `webapp_demo-dbnode-0`; the webnode facet has two servers, `webapp_demo-webnode-0` and `webapp_demo-webnode-1`.
72
-
73
- Each server inherits the appropriate behaviors from its facet and cluster. All the servers in this cluster have the `base_role`, `chef_client` and `ssh` roles. The dbnode machines additionally house a MySQL server, while the webnodes have an nginx reverse proxy for the custom `webapp_demo_webapp`.
74
-
75
- As you can see, the dbnode facet asks for a different flavor of machine (`m1.large`) than the cluster default (`t1.micro`). Settings in the facet override those in the server, and settings in the server override those of its facet. You economically describe only what's significant about each machine.
76
-
77
- ### Cluster-level tools
78
-
79
-
80
- ```
81
- $ knife cluster show webapp_demo
82
-
83
- +--------------------+-------+------------+-------------+--------------+---------------+-----------------+----------+--------------+------------+------------+
84
- | Name | Chef? | InstanceID | State | Public IP | Private IP | Created At | Flavor | Image | AZ | SSH Key |
85
- +--------------------+-------+------------+-------------+--------------+---------------+-----------------+----------+--------------+------------+------------+
86
- | webapp_demo-dbnode-0 | yes | i-43c60e20 | running | 107.22.6.104 | 10.88.112.201 | 20111029-204156 | t1.micro | ami-cef405a7 | us-east-1a | webapp_demo |
87
- | webapp_demo-webnode-0 | yes | i-1233aef1 | running | 102.99.3.123 | 10.88.112.123 | 20111029-204156 | t1.micro | ami-cef405a7 | us-east-1a | webapp_demo |
88
- | webapp_demo-webnode-1 | yes | i-0986423b | not running | | | | | | | |
89
- +--------------------+-------+------------+-------------+--------------+---------------+-----------------+----------+--------------+------------+------------+
90
-
91
-
92
- ```
93
-
94
- The commands available are
95
- * list -- lists known clusters
96
- * show -- show the named servers
97
- * launch -- launch server
98
- * bootstrap
99
- * sync
100
- * ssh
101
- * start/stop
102
- * kill
103
- * kick -- trigger a chef-client run on each named machine, tailing the logs until the run completes
104
-
105
-
106
- ### Advanced clusters remain simple
107
-
108
- Let's say that app is truly awesome, and the features and demand increases. This cluster adds an [ElasticSearch server](http://elasticsearch.org) for searching, a haproxy loadbalancer, and spreads the webnodes across two availability zones.
109
-
110
- ```ruby
111
- Ironfan.cluster 'webserver_demo_2' do
112
- cloud(:ec2) do
113
- image_name "maverick"
114
- flavor "t1.micro"
115
- availability_zones ['us-east-1a']
116
- end
117
-
118
- # The database server
119
- facet :dbnode do
120
- instances 1
121
- role :mysql_server
122
- cloud do
123
- flavor 'm1.large'
124
- backing 'ebs'
125
- end
126
-
127
- volume(:data) do
128
- size 20
129
- keep true
130
- device '/dev/sdi'
131
- mount_point '/data'
132
- snapshot_id 'snap-a10234f'
133
- attachable :ebs
134
- end
135
- end
136
-
137
- facet :webnode do
138
- instances 6
139
- cloud.availability_zones ['us-east-1a', 'us-east-1b']
140
-
141
- role :nginx_server
142
- role :awesome_webapp
143
- role :elasticsearch_client
144
-
145
- volume(:server_logs) do
146
- size 5
147
- keep true
148
- device '/dev/sdi'
149
- mount_point '/server_logs'
150
- snapshot_id 'snap-d9c1edb1'
151
- end
152
- end
153
-
154
- facet :esnode do
155
- instances 1
156
- role "elasticsearch_data_esnode"
157
- role "elasticsearch_http_esnode"
158
- cloud.flavor "m1.large"
159
- end
160
-
161
- facet :loadbalancer do
162
- instances 1
163
- role "haproxy"
164
- cloud.flavor "m1.xlarge"
165
- elastic_ip "128.69.69.23"
166
- end
167
-
168
- cluster_role.override_attributes({
169
- :elasticsearch => {
170
- :version => '0.17.8',
171
- },
172
- })
173
- end
174
- ```
175
-
176
- The facets are described and scale independently. If you'd like to add more webnodes, just increase the instance count. If a machine misbehaves, just terminate it. Running `knife cluster launch webapp_demo webnode` will note which machines are missing, and launch and configure them appropriately.
177
-
178
- Ironfan speaks naturally to both Chef and your cloud provider. The esnode's `cluster_role.override_attributes` statement will be synchronized to the chef server, pinning the elasticsearch version across the clients and server.. Your chef roles should focus system-specific information; the cluster file lets you see the architecture as a whole.
179
-
180
- With these simple settings, if you have already [set up chef's knife to launch cloud servers](http://wiki.opscode.com/display/chef/Launch+Cloud+Instances+with+Knife), typing `knife cluster launch demosimple --bootstrap` will (using Amazon EC2 as an example):
181
-
182
- * Synchronize to the chef server:
183
- - create chef roles on the server for the cluster and each facet.
184
- - apply role directives (eg the homebase's `default_attributes` declaration).
185
- - create a node for each machine
186
- - apply the runlist to each node
187
- * Set up security isolation:
188
- - uses a keypair (login ssh key) isolated to that cluster
189
- - Recognizes the `ssh` role, and add a security group `ssh` that by default opens port 22.
190
- - Recognize the `nfs_server` role, and adds security groups `nfs_server` and `nfs_client`
191
- - Authorizes the `nfs_server` to accept connections from all `nfs_client`s. Machines in other clusters that you mark as `nfs_client`s can connect to the NFS server, but are not automatically granted any other access to the machines in this cluster. Ironfan's opinionated behavior is about more than saving you effort -- tying this behavior to the chef role means you can't screw it up.
192
- * Launches the machines in parallel:
193
- - using the image name and the availability zone, it determines the appropriate region, image ID, and other implied behavior.
194
- - passes a JSON-encoded user_data hash specifying the machine's chef `node_name` and client key. An appropriately-configured machine image will need no further bootstrapping -- it will connect to the chef server with the appropriate identity and proceed completely unattended.
195
- * Syncronizes to the cloud provider:
196
- - Applies EC2 tags to the machine, making your console intelligible: ![AWS Console screenshot](https://github.com/infochimps-labs/ironfan/raw/version_3/notes/aws_console_screenshot.jpg)
197
- - Connects external (EBS) volumes, if any, to the correct mount point -- it uses (and applies) tags to the volumes, so they know which machine to adhere to. If you've manually added volumes, just make sure they're defined correctly in your cluster file and run `knife cluster sync {cluster_name}`; it will paint them with the correct tags.
198
- - Associates an elastic IP, if any, to the machine
199
- * Bootstraps the machine using knife bootstrap
200
-
201
- ---------------------------------------------------------------------------
8
+ * Core models to describe your system diagram with a clean, expressive domain-specific language
9
+ * Knife plugins to orchestrate clusters of machines using simple commands like `knife cluster launch`
10
+ * Logic to coordinate truth among chef server and cloud providers
202
11
 
203
12
  ## Getting Started
204
13
 
205
- @sya add the contents of https://github.com/infochimps-labs/ironfan/wiki/INSTALL here
206
-
207
- __________________________________________________________________________
14
+ To jump right into using Ironfan, follow our [Installation Instructions](https://github.com/infochimps-labs/ironfan/wiki/INSTALL). For an explanatory tour, check out our [Hadoop Walkthrough](https://github.com/infochimps-labs/ironfan/wiki/INSTALL). Please file all issues on [Ironfan issues](https://github.com/infochimps-labs/ironfan/issues).
208
15
 
209
- ## Philosophy
210
-
211
- Some general principles of how we use chef.
16
+ ## Index
212
17
 
213
- * *Chef server is never the repository of truth* -- it only mirrors the truth.
214
- - a file is tangible and immediate to access
215
- * Specifically, we want truth to live in the git repo, and be enforced by the chef server. *There is no truth but git, and chef is its messenger*.
216
- - this means that everything is versioned, documented and exchangeable.
217
- * *Systems, services and significant modifications cluster should be obvious from the `clusters` file*. I don't want to have to bounce around nine different files to find out which thing installed a redis:server.
218
- - basically, the existence of anything that opens a port should be obvious when I look at the cluster file.
219
- * *Roles define systems, clusters assemble systems into a machine*.
220
- - For example, a resque worker queue has a redis, a webserver and some config files -- your cluster should invoke a @whatever_queue@ role, and the @whatever_queue@ role should include recipes for the component services.
221
- - the existence of anything that opens a port _or_ runs as a service should be obvious when I look at the roles file.
222
- * *include_recipe considered harmful* Do NOT use include_recipe for anything that a) provides a service, b) launches a daemon or c) is interesting in any way. (so: @include_recipe java@ yes; @include_recipe iptables@ no.) You should note the dependency in the metadata.rb. This seems weird, but the breaking behavior is purposeful: it makes you explicitly state all dependencies.
223
- * It's nice when *machines are in full control of their destiny*.
224
- - initial setup (elastic IP, attaching a drive) is often best enforced externally
225
- - but machines should be ablt independently assert things like load balancer registration that that might change at any point in the lifetime.
226
- * It's even nicer, though, to have *full idempotency from the command line*: I can at any time push truth from the git repo to the chef server and know that it will take hold.
18
+ The full Ironfan toolset:
227
19
 
228
- __________________________________________________________________________
20
+ ###Core Tools:
229
21
 
230
- ## Advanced Superpowers
22
+ * [ironfan-homebase](https://github.com/infochimps-labs/ironfan-homebase): Centralizes the cookbooks, roles and clusters. A solid foundation for any Chef user.
23
+ * [ironfan gem](https://github.com/infochimps-labs/ironfan): The core Ironfan models, and Knife plugins to orchestrate machines and coordinate truth among your homebase, cloud and chef server. It comes with [ironfan-homebase](https://github.com/infochimps-labs/ironfan-homebase).
24
+ * [ironfan-pantry](https://github.com/infochimps-labs/ironfan-pantry): Our collection of industrial-strength, cloud-ready recipes for Hadoop, HBase, Cassandra, Elasticsearch, Zabbix and more.
25
+ * [silverware cookbook](https://github.com/infochimps-labs/ironfan-pantry/tree/master/cookbooks/silverware): Helps you coordinate discovery of services ("list all the machines for `awesome_webapp`, that I might load balance them") and aspects ("list all components that write logs, that I might logrotate them, or that I might monitor the free space on their volumes"). Found within the [ironfan-pantry](https://github.com/infochimps-labs/ironfan-pantry).
231
26
 
232
- #### Set up Knife on your local machine, and a Chef Server in the cloud
27
+ ###Core Documentation:
233
28
 
234
- If you already have a working chef installation you can skip this section.
29
+ * [ironfan wiki](https://github.com/infochimps-labs/ironfan/wiki): High-level documentation and install instructions.
30
+ * [ironfan issues](https://github.com/infochimps-labs/ironfan/issues): Bugs or questions and feature requests for *any* part of the Ironfan toolset.
31
+ * [ironfan gem docs](http://rdoc.info/gems/ironfan): Rdoc docs for Ironfan.
235
32
 
236
- To get started with knife and chef, follow the "Chef Quickstart,":http://wiki.opscode.com/display/chef/Quick+Start We use the hosted chef service and are very happy, but there are instructions on the wiki to set up a chef server too. Stop when you get to "Bootstrap the Ubuntu system" -- cluster chef is going to make that much easier.
33
+ ## What is Ironfan?
34
+ Ironfan is a systems provisioning and deployment tool. Ironfan automates not only machine configuration, but entire systems configuration to enable the entire Big Data stack, including tools for _data ingestion_, _scraping_, _storage_, _computation_, and _monitoring_.
237
35
 
238
- * [Launch Cloud Instances with Knife](http://wiki.opscode.com/display/chef/Launch+Cloud+Instances+with+Knife)
239
- * [EC2 Bootstrap Fast Start Guide](http://wiki.opscode.com/display/chef/EC2+Bootstrap+Fast+Start+Guide)
36
+ Ironfan builds on Chef, but is opinionated about its architecture, which allows broader integration between components. It assumes a source repository, a central Chef Server, and a modern POSIX-compliant operating system for a base image. Currently, it works best with Git, Amazon Web Services, Ubuntu 11.04, with exploration into other virtualization platforms (Vagrant, etc.) and operating systems (Centos, FreeSBD, etc) ongoing, both inside and outside of Infochimps.
240
37
 
241
- #### Auto-vivifying machines (no bootstrap required!)
38
+ To understand the Philosophy behind how we use Chef go [here](https://github.com/infochimps-labs/ironfan/wiki/Philosophy).
242
39
 
243
- On EC2, you can make a machine that auto-vivifies -- no bootstrap necessary. Burn an AMI that has the `config/client.rb` file in /etc/chef/client.rb. It will use the ec2 userdata (passed in by knife) to realize its purpose in life, its identity, and the chef server to connect to; everything happens automagically from there. No parallel ssh required!
244
40
 
245
- #### EBS Volumes
246
41
 
247
- Define a `snapshot_id` for your volumes, and set `create_at_launch` true.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.1.1
1
+ 3.1.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 = "3.1.1"
8
+ s.version = "3.1.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-02-20"
12
+ s.date = "2012-02-23"
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 = [
@@ -46,6 +46,8 @@ class Chef
46
46
  KICKSTART_SCRIPT = <<EOF
47
47
  #!/bin/bash
48
48
  set -e
49
+ sudo -p 'knife sudo password: ' true
50
+
49
51
  <%= ((config[:verbosity].to_i > 1) ? "set -v" : "") %>
50
52
 
51
53
  if sudo service chef-client status ; then
@@ -83,7 +85,7 @@ EOF
83
85
  end
84
86
 
85
87
  def run
86
- @name_args = [ @name_args.join(' ') ]
88
+ @name_args = [ @name_args.join('-') ]
87
89
  script = Erubis::Eruby.new(KICKSTART_SCRIPT).result(:config => config)
88
90
  @name_args[1] = script
89
91
  super
@@ -41,9 +41,7 @@ class Chef
41
41
  :description => "The attribute to use for opening the connection - default is fqdn (ec2 users may prefer cloud.public_hostname)"
42
42
 
43
43
  def configure_session
44
- predicate = @name_args[0].split(/[\s\-]+/,3).map(&:strip)
45
-
46
- target = get_slice(*predicate).select(&:sshable?)
44
+ target = get_slice(@name_args[0]).select(&:sshable?)
47
45
 
48
46
  display(target) if config[:verbose]
49
47
 
@@ -115,7 +115,7 @@ class Chef
115
115
  FileUtils.mkdir_p cluster_vagrant_dir
116
116
  FileUtils.cp skeleton_vagrantfile, File.join(cluster_vagrant_dir, 'vagrantfile')
117
117
 
118
- log_level = [0, (3 - config.verbosity)].max
118
+ log_level = [0, (3 - config[:verbosity])].max
119
119
  env = Vagrant::IronfanEnvironment.new(
120
120
  :ui_class => Vagrant::UI::Colored,
121
121
  :cwd => cluster_vagrant_dir,
data/spec/ironfan_spec.rb CHANGED
@@ -94,9 +94,9 @@ describe "ironfan" do
94
94
  fct = @cluster.facet(:esnode)
95
95
  fct.to_hash.should == {
96
96
  :name => :esnode,
97
- :run_list => ["role[nginx]", "role[redis_server]", "role[elasticsearch_data_esnode]", "role[elasticsearch_http_esnode]", "role[webserver_demo_esnode]"],
97
+ :run_list => ["role[nginx]", "role[redis_server]", "role[elasticsearch_datanode]", "role[elasticsearch_httpnode]", "role[webserver_demonode]"],
98
98
  :chef_attributes => {},
99
- :facet_role => "webserver_demo_esnode",
99
+ :facet_role => "webserver_demonode",
100
100
  :instances => 1,
101
101
  }
102
102
  fct.cloud.flavor.should == 'm1.large'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ironfan
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-20 00:00:00.000000000 Z
12
+ date: 2012-02-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
16
- requirement: &70189981680580 !ruby/object:Gem::Requirement
16
+ requirement: &70121421455600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.10.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70189981680580
24
+ version_requirements: *70121421455600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fog
27
- requirement: &70189981668780 !ruby/object:Gem::Requirement
27
+ requirement: &70121421454980 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.1.1
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70189981668780
35
+ version_requirements: *70121421454980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: formatador
38
- requirement: &70189981667980 !ruby/object:Gem::Requirement
38
+ requirement: &70121421454400 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.2.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70189981667980
46
+ version_requirements: *70121421454400
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: gorillib
49
- requirement: &70189981667180 !ruby/object:Gem::Requirement
49
+ requirement: &70121421453860 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.1.7
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70189981667180
57
+ version_requirements: *70121421453860
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bundler
60
- requirement: &70189981666180 !ruby/object:Gem::Requirement
60
+ requirement: &70121421453320 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '1'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70189981666180
68
+ version_requirements: *70121421453320
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: jeweler
71
- requirement: &70189981665440 !ruby/object:Gem::Requirement
71
+ requirement: &70121421452800 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '1.6'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70189981665440
79
+ version_requirements: *70121421452800
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &70189981664920 !ruby/object:Gem::Requirement
82
+ requirement: &70121421452140 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '2.5'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70189981664920
90
+ version_requirements: *70121421452140
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: yard
93
- requirement: &70189981664260 !ruby/object:Gem::Requirement
93
+ requirement: &70121421451560 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0.6'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70189981664260
101
+ version_requirements: *70121421451560
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: configliere
104
- requirement: &70189981660620 !ruby/object:Gem::Requirement
104
+ requirement: &70121421450980 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 0.4.8
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70189981660620
112
+ version_requirements: *70121421450980
113
113
  description: ironfan allows you to orchestrate not just systems but clusters of machines.
114
114
  It includes a powerful layer on top of knife and a collection of cloud cookbooks.
115
115
  email: coders@infochimps.com
@@ -216,7 +216,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
216
  version: '0'
217
217
  segments:
218
218
  - 0
219
- hash: -2335380690962978772
219
+ hash: 3919363887272942374
220
220
  required_rubygems_version: !ruby/object:Gem::Requirement
221
221
  none: false
222
222
  requirements: