serverkit 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a305e729177502f64c869b2629dd30acfad21ae
4
- data.tar.gz: 712936e178cf102fd9725046027f9cb7e96d7fca
3
+ metadata.gz: 24b5913dfd17ab82dcc688aba30f392c4fb36f02
4
+ data.tar.gz: b80f8bd60e1a500e5ca7b497d90c0d26144207e6
5
5
  SHA512:
6
- metadata.gz: c1618d46d882bec5251d762b954341f326fb94aaba997bff66e3358306b5da5392c7a4d9714bd45d6a4bd93bf7fbc3b255a132995822954b2cbb5e7d40f2a1d2
7
- data.tar.gz: b27a2c2ee0062256bcfea32e61658e0a5a8eb912e01d30bb0573165f0ef69afdc76c58ffd7192a51c9c3d6617b2eb5fca1518ec964c3b35684fa9baf9c5c9d56
6
+ metadata.gz: 750ad9c4d49922d310ac45455566c78f98871c10318f751a8dfcbc41b5a7b597759b889df73de3167d0c0ddc94dc851e4ca62f70d24b350d5eb1c0df833dd4c4
7
+ data.tar.gz: 5054ae0860bfe29c22e489cc5f3efd55273bedc304d172595c7cb8a9c5c1bd0cd5eb5906d61ef3404b3c48fb8fa32babc29e9527cc6afaf2e7123d2dc5c2b2dc
data/.gitignore CHANGED
@@ -3,7 +3,6 @@
3
3
  /.vagrant
4
4
  /.yardoc
5
5
  /coverage/
6
- /doc/
7
6
  /Gemfile.lock
8
7
  /pkg/
9
8
  /spec/reports/
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.5.1
2
+ - Fix user resource behavior on nil password case
3
+
1
4
  ## 0.5.0
2
5
  - Add validation_script attribute on line resource
3
6
 
@@ -31,7 +34,7 @@
31
34
  - Change some attribue names on user resource
32
35
 
33
36
  ## 0.4.2
34
- - Fix bug on apply action exit code
37
+ - Fix bug on apply action exit status
35
38
  - Support case-insensitive or number log-level
36
39
 
37
40
  ## 0.4.1
@@ -51,7 +54,7 @@
51
54
  - Change attributes naming rule: status -> state
52
55
 
53
56
  ## 0.3.3
54
- - Return exit code 1 if any resource failed
57
+ - Return exit status 1 if any resource failed
55
58
 
56
59
  ## 0.3.2
57
60
  - Fix git resource on git-clone
data/README.md CHANGED
@@ -1,288 +1,56 @@
1
1
  # Serverkit [![Build Status](https://travis-ci.org/r7kamura/serverkit.svg)](https://travis-ci.org/r7kamura/serverkit) [![Code Climate](https://codeclimate.com/github/r7kamura/serverkit/badges/gpa.svg)](https://codeclimate.com/github/r7kamura/serverkit)
2
- Configuration management toolkit for IT automation.
2
+ Assemble servers from your recipe.
3
3
 
4
- - [Usage](#usage)
5
- - [serverkit validate](#serverkit-validate)
6
- - [serverkit inspect](#serverkit-inspect)
7
- - [serverkit check](#serverkit-check)
8
- - [serverkit apply](#serverkit-apply)
9
- - [SSH support](#ssh-support)
10
- - [Log](#log)
11
- - [Recipe](#recipe)
12
- - [Format](#format)
13
- - [Variables](#variables)
14
- - [Example](#example)
15
- - [Resource](#resource)
16
- - [Attributes](#attributes)
17
- - [Type](#type)
18
- - [Example](#example-1)
19
- - [Handler](#handler)
20
- - [Plug-in](#plug-in)
21
- - [Vagrant](#vagrant)
4
+ ![Server (thx 1041uuu)](/images/server.png)
22
5
 
23
6
  ## Usage
24
- Write a recipe, then run `serverkit` executable to validate, inspect, check, and apply the recipe.
7
+ Describe the desired state, then `serverkit apply`.
25
8
 
26
- ### serverkit validate
27
- Validates recipe schema, resources, and attributes.
28
- For instance, it shows validation error if `source` attributes is missing in `remote_file` resource.
29
- If any validation error is detected, it returns exit status 1.
30
-
31
- ```
32
- $ serverkit validate recipe.yml
33
- Error: source attribute is required in remote_file resource
34
- Error: path attribute can't be unreadable path in recipe resource
35
- ```
36
-
37
- ### serverkit inspect
38
- Shows fully-expanded recipe data in JSON format.
39
-
40
- ```
41
- $ serverkit inspect recipe.yml
42
- {
43
- "resources": [
44
- {
45
- "type": "homebrew",
46
- "name": "mysql"
47
- },
48
- {
49
- "type": "homebrew",
50
- "name": "redis"
51
- },
52
- {
53
- "type": "homebrew_cask",
54
- "name": "licecap"
55
- },
56
- {
57
- "type": "homebrew_cask",
58
- "name": "alfred"
59
- },
60
- {
61
- "type": "git",
62
- "repository": "git@github.com:r7kamura/dotfiles.git",
63
- "path": "/Users/r7kamura/src/github.com/r7kamura/dotfiles"
64
- },
65
- {
66
- "type": "symlink",
67
- "source": "/Users/r7kamura/.zshrc",
68
- "destination": "/Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc"
69
- }
70
- ]
71
- }
72
- ```
73
-
74
- ### serverkit check
75
- Shows the difference between your recipe and the state of the target host.
76
- If any difference is detected, it returns exit status 1.
77
-
78
- ```
79
- $ serverkit check recipe.yml
80
- [ OK ] homebrew mysql on localhost
81
- [ OK ] homebrew redis on localhost
82
- [ OK ] homebrew_cask licecap on localhost
83
- [ OK ] homebrew_cask alfred on localhost
84
- [ NG ] git git@github.com:r7kamura/dotfiles.git on localhost
85
- [ NG ] symlink /Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc on localhost
86
- ```
87
-
88
- ### serverkit apply
89
- Executes migration process to fill-in the gaps.
90
- If any failure is detected, it returns exit status 1.
91
-
92
- ```
93
- $ serverkit apply recipe.yml
94
- [SKIP] homebrew mysql on localhost
95
- [SKIP] homebrew redis on localhost
96
- [SKIP] homebrew_cask licecap on localhost
97
- [SKIP] homebrew_cask alfred on localhost
98
- [DONE] git git@github.com:r7kamura/dotfiles.git on localhost
99
- [DONE] symlink /Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc on localhost
100
- ```
101
-
102
- ### SSH support
103
- Use `--hosts=` option to execute serverkit over SSH.
104
- Serverkit does not require any installation on server-side.
105
- If you want to specify SSH configuration, write it into your ~/.ssh/config.
106
-
107
- ```
108
- $ serverkit apply recipe.yml --hosts=alpha.example.com
109
- $ serverkit apply recipe.yml --hosts=alpha.example.com,bravo.example.com
110
- ```
111
-
112
- ### Log
113
- You can change serverkit log level by passing `--log-level=` command line option.
114
- Available values are `DEBUG`, `ERROR`, `FATAL`, `WARN`, OR `INFO` (default).
115
- General result lines like `[SKIP] ...` and `[ OK ] ...` are logged with FATAL level,
116
- and all shell commands executed on hosts are logged with DEBUG level.
117
- Pass `--no-color` option if you would like to disable colored log outputs.
118
-
119
- ```
120
- $ serverkit apply recipe.yml --hosts=alpha.example.com --log-level=debug --no-color
121
- ```
122
-
123
- ## Recipe
124
- A recipe describes the desired state of your server.
125
- It is mostly a collection of resources, defined using certain patterns.
126
-
127
- ### Format
128
- A recipe can be specified as a path to one of the following patterns:
129
-
130
- - JSON file
131
- - YAML file named with \*.yaml or \*.yml
132
- - ERB file named with \*.json.erb or \*.yml.erb
133
- - Executable to output JSON
134
- - Directory including recipe files recursively
135
-
136
- ```
137
- $ serverkit apply recipe
138
- $ serverkit apply recipe.json
139
- $ serverkit apply recipe.json.erb
140
- $ serverkit apply recipe.json.erb --variables=variables
141
- $ serverkit apply recipe.json.erb --variables=variables.json
142
- $ serverkit apply recipe.json.erb --variables=variables.json.erb
143
- $ serverkit apply recipe.json.erb --variables=variables.yml
144
- $ serverkit apply recipe.json.erb --variables=variables.yml.erb
145
- $ serverkit apply recipe.json.erb --variables=variables/
146
- $ serverkit apply recipe.yml
147
- $ serverkit apply recipe.yml.erb
148
- $ serverkit apply recipes/
149
- ```
150
-
151
- ### Variables
152
- When using ERB recipe, you can also give optional variables file
153
- that defines configurations in a Hash object for ERB template.
154
- It supports similar format variation with Recipe.
155
- In ERB template, you can use given variables via methods named after its keys.
156
-
157
- ### Example
158
- This is an example recipe to install some packages, clone a git repository, and create a symlink.
159
-
160
- ```yml
161
- # variables.yml
162
- dotfiles_repository: r7kamura/dotfiles
163
- user: r7kamura
164
- ```
165
-
166
- ```yml
167
- # recipe.yml.erb
9
+ ```sh
10
+ $ echo '
168
11
  resources:
169
12
  - type: package
170
13
  name: mysql
171
14
  - type: package
172
15
  name: redis
173
- - type: git
174
- repository: git@github.com:<%= dotfiles_repository %>.git
175
- path: /Users/<%= user %>/src/github.com/<%= dotfiles_repository %>
176
- - type: symlink
177
- source: /Users/<%= user %>/.zshrc
178
- destination: /Users/<%= user %>/src/github.com/<%= dotfiles_repository %>/.zshrc
179
- ```
180
-
181
- ## Resource
182
- A resource is a statement of configuration policy that describes the desired state for an item.
183
-
184
- ### Attributes
185
- Each resource has different attributes along with its type.
186
- By default, all types of resource can or must have the following attributes:
187
-
188
- - type - what type this resource represents (required)
189
- - check_script - pass shell script to override the `#check` phase
190
- - recheck_script - pass shell script to override the `#recheck` phase (runned after `#apply`)
191
- - id - change resource identifier used in log, and also used for `notify`
192
- - notify - specify an Array of handler ids that should be applied after changed
193
-
194
- ### Type
195
- A resource must have a valid type attribute like:
196
-
197
- - [command](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/command.rb)
198
- - [directory](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/directory.rb)
199
- - [file](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/file.rb)
200
- - [git](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/git.rb)
201
- - [group](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/group.rb)
202
- - [line](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/line.rb)
203
- - [nothing](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/nothing.rb)
204
- - [package](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/package.rb)
205
- - [recipe](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/recipe.rb)
206
- - [remote_file](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/remote_file.rb)
207
- - [service](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/service.rb)
208
- - [symlink](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/symlink.rb)
209
- - [template](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/template.rb)
210
- - [user](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/user.rb)
211
-
212
- ### Example
213
- An example package resource that has type and name attributes.
214
-
215
- ```yml
216
- resources:
217
- - type: package
218
- name: mysql
219
- ```
220
-
221
- ## Handler
222
- When any changes are successfully applied to a resource and it has notify attribute,
223
- it notifies handlers that are referenced by their id.
224
- The notified handlers will run only once after all resources finished their applications.
225
- Here's an example of restarting Dock on Mac OS X when its preferences change.
226
-
227
- ```yml
228
- resources:
229
- - type: defaults
230
- domain: com.apple.dock
231
- key: autohide
232
- value: 1
233
- notify:
234
- - restart_dock
235
- - type: defaults
236
- domain: com.apple.dock
237
- key: persistent-apps
238
- value: []
239
- notify:
240
- - restart_dock
241
- handlers:
242
- - id: restart_dock
243
- type: command
244
- script: killall Dock
245
- ```
246
-
247
- ## Plug-in
248
- A plug-in is provided as a gem.
249
- Serverkit calls `Bundler.require(:default)` before running an action,
250
- so you can add any behaviors to serverkit via gems defined in Gemfile.
251
- For example, [serverkit-rbenv](https://github.com/r7kamura/serverkit-rbenv) gem
252
- adds a custom resource type named `rbenv_ruby` by defining `Serverkit::Resources::RbenvRuby` class.
253
- Serverkit finds `Serverkit::Resources::FooBar` resource class from `type: "foo_bar"`.
254
-
255
- - [serverkit-atom](https://github.com/r7kamura/serverkit-atom)
256
- - [serverkit-defaults](https://github.com/r7kamura/serverkit-defaults)
257
- - [serverkit-homebrew](https://github.com/r7kamura/serverkit-homebrew)
258
- - [serverkit-karabiner](https://github.com/r7kamura/serverkit-karabiner)
259
- - [serverkit-rbenv](https://github.com/r7kamura/serverkit-rbenv)
260
-
261
- ```rb
262
- # Gemfile
263
- gem "serverkit"
264
- gem "serverkit-atom"
265
- gem "serverkit-defaults"
266
- gem "serverkit-homebrew"
267
- gem "serverkit-karabiner"
268
- gem "serverkit-rbenv"
269
- ```
270
-
271
- ## Vagrant
272
- [vagrant-serverkit](https://github.com/r7kamura/vagrant-serverkit)
273
- helps you provision your vagrant box with serverkit.
274
-
275
- ```rb
276
- # Vagrantfile
277
- Vagrant.configure("2") do |config|
278
- config.vm.box = "ubuntu/trusty64"
279
- config.vm.provision :serverkit do |serverkit_config|
280
- serverkit_config.recipe_path = "recipe.yml"
281
- end
282
- end
16
+ ' > recipe.yml
17
+ $ serverkit apply recipe.yml
283
18
  ```
284
19
 
285
- ```
286
- $ vagrant plugin install vagrant-serverkit
287
- $ vagrant up
288
- ```
20
+ ## Documentation
21
+ - [Install](/doc/install.md)
22
+ - [serverkit apply](/doc/action_apply.md)
23
+ - [serverkit check](/doc/action_check.md)
24
+ - [serverkit inspect](/doc/action_inspect.md)
25
+ - [serverkit validate](/doc/action_validate.md)
26
+ - [Recipe](/doc/recipe.md)
27
+ - [Resource](/doc/resource.md)
28
+ - [command](/doc/resource_command.md)
29
+ - [directory](/doc/resource_directory.md)
30
+ - [file](/doc/resource_file.md)
31
+ - [git](/doc/resource_git.md)
32
+ - [group](/doc/resource_group.md)
33
+ - [line](/doc/resource_line.md)
34
+ - [nothing](/doc/resource_nothing.md)
35
+ - [package](/doc/resource_package.md)
36
+ - [recipe](/doc/resource_recipe.md)
37
+ - [remote_file](/doc/resource_remote_file.md)
38
+ - [service](/doc/resource_service.md)
39
+ - [symlink](/doc/resource_symlink.md)
40
+ - [template](/doc/resource_template.md)
41
+ - [user](/doc/resource_user.md)
42
+ - [Plug-in](/doc/plug_in.md)
43
+ - [serverkit-atom](https://github.com/r7kamura/serverkit-atom)
44
+ - [serverkit-defaults](https://github.com/r7kamura/serverkit-defaults)
45
+ - [serverkit-homebrew](https://github.com/r7kamura/serverkit-homebrew)
46
+ - [serverkit-karabiner](https://github.com/r7kamura/serverkit-karabiner)
47
+ - [serverkit-rbenv](https://github.com/r7kamura/serverkit-rbenv)
48
+ - [serverkit-login_items](https://github.com/take/serverkit-login_items)
49
+ - [Vagrant integration](/doc/vagrant_integration.md)
50
+
51
+ ## Similar tools
52
+ - [ansible/ansible](https://github.com/ansible/ansible)
53
+ - [fabric/fabric](https://github.com/fabric/fabric)
54
+ - [chef/chef](https://github.com/chef/chef)
55
+ - [puppetlabs/puppet](https://github.com/puppetlabs/puppet)
56
+ - [itamae-kitchen/itamae](https://github.com/itamae-kitchen/itamae)
data/Vagrantfile CHANGED
@@ -4,9 +4,10 @@ Vagrant.configure("2") do |config|
4
4
  config.plugin.add_dependency "vagrant-multiplug"
5
5
  config.plugin.add_dependency "vagrant-serverkit", "0.0.5"
6
6
 
7
- config.vm.provision :serverkit do |serverkit_config|
8
- serverkit_config.log_level = "DEBUG"
9
- serverkit_config.recipe_path = "example/recipe.yml"
10
- serverkit_config.variables_path = "example/variables.yml"
11
- end
7
+ config.vm.provision(
8
+ :serverkit,
9
+ log_level: "DEBUG",
10
+ recipe_path: "example/recipe.yml",
11
+ variables_path: "example/variables.yml",
12
+ )
12
13
  end
@@ -0,0 +1,58 @@
1
+ # serverkit apply
2
+ `serverkit apply` is an executable action to execute migration process to fill-in the gaps
3
+ between the specified recipe and the state of the target host.
4
+
5
+ ## Successful case
6
+ If no error was found, it returns exit status 0.
7
+
8
+ ```
9
+ $ serverkit apply recipe.yml
10
+ [SKIP] homebrew mysql on localhost
11
+ [SKIP] homebrew redis on localhost
12
+ [SKIP] homebrew_cask licecap on localhost
13
+ [SKIP] homebrew_cask alfred on localhost
14
+ [DONE] git git@github.com:r7kamura/dotfiles.git on localhost
15
+ [DONE] symlink /Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc on localhost
16
+ $ echo $?
17
+ 0
18
+ ```
19
+
20
+ ## Failed case
21
+ If any error was found, it returns exit status 1.
22
+
23
+ ```
24
+ $ serverkit apply recipe.yml
25
+ [SKIP] homebrew mysql on localhost
26
+ [SKIP] homebrew redis on localhost
27
+ [SKIP] homebrew_cask licecap on localhost
28
+ [SKIP] homebrew_cask alfred on localhost
29
+ [FAIL] git git@github.com:r7kamura/dotfiles.git on localhost
30
+ [DONE] symlink /Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc on localhost
31
+ $ echo $?
32
+ 1
33
+ ```
34
+
35
+ ## --hosts= option
36
+ Use `--hosts=` option to execute serverkit over SSH.
37
+ Serverkit does not require any installation on server-side.
38
+ You can run serverkit on multiple hosts by passing hosts in comma-separated style.
39
+ If you want to specify SSH configuration, write it into your ~/.ssh/config.
40
+ This option is also available in `serverkit check` action.
41
+
42
+ ```
43
+ $ serverkit apply recipe.yml --hosts=alpha.example.com
44
+ $ serverkit apply recipe.yml --hosts=alpha.example.com,bravo.example.com
45
+ $ serverkit apply recipe.yml --hosts=app1,app2,app3
46
+ ```
47
+
48
+ ## --log-level option
49
+ You can change serverkit log level by passing `--log-level=` option with
50
+ `DEBUG`, `ERROR`, `FATAL`, `WARN`, or `INFO` (case-insensitive, and the default is `INFO`).
51
+ For example, the general result lines like `[SKIP] ...` and `[ OK ] ...` are logged with FATAL level,
52
+ and all shell commands executed on hosts are logged with DEBUG level.
53
+ The log output is colored by default.
54
+ Pass `--no-color` option if you want to disable colored log outputs.
55
+
56
+ ```
57
+ $ serverkit apply recipe.yml --hosts=alpha.example.com --log-level=debug --no-color
58
+ ```
@@ -0,0 +1,36 @@
1
+ # serverkit check
2
+ `serverkit check` is an executable action to show the difference between the specified recipe and
3
+ the state of the target host (a.k.a. "dry-run" in other tools).
4
+ Note that this action might do some destructive behaviors by resource implementations (e.g. `git fetch`).
5
+ This action takes the same options with `serverkit apply` action.
6
+ See [/doc/action_apply.md] for more details.
7
+
8
+ ## Same case
9
+ If no difference was detected, it returns exit status 0.
10
+
11
+ ```
12
+ $ serverkit check recipe.yml
13
+ [ OK ] homebrew mysql on localhost
14
+ [ OK ] homebrew redis on localhost
15
+ [ OK ] homebrew_cask licecap on localhost
16
+ [ OK ] homebrew_cask alfred on localhost
17
+ [ OK ] git git@github.com:r7kamura/dotfiles.git on localhost
18
+ [ OK ] symlink /Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc on localhost
19
+ $ echo $?
20
+ 0
21
+ ```
22
+
23
+ ## Different case
24
+ If any difference was detected, it returns exit status 1.
25
+
26
+ ```
27
+ $ serverkit check recipe.yml
28
+ [ OK ] homebrew mysql on localhost
29
+ [ OK ] homebrew redis on localhost
30
+ [ OK ] homebrew_cask licecap on localhost
31
+ [ OK ] homebrew_cask alfred on localhost
32
+ [ NG ] git git@github.com:r7kamura/dotfiles.git on localhost
33
+ [ NG ] symlink /Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc on localhost
34
+ $ echo $?
35
+ 1
36
+ ```
@@ -0,0 +1,39 @@
1
+ # serverkit inspect
2
+ `serverkit inspect` is an executable action to show fully-expanded recipe content in JSON format.
3
+ This action is useful as your recipe grows to a large size with using variables, nested recipe, and so on.
4
+ You can specify your recipe by passing its path in the same way as the other actions.
5
+
6
+ ## Example
7
+ ```
8
+ $ serverkit inspect recipe.yml
9
+ {
10
+ "resources": [
11
+ {
12
+ "type": "homebrew",
13
+ "name": "mysql"
14
+ },
15
+ {
16
+ "type": "homebrew",
17
+ "name": "redis"
18
+ },
19
+ {
20
+ "type": "homebrew_cask",
21
+ "name": "licecap"
22
+ },
23
+ {
24
+ "type": "homebrew_cask",
25
+ "name": "alfred"
26
+ },
27
+ {
28
+ "type": "git",
29
+ "repository": "git@github.com:r7kamura/dotfiles.git",
30
+ "path": "/Users/r7kamura/src/github.com/r7kamura/dotfiles"
31
+ },
32
+ {
33
+ "type": "symlink",
34
+ "source": "/Users/r7kamura/.zshrc",
35
+ "destination": "/Users/r7kamura/src/github.com/r7kamura/dotfiles/linked/.zshrc"
36
+ }
37
+ ]
38
+ }
39
+ ```
@@ -0,0 +1,24 @@
1
+ # serverkit validate
2
+ `serverkit validate` is an executable action to check if a specified recipe is valid or not.
3
+ You can specify your recipe by passing its path in the same way as the other actions.
4
+ Note that the other actions (e.g. `inspect`, `check`, `apply`) also runs validation before its task.
5
+
6
+ ## Successful case
7
+ If no error found, it returns exit status 0.
8
+
9
+ ```
10
+ $ serverkit validate recipe.yml
11
+ $ echo $?
12
+ 0
13
+ ```
14
+
15
+ ## Failed case
16
+ If any error found, it reports errors and returns exit status 1.
17
+
18
+ ```
19
+ $ serverkit validate recipe.yml
20
+ Error: source attribute is required in remote_file resource
21
+ Error: path attribute can't be unreadable path in recipe resource
22
+ $ echo $?
23
+ 1
24
+ ```
data/doc/install.md ADDED
@@ -0,0 +1,38 @@
1
+ # Install
2
+ ## Prerequisites
3
+ Ruby 2.0.0 or later is required.
4
+
5
+ ## via Bundler
6
+ We recommend you to use [bundler](http://bundler.io/) to install serverkit and its plugins,
7
+ and run serverkit via `bundle exec serverkit`.
8
+
9
+ ```rb
10
+ # Gemfile
11
+ source "https://rubygems.org"
12
+ gem "serverkit"
13
+ ```
14
+
15
+ ```
16
+ $ gem install bundler
17
+ $ bundle install
18
+ ```
19
+
20
+ ## via Gem
21
+ Instead you can simply install serverkit by `gem` command,
22
+ while you cannot use plugins without bundler.
23
+
24
+ ```
25
+ $ gem install serverkit
26
+ ```
27
+
28
+ ## via Source
29
+ If you want to install serverkit from source code for any reason,
30
+ you can `git clone` the source code and `rake install` it.
31
+ bundler and git are both required in this method.
32
+
33
+ ```
34
+ $ git clone https://github.com/r7kamura/serverkit.git
35
+ $ cd serverkit
36
+ $ bundle install
37
+ $ bundle exec rake install
38
+ ```
data/doc/plug_in.md ADDED
@@ -0,0 +1,18 @@
1
+ # Plug-in
2
+ A serverkit plug-in is provided as a gem.
3
+ Serverkit calls `Bundler.require(:default)` before running an action,
4
+ so you can add any behaviors to serverkit via gems defined in Gemfile.
5
+ For example, [serverkit-rbenv](https://github.com/r7kamura/serverkit-rbenv) gem
6
+ adds a custom resource type named `rbenv_ruby` by defining `Serverkit::Resources::RbenvRuby` class.
7
+ Serverkit finds `Serverkit::Resources::FooBar` resource class from `type: "foo_bar"`.
8
+
9
+ ```rb
10
+ # Gemfile
11
+ gem "serverkit"
12
+ gem "serverkit-atom"
13
+ gem "serverkit-defaults"
14
+ gem "serverkit-homebrew"
15
+ gem "serverkit-karabiner"
16
+ gem "serverkit-rbenv"
17
+ gem "serverkit-login_items"
18
+ ```
data/doc/recipe.md ADDED
@@ -0,0 +1,75 @@
1
+ # Recipe
2
+ A recipe describes the desired state of your server.
3
+ It is mostly a collection of resources, defined using certain patterns.
4
+
5
+ ## Format
6
+ A recipe can be specified as a path to one of the following patterns:
7
+
8
+ - JSON file
9
+ - YAML file named with \*.yaml or \*.yml
10
+ - ERB file named with \*.json.erb or \*.yml.erb
11
+ - Executable to output JSON
12
+ - Directory including recipe files recursively
13
+
14
+ ```
15
+ $ serverkit apply recipe
16
+ $ serverkit apply recipe.json
17
+ $ serverkit apply recipe.json.erb
18
+ $ serverkit apply recipe.json.erb --variables=variables
19
+ $ serverkit apply recipe.json.erb --variables=variables.json
20
+ $ serverkit apply recipe.json.erb --variables=variables.json.erb
21
+ $ serverkit apply recipe.json.erb --variables=variables.yml
22
+ $ serverkit apply recipe.json.erb --variables=variables.yml.erb
23
+ $ serverkit apply recipe.json.erb --variables=variables/
24
+ $ serverkit apply recipe.yml
25
+ $ serverkit apply recipe.yml.erb
26
+ $ serverkit apply recipes/
27
+ ```
28
+
29
+ ## Variables
30
+ When using ERB recipe, you can also give optional variables file via `--variables=` option
31
+ that defines configurations in a Hash object for ERB template.
32
+ It supports similar format variation with Recipe.
33
+ In ERB template, you can use given variables via methods named after its keys.
34
+
35
+ ## Handler
36
+ When any changes are successfully applied to a resource and it has notify attribute,
37
+ it notifies handlers that are referenced by their id.
38
+ The notified handlers will run only once after all resources finished their applications.
39
+ Here's an example of restarting Dock on Mac OS X when its preferences change.
40
+
41
+ ## Example
42
+ ```yml
43
+ # variables.yml
44
+ dotfiles_repository: r7kamura/dotfiles
45
+ user: r7kamura
46
+ ```
47
+
48
+ ```yml
49
+ # recipe.yml.erb
50
+ resources:
51
+ - type: package
52
+ name: mysql
53
+ - type: package
54
+ name: redis
55
+ - type: git
56
+ repository: git@github.com:<%= dotfiles_repository %>.git
57
+ path: /Users/<%= user %>/src/github.com/<%= dotfiles_repository %>
58
+ - type: symlink
59
+ source: /Users/<%= user %>/.zshrc
60
+ destination: /Users/<%= user %>/src/github.com/<%= dotfiles_repository %>/.zshrc
61
+ - type: defaults
62
+ domain: com.apple.dock
63
+ key: autohide
64
+ value: 1
65
+ notify:
66
+ - restart_dock
67
+ handlers:
68
+ - id: restart_dock
69
+ type: command
70
+ script: killall Dock
71
+ ```
72
+
73
+ ```
74
+ $ serverkit apply recipe.yml.erb --variables=variables.yml
75
+ ```
data/doc/resource.md ADDED
@@ -0,0 +1,22 @@
1
+ # Resource
2
+ A resource is a statement of configuration policy that describes the desired state for an item.
3
+
4
+ ## Attributes
5
+ Each resource has different attributes along with its type.
6
+ By default, all types of resource can or must have the following attributes:
7
+
8
+ - type - what type this resource represents (required)
9
+ - check_script - pass shell script to override the `#check` phase
10
+ - recheck_script - pass shell script to override the `#recheck` phase (runned after `#apply`)
11
+ - id - change resource identifier used in log, and also used for `notify`
12
+ - notify - specify an Array of handler ids that should be applied after changed
13
+
14
+ ## Example
15
+ Here is a tiny example recipe that has only one resource with `type` and `name` attributes.
16
+ It desceibes that there must be a mysql package in the target machine.
17
+
18
+ ```yml
19
+ resources:
20
+ - type: package
21
+ name: mysql
22
+ ```
@@ -0,0 +1,18 @@
1
+ # command
2
+ `command` is a resource to execute a command on target hosts.
3
+ This resource takes a shell script to be executed.
4
+
5
+ ## Attributes
6
+ - script - shell script to be executed (required, type: `String`)
7
+
8
+ ## Example
9
+ This recipe ensures the login shell to be `/bin/zsh` on Mac OS X.
10
+ Note that `check_script` attribute (* this attribute is available on all resources)
11
+ is used to check if the current login shell is configured with `/bin/zsh` by `finger` command.
12
+
13
+ ```yaml
14
+ resources:
15
+ - type: command
16
+ check_script: "finger -l | grep -E 'Shell: /bin/zsh$'"
17
+ script: chsh -s /bin/zsh <%= ENV["USER"] %>
18
+ ```
@@ -0,0 +1,20 @@
1
+ # directory
2
+ `directory` is a resource to manage a directory on file system.
3
+
4
+ ## Attributes
5
+ - group - directory group (type: `String`)
6
+ - mode - directory mode (type: `Integer`)
7
+ - owner - directory owner (type: `String`)
8
+ - path - directory path (required, type: `String`)
9
+
10
+ ## Example
11
+ This recipe ensures a directory exists at `/home/foo/.ssh` on a remote host,
12
+ and its mode is `700`, and it is owned by user `foo`.
13
+
14
+ ```yaml
15
+ resources:
16
+ - type: directory
17
+ path: /home/foo/.ssh
18
+ mode: 700
19
+ owner: foo
20
+ ```
@@ -0,0 +1,22 @@
1
+ # file
2
+ `file` is a resource to manage a file on file system.
3
+
4
+ ## Attributes
5
+ - content - file content (type: `String`). `remote_host` resource is recommended for complex content.
6
+ - group - file group (type: `String`)
7
+ - mode - file mode (type: `Integer`)
8
+ - owner - file owner (type: `String`)
9
+ - path - file path (required, type: `String`)
10
+
11
+ ## Example
12
+ This recipe ensures a file exists at `/home/foo/.ssh/authorized_keys` on a remote host
13
+ with specified content, and its mode is `600`, and its owner is user `foo`.
14
+
15
+ ```yaml
16
+ resources:
17
+ - type: file
18
+ path: /home/foo/.ssh/authorized_keys
19
+ content: ...
20
+ mode: 600
21
+ owner: foo
22
+ ```
@@ -0,0 +1,20 @@
1
+ # git
2
+ `git` is a resource to ensure a git repository exists on a remote host.
3
+
4
+ ## Attributes
5
+ - path - where repository is cloned (required, type: `String`)
6
+ - repository - repository URL (required, type: `String`)
7
+ - state - whether it must be same revision with origin (`"cloned"` or `"updated"`, default: `"cloned"`)
8
+
9
+ ## Example
10
+ This recipe ensures a git repository is cloned from
11
+ `https://github.com/r7kamura/dotfiles.git` at
12
+ `/Users/r7kamura/src/github.com/r7kamura/dotfiles` on a remote host.
13
+
14
+ ```yaml
15
+ resources:
16
+ - type: git
17
+ path: /Users/r7kamura/src/github.com/r7kamura/dotfiles
18
+ repository: https://github.com/r7kamura/dotfiles.git
19
+ state: updated
20
+ ```
@@ -0,0 +1,16 @@
1
+ # group
2
+ `group` is a resource to ensure a group exists on a remote host.
3
+
4
+ ## Attributes
5
+ - gid - group gid (type: `Integer`)
6
+ - name - group name (required, type: `String`)
7
+
8
+ ## Example
9
+ This recipe ensures a group `staff` of gid `20` exists on a remote host.
10
+
11
+ ```yaml
12
+ resources:
13
+ - type: group
14
+ gid: 20
15
+ name: staff
16
+ ```
@@ -0,0 +1,27 @@
1
+ # line
2
+ `line` is a resource to ensure a particular line is in a file,
3
+ or replace an existing line using regexp.
4
+
5
+ ## Attributes
6
+ - path - file path on remote host (required, type: `String`)
7
+ - insert_after - regexp to specify where line will be inserted (type: `String`), prior last match
8
+ - insert_before - regexp to specify where line will be inserted (type: `String`), prior last match
9
+ - line - inserted line content (required, type: `String`)
10
+ - pattern - regexp to check if a line already exists or not (type: `String`)
11
+ - state - `"absent"` or `"present"` (default)
12
+ - validation_script - shell script to run before copying into place (type: `String`, Use `%{path}` in the command to indicate the current file to validate)
13
+
14
+ ## Example
15
+ This recipe ensures a line `"%wheel ALL=(ALL) ALL"` is in `/etc/sudoers` before a line
16
+ matched with `Regexp.new("^#includedir")`, if no line matched with
17
+ `Regexp.new('%wheel +ALL=\(ALL\) ALL')` and `visudo -cf /path/to/tempfile` succeeded.
18
+
19
+ ```yaml
20
+ resources:
21
+ - type: line
22
+ path: /etc/sudoers
23
+ pattern: '%wheel +ALL=\(ALL\) ALL'
24
+ line: "%wheel ALL=(ALL) ALL"
25
+ insert_before: "^#includedir"
26
+ validation_script: visudo -cf %{path}
27
+ ```
@@ -0,0 +1,17 @@
1
+ # nothing
2
+ `nothing` is a resource to do nothing.
3
+ This is useful for handlers to run after other resources finished,
4
+ or useful for some debug use.
5
+ This resource always fails on check phase and succeeds on recheck phase.
6
+
7
+ ## Attributes
8
+ No specific attributes for this resource,
9
+ but of course the default attributes are available on all resource types.
10
+
11
+ ## Example
12
+ This is an example recipe to do nothing...
13
+
14
+ ```yaml
15
+ resources:
16
+ - type: nothing
17
+ ```
@@ -0,0 +1,19 @@
1
+ # package
2
+ `package` is a resource to ensure a specified package is installed
3
+ using the main package system on the target host OS (e.g. `yum`, `apt`, `homebrew`, ...).
4
+
5
+ ## Attributes
6
+ - name - package name (required, type: `String`, e.g. `"nginx"`)
7
+ - options - additional command lien options (type: `String`, e.g. `"--HEAD"`)
8
+ - version - package version (type: `String`, some package systems don't support this)
9
+
10
+ ## Example
11
+ This is an example recipe to install `mysql` and `nginx`.
12
+
13
+ ```yaml
14
+ resources:
15
+ - type: package
16
+ name: mysql
17
+ - type: package
18
+ name: nginx
19
+ ```
@@ -0,0 +1,20 @@
1
+ # recipe
2
+ `recipe` is a resource to include other resources in a specified recipe.
3
+ You can use any recipe format the same way as normal recipe,
4
+ and of course variables are available in included recipes.
5
+ `serverkit inspect` action, that shows fully-expanded resources,
6
+ might help you because nested recipes tend to become complex.
7
+
8
+ ## Attributes
9
+ - path - path to an included recipe (required, type: `String`)
10
+
11
+ ## Example
12
+ This is an example recipe to bundle other recipes
13
+
14
+ ```yaml
15
+ resources:
16
+ - type: recipe
17
+ path: homebrew.json.erb
18
+ - type: recipe
19
+ path: dotfiles.yml
20
+ ```
@@ -0,0 +1,22 @@
1
+ # remote_file
2
+ `remote_file` is a resource to transfer a file from a client machine to a remote machine.
3
+
4
+ ## Attributes
5
+ - destination - file path on remote machine (required, type: `String`)
6
+ - group - file group (type: `String`)
7
+ - mode - file mode (type: `Integer`)
8
+ - owner - file owner (type: `String`)
9
+ - source - file path on client machine (required, type: `String`)
10
+
11
+ ## Example
12
+ This recipe ensures a file exists at `/home/foo/.ssh/authorized_keys` on a remote host
13
+ with same content with `files/authorized_keys` on a client side.
14
+
15
+ ```yaml
16
+ resources:
17
+ - type: remote_file
18
+ destination: /home/foo/.ssh/authorized_keys
19
+ source: files/authorized_keys
20
+ mode: 600
21
+ owner: foo
22
+ ```
@@ -0,0 +1,15 @@
1
+ # service
2
+ `service` is a resource to manage services on remote hosts
3
+ by OS specific init systems (e.g. BSD init, systemd, upstart, ...).
4
+
5
+ ## Attributes
6
+ - name - service name (required, type: `String`)
7
+
8
+ ## Example
9
+ This is an example recipe to ensure `nginx` is running.
10
+
11
+ ```yaml
12
+ resources:
13
+ - type: service
14
+ name: nginx
15
+ ```
@@ -0,0 +1,17 @@
1
+ # symlink
2
+ `symlink` is a resource to ensure a symlink exists with specified source and destination.
3
+
4
+ ## Attributes
5
+ - destination - symlink destination path on remote host (required, type: `String`)
6
+ - source - symlink source path on remote host (required, type: `String`)
7
+
8
+ ## Example
9
+ This is an example recipe to ensure a symlink in remote host
10
+ from `/Users/foo/.bashrc` to `/Users/foo/dotfiles/.bashrc`.
11
+
12
+ ```yaml
13
+ resources:
14
+ - type: symlink
15
+ destination: /Users/foo/dotfiles/.bashrc
16
+ source: /Users/foo/.bashrc
17
+ ```
@@ -0,0 +1,23 @@
1
+ # template
2
+ `template` is a resource to transfer a file from client host to remote host
3
+ with expanding ERB template with given variables.
4
+
5
+ ## Attributes
6
+ - destination - file path on remote machine (required, type: `String`)
7
+ - group - file group (type: `String`)
8
+ - mode - file mode (type: `Integer`)
9
+ - owner - file owner (type: `String`)
10
+ - source - file path on client machine (required, type: `String`)
11
+
12
+ ## Example
13
+ This recipe ensures a file exists at `/home/foo/.ssh/authorized_keys` on remote host
14
+ with same content with a expanded result of `files/authorized_keys.erb`.
15
+
16
+ ```yaml
17
+ resources:
18
+ - type: remote_file
19
+ destination: /home/foo/.ssh/authorized_keys
20
+ source: files/authorized_keys.erb
21
+ mode: 600
22
+ owner: foo
23
+ ```
@@ -0,0 +1,20 @@
1
+ # user
2
+ `user` is a resource to ensure a user exists on remote host.
3
+
4
+ ## Attributes
5
+ - gid - group gid (type: `Integer` or `String`)
6
+ - home - path to home directory (type: `String`)
7
+ - name - user name (required, type: `String`)
8
+ - password - user raw password (type: `String`, will be encrypted with SHA512)
9
+ - shell - log-in shell (type: `String`)
10
+ - system - pass `true` to make system user (`true` or `false`, default: `false`)
11
+ - uid - user uid (type: `Integer`)
12
+
13
+ ## Example
14
+ This recipe ensures a user `foo` exists on remote host.
15
+
16
+ ```yaml
17
+ resources:
18
+ - type: user
19
+ name: foo
20
+ ```
@@ -0,0 +1,34 @@
1
+ # Vagrant integration
2
+ If you want to use serverkit with [Vagrant](https://www.vagrantup.com/),
3
+ there are 2 options to do it.
4
+
5
+ ## --hosts=
6
+ One is to use pass the machine's host name via `--hosts=` option like below.
7
+ Note that `vagrant ssh-config` command outputs SSH configuration for the machine on vagrant
8
+ with `Host default`, and serverkit will use it by `--hosts=default` option.
9
+
10
+ ```
11
+ $ vagrant ssh-config >> ~/.ssh/config
12
+ $ serverkit apply recipe.yml --hosts=default
13
+ ```
14
+
15
+ ## vagrant-serverkit
16
+ There is a 3rd party vagrant plugin called
17
+ [vagrant-serverkit](https://github.com/r7kamura/vagrant-serverkit).
18
+ It helps you provision your vagrant box with using serverkit.
19
+
20
+ ```rb
21
+ # Vagrantfile
22
+ Vagrant.configure("2") do |config|
23
+ config.vm.box = "ubuntu/trusty64"
24
+ config.vm.provision(
25
+ :serverkit,
26
+ recipe_path: "recipe.yml",
27
+ )
28
+ end
29
+ ```
30
+
31
+ ```
32
+ $ vagrant plugin install vagrant-serverkit
33
+ $ vagrant up
34
+ ```
data/example/recipe.yml CHANGED
@@ -18,4 +18,3 @@ resources:
18
18
  line: "%wheel ALL=(ALL) ALL"
19
19
  insert_before: "^#includedir"
20
20
  validation_script: visudo -cf %{path}
21
- state: absent
Binary file
Binary file
data/images/server.png ADDED
Binary file
@@ -4,7 +4,6 @@ module Serverkit
4
4
  module Actions
5
5
  class Validate < Base
6
6
  def run
7
- puts "Success"
8
7
  end
9
8
  end
10
9
  end
@@ -8,8 +8,13 @@ require "serverkit/errors/missing_recipe_path_argument_error"
8
8
  require "serverkit/errors/unknown_action_name_error"
9
9
 
10
10
  module Serverkit
11
- # Command clsas takes care of command line interface.
12
- # It builds and runs an Action object from given command line arguements.
11
+ # This class is responsible for command line interface.
12
+ # An instance of this class builds an instance of Actions::Base class,
13
+ # then calls its `#call` method, and it exits with exit status 0 unless any error found.
14
+ # This class should be used only from bin/serverkit executable.
15
+ # If you need to use serverkit's any feature from Ruby code,
16
+ # use a child of Actions::Base class instead because
17
+ # this class only focuses on command line interface.
13
18
  class Command
14
19
  LOG_LEVELS_TABLE = {
15
20
  "" => Logger::INFO,
@@ -167,7 +167,7 @@ module Serverkit
167
167
  run_command("mktemp -u 2>/dev/null || mktemp -u -t tmp").stdout.rstrip
168
168
  end
169
169
 
170
- # @note "metadata" meens a set of group, mode, and owner
170
+ # @note "metadata" means a set of group, mode, and owner
171
171
  # @param [String] destination
172
172
  # @param [String] source
173
173
  def move_remote_file_keeping_destination_metadata(source, destination)
@@ -7,7 +7,7 @@ module Serverkit
7
7
 
8
8
  attribute :path, required: true, type: String
9
9
  attribute :repository, required: true, type: String
10
- attribute :state, default: DEFAULT_STATE, type: String
10
+ attribute :state, default: DEFAULT_STATE, inclusion: %w[cloned updated], type: String
11
11
 
12
12
  # @note Override
13
13
  def apply
@@ -3,8 +3,8 @@ require "serverkit/resources/base"
3
3
  module Serverkit
4
4
  module Resources
5
5
  class Group < Base
6
- attribute :name, required: true, type: String
7
6
  attribute :gid, type: Integer
7
+ attribute :name, required: true, type: String
8
8
 
9
9
  # @note Override
10
10
  def apply
@@ -44,14 +44,14 @@ module Serverkit
44
44
  def applied_remote_file_content
45
45
  case
46
46
  when absent?
47
- content.delete(line).to_s
47
+ content.delete(line)
48
48
  when insert_after
49
- content.insert_after(Regexp.new(insert_after), line).to_s
49
+ content.insert_after(Regexp.new(insert_after), line)
50
50
  when insert_before
51
- content.insert_before(Regexp.new(insert_before), line).to_s
51
+ content.insert_before(Regexp.new(insert_before), line)
52
52
  else
53
- content.append(line).to_s
54
- end
53
+ content.append(line)
54
+ end.to_s
55
55
  end
56
56
 
57
57
  # @return [Serverkit::Resources::Line::Content]
@@ -60,8 +60,11 @@ module Serverkit
60
60
  )
61
61
  end
62
62
 
63
+ # @return [String, nil]
63
64
  def encrypted_password
64
- @encrypted_password ||= UnixCrypt::SHA512.build(password)
65
+ unless password.nil?
66
+ @encrypted_password ||= UnixCrypt::SHA512.build(password)
67
+ end
65
68
  end
66
69
 
67
70
  def get_remote_encrypted_password
@@ -1,3 +1,3 @@
1
1
  module Serverkit
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
data/serverkit.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.version = Serverkit::VERSION
8
8
  spec.authors = ["Ryo Nakamura"]
9
9
  spec.email = ["r7kamura@gmail.com"]
10
- spec.summary = "Configuration management toolkit for IT automation."
10
+ spec.summary = "Assemble servers from your recipe."
11
11
  spec.homepage = "https://github.com/r7kamura/serverkit"
12
12
  spec.license = "MIT"
13
13
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serverkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-23 00:00:00.000000000 Z
11
+ date: 2015-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -211,9 +211,35 @@ files:
211
211
  - Rakefile
212
212
  - Vagrantfile
213
213
  - bin/serverkit
214
+ - doc/action_apply.md
215
+ - doc/action_check.md
216
+ - doc/action_inspect.md
217
+ - doc/action_validate.md
218
+ - doc/install.md
219
+ - doc/plug_in.md
220
+ - doc/recipe.md
221
+ - doc/resource.md
222
+ - doc/resource_command.md
223
+ - doc/resource_directory.md
224
+ - doc/resource_file.md
225
+ - doc/resource_git.md
226
+ - doc/resource_group.md
227
+ - doc/resource_line.md
228
+ - doc/resource_nothing.md
229
+ - doc/resource_package.md
230
+ - doc/resource_recipe.md
231
+ - doc/resource_remote_file.md
232
+ - doc/resource_service.md
233
+ - doc/resource_symlink.md
234
+ - doc/resource_template.md
235
+ - doc/resource_user.md
236
+ - doc/vagrant_integration.md
214
237
  - example/recipe.yml
215
238
  - example/template.erb
216
239
  - example/variables.yml
240
+ - images/server-colored.png
241
+ - images/server-small.png
242
+ - images/server.png
217
243
  - lib/readable_validator.rb
218
244
  - lib/regexp_validator.rb
219
245
  - lib/required_validator.rb
@@ -288,6 +314,6 @@ rubyforge_project:
288
314
  rubygems_version: 2.4.5
289
315
  signing_key:
290
316
  specification_version: 4
291
- summary: Configuration management toolkit for IT automation.
317
+ summary: Assemble servers from your recipe.
292
318
  test_files: []
293
319
  has_rdoc: