caterer 0.11.2 → 1.0.0

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.
Files changed (65) hide show
  1. data/README.md +34 -116
  2. data/Vagrantfile +4 -4
  3. data/lib/caterer.rb +3 -0
  4. data/lib/caterer/action.rb +1 -0
  5. data/lib/caterer/action/berkshelf/install.rb +3 -1
  6. data/lib/caterer/action/config/validate/provisioner.rb +16 -10
  7. data/lib/caterer/action/image.rb +9 -0
  8. data/lib/caterer/action/image/cleanup.rb +20 -0
  9. data/lib/caterer/action/image/prepare.rb +20 -0
  10. data/lib/caterer/action/image/run.rb +20 -0
  11. data/lib/caterer/action/provisioner.rb +0 -7
  12. data/lib/caterer/action/provisioner/cleanup.rb +19 -1
  13. data/lib/caterer/action/provisioner/prepare.rb +20 -2
  14. data/lib/caterer/action/provisioner/uninstall.rb +9 -1
  15. data/lib/caterer/action/server.rb +2 -1
  16. data/lib/caterer/action/{provisioner/install.rb → server/cleanup.rb} +5 -5
  17. data/lib/caterer/action/server/{reboot.rb → prepare.rb} +4 -2
  18. data/lib/caterer/actions.rb +8 -46
  19. data/lib/caterer/cli.rb +50 -4
  20. data/lib/caterer/command.rb +1 -4
  21. data/lib/caterer/command/base.rb +17 -108
  22. data/lib/caterer/command/berks.rb +5 -8
  23. data/lib/caterer/command/clean.rb +6 -4
  24. data/lib/caterer/command/lock.rb +5 -3
  25. data/lib/caterer/command/provision.rb +19 -4
  26. data/lib/caterer/command/server.rb +106 -0
  27. data/lib/caterer/command/unlock.rb +5 -3
  28. data/lib/caterer/commands.rb +0 -3
  29. data/lib/caterer/config.rb +0 -5
  30. data/lib/caterer/config/base.rb +5 -4
  31. data/lib/caterer/config/provisioner/chef_solo.rb +1 -2
  32. data/lib/caterer/group.rb +24 -0
  33. data/lib/caterer/image.rb +88 -0
  34. data/lib/caterer/member.rb +13 -0
  35. data/lib/caterer/provisioner.rb +1 -0
  36. data/lib/caterer/provisioner/base.rb +4 -3
  37. data/lib/caterer/provisioner/chef_solo.rb +58 -123
  38. data/lib/caterer/provisioner/shell.rb +83 -0
  39. data/lib/caterer/provisioners.rb +2 -1
  40. data/lib/caterer/server.rb +18 -36
  41. data/lib/caterer/version.rb +1 -1
  42. data/lib/templates/image/bin_wrapper.erb +8 -0
  43. data/lib/templates/provisioner/chef_solo/{bootstrap → install}/debian.sh +0 -0
  44. data/lib/templates/provisioner/chef_solo/{bootstrap → install}/el.sh +0 -0
  45. data/lib/templates/provisioner/chef_solo/{bootstrap → install}/fedora.sh +0 -0
  46. data/lib/templates/provisioner/chef_solo/{bootstrap → install}/sles.sh +0 -0
  47. data/lib/templates/provisioner/chef_solo/{bootstrap → install}/smartos.sh +0 -0
  48. data/lib/templates/provisioner/chef_solo/{bootstrap → install}/suse.sh +0 -0
  49. data/lib/templates/provisioner/chef_solo/{bootstrap → install}/ubuntu.sh +0 -0
  50. data/lib/templates/provisioner/chef_solo/solo.erb +1 -1
  51. data/lib/templates/provisioner/shell/script.erb +3 -0
  52. metadata +24 -26
  53. data/lib/caterer/action/provisioner/bootstrap.rb +0 -14
  54. data/lib/caterer/action/provisioner/load.rb +0 -29
  55. data/lib/caterer/action/provisioner/provision.rb +0 -14
  56. data/lib/caterer/action/provisioner/validate.rb +0 -10
  57. data/lib/caterer/action/provisioner/validate/bootstrapped.rb +0 -22
  58. data/lib/caterer/action/provisioner/validate/engine.rb +0 -24
  59. data/lib/caterer/command/bootstrap.rb +0 -24
  60. data/lib/caterer/command/reboot.rb +0 -24
  61. data/lib/caterer/command/test.rb +0 -19
  62. data/lib/caterer/command/up.rb +0 -24
  63. data/lib/caterer/config/group.rb +0 -26
  64. data/lib/caterer/config/image.rb +0 -21
  65. data/lib/caterer/config/member.rb +0 -15
data/README.md CHANGED
@@ -1,73 +1,22 @@
1
- # Caterer
1
+ ## Caterer
2
2
 
3
- Heavily inspired by vagrant, caterer is a remote server configuration tool that caters to your servers using a collaborative, fast, and iterative push model. Caterer supports chef-solo by default.
3
+ Caterer is a tool for provisioning production environments.
4
4
 
5
- ## Why?
5
+ ### Getting Started
6
6
 
7
- Caterer is designed as a workflow-first utility around 3 guiding principles:
7
+ #### Install caterer:
8
8
 
9
- 1. Configuration as code.
10
- 2. Push provisioning.
11
- 3. Modular provisioner.
12
-
13
- Caterer does not replace chef or puppet, but leverages them to provide a faster iterative approach to live infrastructures. If you're familiar with the vagrant workflow, imagine that your 'boxes' are remote servers and you'll feel right at home.
14
-
15
- The goal of caterer is that an entire infrastructure definition lives within a git repo. An infrastructure developer can open the Caterfile and read the infrastructure like a map. All provisioning recipes or definitions will live within this repo, and infrastructure developers can interate repidly to provide a hot infrastructure.
16
-
17
- ## Installation
18
-
19
- Add this line to your application's Gemfile:
20
-
21
- gem 'caterer'
22
-
23
- And then execute:
24
-
25
- $ bundle
26
-
27
- Or install it yourself as:
28
-
29
- $ gem install caterer
30
-
31
- ## Usage
32
-
33
- ### Caterfile
34
-
35
- Caterer loads a Caterfile from the current directory. A Caterfile defines your infrastructure in a centralized, familiar ruby dsl. A Caterfile essentially creates a library of images that can be aggregated and applied to live servers.
36
-
37
- ### Images
38
-
39
- An image is a configuration construct that defines the end state of the machine after that image has been applied. An image requires a provisioner.
40
-
41
- ### Provisioner
42
-
43
- A provisioner is the tool that will provision a server to meet the end requirements of an image. Currently only chef-solo is supported.
44
-
45
- ### Member
46
-
47
- A member is an optional configuration for servers. Storing live server credentials in a version controlled repo is not suitable for many infrastructures, but is there for your convenience if you want it.
48
-
49
- ### Group
50
-
51
- A group is a simply way of grouping images or members to provide agrregate funcionality in a simple, concise way.
52
-
53
- ## Example
9
+ ```bash
10
+ gem install caterer
11
+ ```
54
12
 
55
- ### Caterfile
13
+ #### Define images in a Caterfile:
56
14
 
57
15
  ```ruby
58
16
  Caterer.configure do |config|
59
17
 
60
- config.image :basic do |image|
61
- image.provision :chef_solo do |chef|
62
- chef.cookbooks_path = ['cookbooks'] # default
63
- chef.add_recipe 'ruby'
64
- end
65
- end
66
-
67
18
  config.image :rails do |image|
68
19
  image.provision :chef_solo do |chef|
69
- chef.bootstrap_script = 'script/bootstrap'
70
- chef.cookbooks_path = ['cookbooks'] # default
71
20
  chef.add_recipe 'ruby'
72
21
  chef.add_recipe 'mysql::server'
73
22
  chef.add_recipe 'mysql::client'
@@ -78,83 +27,52 @@ Caterer.configure do |config|
78
27
  }
79
28
  end
80
29
  end
81
-
82
- config.member :m1 do |member|
83
- member.images = [:basic]
84
- member.host = "192.168.1.101"
85
- member.password = 'samIam'
86
- end
87
-
88
- config.group :oven do |group|
89
-
90
- group.images = [:basic, :rails]
91
- group.user = 'root' # optional
92
- group.password = 'password' # optional
93
-
94
- # optional member configuration
95
- group.member :oven1 do |m|
96
- m.host = "192.168.1.100"
97
- end
98
-
99
- group.member :oven2 do |m|
100
- m.host = "192.168.1.101"
101
- m.password = 'samIam'
102
- end
103
-
104
- end
105
-
106
30
  end
107
31
  ```
108
32
 
109
- ### Command Line
110
-
111
- Provision a server with a basic image (image defined in Caterfile)
33
+ #### Provision a server with the "rails" image:
112
34
 
113
35
  ```bash
114
- cater provision -i basic HOST
36
+ cater provision HOST -i rails
115
37
  ```
116
38
 
117
- Provision a server with multiple images (images defined in Caterfile)
39
+ ## Documentation
118
40
 
119
- ```bash
120
- cater provision -i basic,rails HOST
121
- ```
41
+ The Caterer Wiki has lots of additional information about Caterer including many usage references, configuration examples, how-to articles, and answers to the most frequently asked questions.
122
42
 
123
- Provision a server with a group (group defined in Caterfile)
43
+ You can view all of the available wiki pages [here](https://github.com/tylerflint/caterer/wiki/_pages).
124
44
 
125
- ```bash
126
- cater provision -g oven HOST
127
- ```
45
+ ### Getting started
128
46
 
129
- Provision a server from a member defined in Caterfile
47
+ Here is the basic information to get started: [Soup to Nuts](https://github.com/tylerflint/caterer/wiki/Soup-to-Nuts)
130
48
 
131
- ```bash
132
- cater provision m1
133
- ```
49
+ For answers to the most frequently asked questions: [FAQ](https://github.com/tylerflint/caterer/wiki/FAQ)
134
50
 
135
- Provision a server from a group member
51
+ Some definitions to help you through the rest of the guides: [Definitions](https://github.com/tylerflint/caterer/wiki/Definitions)
136
52
 
137
- ```bash
138
- cater provision oven::oven1
139
- ```
53
+ A few cli usage examples: [cli examples](https://github.com/tylerflint/caterer/wiki/cli-examples)
140
54
 
141
- Provision multiple servers from members defined in Caterfile
55
+ ### Configuration
142
56
 
143
- ```bash
144
- cater provision m1,oven::oven1,oven::oven2
145
- ```
57
+ * [general](https://github.com/tylerflint/caterer/wiki/Config:-General)
58
+ * [images](https://github.com/tylerflint/caterer/wiki/Config:-Images)
59
+ * [members](https://github.com/tylerflint/caterer/wiki/Config:-Members)
60
+ * [groups](https://github.com/tylerflint/caterer/wiki/Config:-Groups)
146
61
 
147
- Bootstrap a server
62
+ #### Provisioners
63
+ * [shell](https://github.com/tylerflint/caterer/wiki/Config:-Provisioners:-Shell)
64
+ * [chef-solo](https://github.com/tylerflint/caterer/wiki/Config:-Provisioners:-chef-solo)
148
65
 
149
- ```bash
150
- cater bootstrap -i basic HOST
151
- ```
66
+ ### How To...
152
67
 
153
- Boostrap and provision a server
68
+ Use berkshelf for cookbook dependencies: [Howto: Berkshelf](https://github.com/tylerflint/caterer/wiki/Howto:-Berkshelf)
69
+
70
+ Display verbose output: [Howto: Verbose Logging](https://github.com/tylerflint/caterer/wiki/Howto:-Verbose-Logging)
71
+
72
+ Structure a large project: [Howto: Large Projects](https://github.com/tylerflint/caterer/wiki/Howto:-Large-Projects)
73
+
74
+ Limit chef runlist for iterative provisioning: [Howto: Runlist Override]()
154
75
 
155
- ```bash
156
- cater up -i basic HOST
157
- ```
158
76
 
159
77
  ## Contributing
160
78
 
@@ -3,12 +3,12 @@
3
3
  Vagrant.configure("2") do |config|
4
4
 
5
5
  # ubuntu
6
- # config.vm.box = 'precise'
7
- # config.vm.box_url = 'http://files.vagrantup.com/precise64.box'
6
+ config.vm.box = 'precise'
7
+ config.vm.box_url = 'http://files.vagrantup.com/precise64.box'
8
8
 
9
9
  # centos
10
- config.vm.box = 'pagoda_cent6_minimal'
11
- config.vm.box_url = 'https://s3.amazonaws.com/vagrant.pagodabox.com/boxes/centos-6.4-x86_64-minimal.box'
10
+ # config.vm.box = 'pagoda_cent6_minimal'
11
+ # config.vm.box_url = 'https://s3.amazonaws.com/vagrant.pagodabox.com/boxes/centos-6.4-x86_64-minimal.box'
12
12
 
13
13
  config.vm.provider "virtualbox" do |v|
14
14
  v.customize ["modifyvm", :id, "--cpus", "2", "--memory", "1024", "--cpuexecutioncap", "75"]
@@ -10,6 +10,9 @@ module Caterer
10
10
  autoload :Communication, 'caterer/communication'
11
11
  autoload :Config, 'caterer/config'
12
12
  autoload :Environment, 'caterer/environment'
13
+ autoload :Group, 'caterer/group'
14
+ autoload :Image, 'caterer/image'
15
+ autoload :Member, 'caterer/member'
13
16
  autoload :Provisioner, 'caterer/provisioner'
14
17
  autoload :Server, 'caterer/server'
15
18
  autoload :Util, 'caterer/util'
@@ -4,6 +4,7 @@ module Caterer
4
4
  autoload :Berkshelf, 'caterer/action/berkshelf'
5
5
  autoload :Config, 'caterer/action/config'
6
6
  autoload :Environment, 'caterer/action/environment'
7
+ autoload :Image, 'caterer/action/image'
7
8
  autoload :Runner, 'caterer/action/runner'
8
9
  autoload :Provisioner, 'caterer/action/provisioner'
9
10
  autoload :Server, 'caterer/action/server'
@@ -44,8 +44,10 @@ module Caterer
44
44
  ::Digest::MD5.hexdigest("#{berks_content}/#{lock_content}/#{shelf_content}")
45
45
  end
46
46
 
47
+ # default to true for time being...
47
48
  def needs_update?
48
- !(::File.exists?(cachefile) and ::File.read(cachefile) == shelf_digest)
49
+ # !(::File.exists?(cachefile) and ::File.read(cachefile) == shelf_digest)
50
+ true
49
51
  end
50
52
 
51
53
  def update_cache
@@ -7,19 +7,25 @@ module Caterer
7
7
  def call(env)
8
8
 
9
9
  if env[:image]
10
- provisioner = env[:config].images[env[:image]].provisioner
11
10
 
12
- if not provisioner
13
- env[:ui].error "provisioner for image ':#{env[:image]}' is not defined"
11
+ provisioners = env[:config].images[env[:image]].provisioners
12
+
13
+ if provisioners.empty?
14
+ env[:ui].error "image ':#{env[:image]}' does not have a provisioner"
14
15
  return
15
16
  end
16
-
17
- if errors = provisioner.errors
18
- errors.each do |key, val|
19
- env[:ui].error "image :#{env[:image]} provisioner error -> #{key} #{val}"
20
- end
21
- return
22
- end
17
+
18
+ provisioners.each do |provisioner|
19
+
20
+ if errors = provisioner.errors
21
+ errors.each do |key, val|
22
+ env[:ui].error "image :#{env[:image]} provisioner error -> #{key} #{val}"
23
+ end
24
+ return
25
+ end
26
+
27
+ end
28
+
23
29
  end
24
30
 
25
31
  @app.call(env)
@@ -0,0 +1,9 @@
1
+ module Caterer
2
+ module Action
3
+ module Image
4
+ autoload :Cleanup, 'caterer/action/image/cleanup'
5
+ autoload :Prepare, 'caterer/action/image/prepare'
6
+ autoload :Run, 'caterer/action/image/run'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ module Caterer
2
+ module Action
3
+ module Image
4
+ class Cleanup < Base
5
+
6
+ def call(env)
7
+
8
+ config = env[:config]
9
+ server = env[:server]
10
+ image = config.images[env[:image]]
11
+
12
+ image.cleanup(server) if env[:ghost_mode]
13
+
14
+ @app.call(env)
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Caterer
2
+ module Action
3
+ module Image
4
+ class Prepare < Base
5
+
6
+ def call(env)
7
+
8
+ config = env[:config]
9
+ server = env[:server]
10
+ image = config.images[env[:image]]
11
+
12
+ image.prepare(server)
13
+
14
+ @app.call(env)
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Caterer
2
+ module Action
3
+ module Image
4
+ class Run < Base
5
+
6
+ def call(env)
7
+
8
+ config = env[:config]
9
+ server = env[:server]
10
+ image = config.images[env[:image]]
11
+
12
+ image.run(server) if not env[:dry_run]
13
+
14
+ @app.call(env)
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,16 +1,9 @@
1
1
  module Caterer
2
2
  module Action
3
3
  module Provisioner
4
- autoload :Bootstrap, 'caterer/action/provisioner/bootstrap'
5
4
  autoload :Cleanup, 'caterer/action/provisioner/cleanup'
6
- autoload :Install, 'caterer/action/provisioner/install'
7
- autoload :Load, 'caterer/action/provisioner/load'
8
- autoload :Lock, 'caterer/action/provisioner/lock'
9
5
  autoload :Prepare, 'caterer/action/provisioner/prepare'
10
- autoload :Provision, 'caterer/action/provisioner/provision'
11
6
  autoload :Uninstall, 'caterer/action/provisioner/uninstall'
12
- autoload :Unlock, 'caterer/action/provisioner/unlock'
13
- autoload :Validate, 'caterer/action/provisioner/validate'
14
7
  end
15
8
  end
16
9
  end
@@ -4,10 +4,28 @@ module Caterer
4
4
  class Cleanup < Base
5
5
 
6
6
  def call(env)
7
- env[:provisioner].cleanup(env[:server])
7
+
8
+ config = env[:config]
9
+ server = env[:server]
10
+ image = config.images[env[:image]]
11
+
12
+ image.provisioners.each do |provisioner|
13
+ %w( cleanup uninstall ).each do |action|
14
+ send action.to_sym, server, provisioner
15
+ end
16
+ end
17
+
8
18
  @app.call(env)
9
19
  end
10
20
 
21
+ def cleanup(server, provisioner)
22
+ provisioner.cleanup(server)
23
+ end
24
+
25
+ def uninstall(server, provisioner)
26
+ provisioner.uninstall(server) if @env[:ghost_mode]
27
+ end
28
+
11
29
  end
12
30
  end
13
31
  end
@@ -4,11 +4,29 @@ module Caterer
4
4
  class Prepare < Base
5
5
 
6
6
  def call(env)
7
- env[:provisioner].prepare(env[:server])
7
+
8
+ config = env[:config]
9
+ server = env[:server]
10
+ image = config.images[env[:image]]
11
+
12
+ image.provisioners.each do |provisioner|
13
+ %w( install prepare ).each do |action|
14
+ send action.to_sym, server, provisioner
15
+ end
16
+ end
17
+
8
18
  @app.call(env)
9
19
  end
20
+
21
+ def install(server, provisioner)
22
+ provisioner.install server if not provisioner.installed? server
23
+ end
24
+
25
+ def prepare(server, provisioner)
26
+ provisioner.prepare server
27
+ end
10
28
 
11
- end
29
+ end
12
30
  end
13
31
  end
14
32
  end
@@ -4,7 +4,15 @@ module Caterer
4
4
  class Uninstall < Base
5
5
 
6
6
  def call(env)
7
- env[:provisioner].uninstall(env[:server])
7
+
8
+ config = env[:config]
9
+ server = env[:server]
10
+ image = config.images[env[:image]]
11
+
12
+ image.provisioners.each do |provisioner|
13
+ provisioner.uninstall(server)
14
+ end
15
+
8
16
  @app.call(env)
9
17
  end
10
18