opskeleton 0.9.2 → 0.9.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 706f4bed888cfc1b329c1ef8c0511e93149b3520
4
- data.tar.gz: 0eec567ed879cdd11c1985bd1e9e480b75acf1b3
3
+ metadata.gz: db0cc5b42bae8a325f0dc39601081e56e4ffe78d
4
+ data.tar.gz: acd80a01463506ae34c11de387f612701d42b68b
5
5
  SHA512:
6
- metadata.gz: d6411095566b1a54b99b0553ea104134e3f86beb69fde48d6c210e3eca2e74ad080ebbb33e9c26f1f290306a47d5e54e9bff41a67d4deeddaf573092995d77f7
7
- data.tar.gz: dea45fface16bd4c48c8c73bd901e3f8a9c5ebcd7e5c09d9814ff0200f9f21fb766f2d9b97847a1046d9dc6c24b5902738e81727d4a35add4e74b3abe663e35c
6
+ metadata.gz: b6e1fcb1c227fc69cc80522195605ec8e1f8f8a44ee51aba55bb29a81c974b6be69fa6357d67cd935564819fff58b05c28ec7365d4600b6d42fae90f9ad7105c
7
+ data.tar.gz: 0061f5575d2a0862f287d61a0072068ba2eb0b54a41f9cfec838f97e82fc5853f4ef6e7980253b264cd9f043f2e0fdfeb24285b38f219ff4864b97f57aec179e
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  pkg
2
2
  foo-sandbox
3
+ dist
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- opskeleton (0.8.12)
4
+ opskeleton (0.9.3)
5
5
  aws-sdk (~> 2)
6
6
  bintray_deploy
7
7
  git
@@ -21,6 +21,7 @@ GEM
21
21
  minitest (~> 5.1)
22
22
  thread_safe (~> 0.3, >= 0.3.4)
23
23
  tzinfo (~> 1.1)
24
+ asciidoctor (1.5.2)
24
25
  aws-sdk (2.1.3)
25
26
  aws-sdk-resources (= 2.1.3)
26
27
  aws-sdk-core (2.1.3)
@@ -77,7 +78,24 @@ GEM
77
78
  ffi (1.9.10)
78
79
  ffi-yajl (2.2.0)
79
80
  libyajl2 (~> 1.2)
81
+ formatador (0.2.5)
80
82
  git (1.2.9.1)
83
+ guard (2.12.8)
84
+ formatador (>= 0.2.4)
85
+ listen (>= 2.7, <= 4.0)
86
+ lumberjack (~> 1.0)
87
+ nenv (~> 0.1)
88
+ notiffany (~> 0.0)
89
+ pry (>= 0.9.12)
90
+ shellany (~> 0.0)
91
+ thor (>= 0.18.1)
92
+ guard-compat (1.2.1)
93
+ guard-minitest (2.4.4)
94
+ guard-compat (~> 1.2)
95
+ minitest (>= 3.0)
96
+ guard-shell (0.7.1)
97
+ guard (>= 2.0.0)
98
+ guard-compat (~> 1.0)
81
99
  hashie (2.1.2)
82
100
  her (0.7.6)
83
101
  activemodel (>= 3.0.0, <= 4.3.0)
@@ -102,6 +120,10 @@ GEM
102
120
  librarianp (0.6.3)
103
121
  thor (~> 0.15)
104
122
  libyajl2 (1.2.0)
123
+ listen (3.0.2)
124
+ rb-fsevent (>= 0.9.3)
125
+ rb-inotify (>= 0.9)
126
+ lumberjack (1.0.9)
105
127
  metaclass (0.0.4)
106
128
  method_source (0.8.2)
107
129
  mime-types (2.6.1)
@@ -116,6 +138,7 @@ GEM
116
138
  metaclass (~> 0.0.1)
117
139
  multi_json (1.11.2)
118
140
  multipart-post (2.0.0)
141
+ nenv (0.2.0)
119
142
  net-scp (1.2.1)
120
143
  net-ssh (>= 2.6.5)
121
144
  net-ssh (2.9.2)
@@ -126,6 +149,9 @@ GEM
126
149
  net-ssh-gateway (>= 1.2.0)
127
150
  net-telnet (0.1.1)
128
151
  netrc (0.10.3)
152
+ notiffany (0.0.6)
153
+ nenv (~> 0.1)
154
+ shellany (~> 0.0)
129
155
  ohai (8.5.0)
130
156
  ffi (~> 1.9)
131
157
  ffi-yajl (~> 2.2)
@@ -139,6 +165,7 @@ GEM
139
165
  systemu (~> 2.6.4)
140
166
  wmi-lite (~> 1.0)
141
167
  plist (3.1.0)
168
+ posix-spawn (0.3.11)
142
169
  pry (0.10.1)
143
170
  coderay (~> 1.1.0)
144
171
  method_source (~> 0.8.1)
@@ -158,8 +185,14 @@ GEM
158
185
  puppet-syntax
159
186
  rake
160
187
  rspec-puppet
188
+ pygments.rb (0.6.3)
189
+ posix-spawn (~> 0.3.6)
190
+ yajl-ruby (~> 1.2.0)
161
191
  rack (1.6.4)
162
192
  rake (10.4.2)
193
+ rb-fsevent (0.9.5)
194
+ rb-inotify (0.9.5)
195
+ ffi (>= 0.5.0)
163
196
  rest-client (1.8.0)
164
197
  http-cookie (>= 1.0.2, < 2.0)
165
198
  mime-types (>= 1.16, < 3.0)
@@ -192,10 +225,11 @@ GEM
192
225
  rspec-its
193
226
  specinfra (~> 2.35)
194
227
  sfl (2.2)
228
+ shellany (0.0.1)
195
229
  slop (3.6.0)
196
- specinfra (2.37.0)
230
+ specinfra (2.37.1)
197
231
  net-scp
198
- net-ssh
232
+ net-ssh (~> 2.7)
199
233
  net-telnet
200
234
  sfl
201
235
  syslog-logger (1.6.8)
@@ -209,18 +243,21 @@ GEM
209
243
  unf_ext (0.0.7.1)
210
244
  uuidtools (2.1.5)
211
245
  wmi-lite (1.0.0)
246
+ yajl-ruby (1.2.1)
212
247
 
213
248
  PLATFORMS
214
249
  ruby
215
250
 
216
251
  DEPENDENCIES
252
+ asciidoctor
217
253
  chef
254
+ guard
255
+ guard-minitest
256
+ guard-shell
218
257
  librarian-puppet (= 2.1.0)
219
258
  opskeleton!
220
259
  pry
221
260
  puppet (= 3.7.5)
222
261
  puppetlabs_spec_helper (>= 0.1.0)
262
+ pygments.rb
223
263
  rspec-puppet
224
-
225
- BUNDLED WITH
226
- 1.10.5
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+
2
+ guard :shell do
3
+ watch %r{^docs/.*adoc} do |m|
4
+ `rake asciidoc:create`
5
+ end
6
+ end
7
+
8
+ guard :minitest do
9
+ watch(%r{^test/(.*)\/?test_(.*)\.rb$}){'test'}
10
+ watch(%r{^lib/(.*/)?([^/]+)\.rb$}){'test'}
11
+ watch(%r{^test/test_helper\.rb$}){'test'}
12
+ end
data/README.md CHANGED
@@ -2,59 +2,19 @@
2
2
 
3
3
  # Intro
4
4
 
5
- Opskelaton is an opinionated bootstrap tool for local Sandbox projects.
6
-
7
- Opskeleton aims to solve the following common issues:
8
- * Developing Puppet/Chef modules/cookbooks on master machines which results with 'It works on my master/server' approach.
9
- * Large monolithic Puppet/Chef code bases, code isn't modular or reusable.
10
- * Implicit/Missing dependencies, like ruby version used, operating system, gems, third party modules/cookbooks.
11
- * Manual steps in setting up modules/cookbooks and local sandboxes (like installing third party code).
12
- * Non standard layout, projects missing README and LICENSE files, no clear separation between developed and dependant code.
13
- * No clear development guidelines, for example extracting general modules and exporting them, no deployment packaging or general testing guide.
14
- * No continues build, linting and testing, provisioning code is second class citizen.
5
+ Opskelaton is an opinionated bootstrap tool for local Sandbox projects, it aims to solve the following common issues:
6
+
7
+ * Developing Puppet/Chef modules/cookbooks on master machines which results with 'It works on my master/server' approach.
8
+ * Large monolithic Puppet/Chef code bases, code isn't modular or reusable.
9
+ * Implicit/Missing dependencies including: Ruby version, OS, gems, modules/cookbooks.
10
+ * Manual steps in setting up and maintaining such projects.
11
+ * Non standard layout, projects missing README and LICENSE files, no clear separation between developed and dependant code.
12
+ * Lacking development guidelines (for example extracting general modules and exporting them).
13
+ * No continues build, linting and testing, provisioning code is second class citizen.
15
14
 
16
15
  Opskeleton comes to solve these issues by introducing a decentralized development work flow with pre-defined layout, packaging and dependency management.
17
16
 
18
- [![Build Status](https://travis-ci.org/opskeleton/opskeleton.png)](https://travis-ci.org/opskeleton/opskeleton)
19
-
20
-
21
- # Usage
22
-
23
- ## Installation
24
-
25
- Perquisites (on Ubuntu):
26
-
27
- * Vagrant 1.7.x
28
- * RVM
29
- * Ruby 2.1.x
30
-
31
- ```bash
32
- $ rvm use system
33
- $ sudo gem install opskeleton
34
- ```
35
-
36
- Now Follow either [Chef](docs/chef.md) or [Puppet](docs/puppet.md).
37
-
38
- # Boxes
39
- Opskeleton recommends the use of [box-cutter](https://github.com/box-cutter) in order to create Vagrant boxes in a consistent manner (as no free hosting solution currently exist):
40
- ```bash
41
- # make sure to have latest packer
42
- $ packer version
43
- Packer v0.6.0
44
- $ git clone git@github.com:box-cutter/ubuntu-vm.git
45
- $ cd ubuntu-vm
46
- # Edit Makefile.local
47
- $ cat Makefile.local
48
- # Makefile.local
49
- CM := puppet
50
- CM_VERSION := 3.6.1
51
- $ make virtualbox/ubuntu1404
52
- ```
53
- A useful convention for Box names:
54
-
55
- ```bash
56
- ubuntu-14.04_puppet-3.6.1 ([os]-[version]_[provisioner]-[version])
57
- ```
17
+ For [Usage](http://opskeleton.github.io/opskeleton/latest/) and more info please follow the [docs](http://opskeleton.github.io/opskeleton/latest/).
58
18
 
59
19
  # Copyright and license
60
20
 
data/Rakefile CHANGED
@@ -6,3 +6,23 @@ Rake::TestTask.new do |t|
6
6
  t.pattern = "test/*_test.rb"
7
7
  t.verbose = true
8
8
  end
9
+
10
+ namespace :asciidoc do
11
+
12
+ desc 'create asciidoc'
13
+ task :create do
14
+ sh 'asciidoctor -a docinfo -a stylesheet! -o dist/latest/index.html docs/doc.adoc'
15
+ end
16
+
17
+ desc 'publish ascciidoc to gh-pages'
18
+ task :publish => [:create] do
19
+ sh 'ghp-import -m "Generate documentation" -b gh-pages dist/'
20
+ sh 'git push origin gh-pages'
21
+ end
22
+
23
+ desc 'clear asciidoc'
24
+ task :clear do
25
+ rm_rf 'dist'
26
+ end
27
+ end
28
+
data/bin/opsk CHANGED
@@ -21,6 +21,7 @@ module Opsk
21
21
  register Opsk::Package, 'package', 'package', 'packages current module for celestial'
22
22
  register Opsk::Dockerize, 'dockerize', 'dockerize [from] [os_type]', 'Creates a docker image from the current sandbox'
23
23
  register Opsk::Commit, 'commit', 'commit [message]', 'commit each changed puppet module under modules folder'
24
+ register Opsk::Uncommited, 'uncommited', 'uncommited', 'list uncommited modules changes'
24
25
  register Opsk::Push, 'push', 'push', 'push each changed puppet module under modules folder'
25
26
  register Opsk::Clean, 'clean', 'clean', 'cleans up packaging products'
26
27
  register Opsk::Bump, 'bump', 'bump', 'bumps up version (clearing old version also)'
@@ -0,0 +1,2 @@
1
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Liberation+Mono:400|Roboto+Slab:400,700"/>
2
+ <link rel="stylesheet" href="https://www.niwi.nz/_assets/asciidoctor-styles/simple-red-titles/stylesheet.css"/>
data/docs/doc.adoc ADDED
@@ -0,0 +1,434 @@
1
+ = Opskeleton
2
+ Ronen Narkis, <narkisr@gmail.com>
3
+ v0.9.2
4
+ :toc: left
5
+ :!numbered:
6
+ :idseparator: -
7
+ :idprefix:
8
+ :source-highlighter: pygments
9
+ :pygments-style: friendly
10
+ :sectlinks:
11
+
12
+ == Introduction
13
+
14
+ Opskelaton is an opinionated bootstrap tool for local Sandbox projects, it aims to solve the following common issues:
15
+
16
+ * Developing Puppet/Chef modules/cookbooks on master machines which results with 'It works on my master/server' approach.
17
+ * Large monolithic Puppet/Chef code bases, code isn't modular or reusable.
18
+ * Implicit/Missing dependencies including: Ruby version, OS, gems, modules/cookbooks.
19
+ * Manual steps in setting up and maintaining such projects.
20
+ * Non standard layout, projects missing README and LICENSE files, no clear separation between developed and dependant code.
21
+ * Lacking development guidelines (for example extracting general modules and exporting them).
22
+ * No continues build, linting and testing, provisioning code is second class citizen.
23
+
24
+ Opskeleton comes to solve these issues by introducing a decentralized development work flow with pre-defined layout, packaging and dependency management.
25
+
26
+ Currently Opskeleton supports Puppet and Chef, this guide is segmented to common functionality the respective separate sections for Puppet and Chef.
27
+
28
+ == Usage
29
+
30
+ === Installation
31
+
32
+ Perquisites (on Ubuntu):
33
+
34
+ * Vagrant 1.7.x
35
+ * RVM
36
+ * Ruby 2.1.x
37
+
38
+ ```bash
39
+ $ rvm use system
40
+ $ sudo gem install opskeleton
41
+ ```
42
+
43
+ === Boxes
44
+
45
+ Opskeleton recommends the use of https://github.com/box-cutter[box-cutter] in order to create Vagrant boxes in a consistent manner (as no free hosting solution currently exist):
46
+ ```bash
47
+ # make sure to have latest packer
48
+ $ packer version
49
+ Packer v0.6.0
50
+ $ git clone git@github.com:box-cutter/ubuntu-vm.git
51
+ $ cd ubuntu-vm
52
+ # Edit Makefile.local
53
+ $ cat Makefile.local
54
+ # Makefile.local
55
+ CM := puppet
56
+ CM_VERSION := 3.6.1
57
+ $ make virtualbox/ubuntu1404
58
+ ```
59
+ A useful convention for Box names:
60
+
61
+ ```bash
62
+ ubuntu-14.04_puppet-3.6.1 ([os]-[version]_[provisioner]-[version])
63
+ ```
64
+
65
+ == Puppet
66
+
67
+ === Introduction
68
+
69
+ Opskeleton supports the creation of Puppet based projects supporting dependency management (using librarian-puppet), linting and testing.
70
+
71
+
72
+ === Structure
73
+
74
+ ==== Layout
75
+
76
+ Opskeleton generates the complete folder structure for projects:
77
+
78
+ image:https://raw.githubusercontent.com/opskeleton/opskeleton/master/img/puppet-layout.png[width=30%,hight=50%]
79
+
80
+ ==== Lifecycle
81
+
82
+ Opskelaton defines a module life cycle:
83
+
84
+ 1. Internal non reusable modules (usually specific to a client site) go under static-modules
85
+ 2. If we create a general reusable module which is ready for prime time we pull out to a new git repository.
86
+ 3. The extracted module is added back as a third party (using link:https://github.com/rodjek/librarian-puppet[librarian-puppet] module which resides under modules folder.
87
+
88
+ Life cycle scheme:
89
+
90
+ image:https://raw.githubusercontent.com/opskeleton/opskeleton/master/img/puppet-cycle.png[width='40%',hight='50%']
91
+
92
+ Creating new (static) modules is easy as:
93
+
94
+ ```bash
95
+ $ opsk module foo
96
+ ```
97
+
98
+ Each generated module will contain puppet-rspec with matching Rakefile.
99
+
100
+ ==== Pushing changes
101
+
102
+ Making changes to third party modules is quite easy once librarian-puppet installed them locally (you can push only git based modules):
103
+
104
+ ```ruby
105
+ forge "https://forgeapi.puppetlabs.com"
106
+
107
+ mod 'puppetlabs/stdlib'
108
+ mod 'puppetlabs/apt'
109
+
110
+ mod 'strings/artifactory',
111
+ :git => 'git://github.com/pulling-strings/puppet-artifactory.git'
112
+
113
+ mod 'rip/module-data',
114
+ :git => 'git://github.com/ripienaar/puppet-module-data.git'
115
+ ```
116
+
117
+ Its best practice to use git protocol (read only) which makes pushing changes from multiple modules a bit tedious, Opskeleton fixes that:
118
+
119
+
120
+ We can list the changes:
121
+
122
+ ```bash
123
+ $ opsk uncommited
124
+ Listing changes for modules/artifactory:
125
+
126
+ changed files:
127
+
128
+ - metadata.json
129
+
130
+ added files:
131
+
132
+ untracked files:
133
+ ```
134
+
135
+ We can commit them (providing a commit message per module or --message for all):
136
+ ```bash
137
+ # We hacked a number of submodules, now we commit
138
+ $ opsk commit
139
+ Listing changes for modules/artifactory:
140
+
141
+ changed files:
142
+
143
+ - metadata.json
144
+
145
+ added files:
146
+
147
+ untracked files:
148
+
149
+ Commit the changes under modules/artifactory? (y/n) y
150
+ Commit message:
151
+ This is a nice change
152
+ ```
153
+
154
+
155
+ Once commits are made we can push the changes:
156
+
157
+ ```bash
158
+ $ opsk push
159
+ Push modules/artifactory? (y/n) y
160
+ pushing modules/artifactory ..
161
+ ```
162
+
163
+
164
+ === Testing
165
+
166
+ Opskelaton supports two levels of testing:
167
+
168
+ * Static module testing that includes rspec and linting.
169
+ * Integration testing using http://serverspec.org/[serverspec]and Vagrant.
170
+
171
+ ```bash
172
+ # linting all static modules
173
+ $ rake lint
174
+ # rspecing
175
+ $ rake modspec
176
+ # running serverspec
177
+ $ rake spec
178
+ ```
179
+
180
+ === Packaging
181
+ Opskelaton fully supports deployment and portable execution of sandboxes on non Vagrant environments:
182
+
183
+ ```bash
184
+ $ opsk generate_puppet foo ubuntu-13.10
185
+ $ cd foo-sandbox
186
+ # The package version file
187
+ $ cat opsk.yaml
188
+ ---
189
+ version: '0.0.1'
190
+ name: foo
191
+
192
+ # post bundle and gem install ..
193
+ $ opsk package
194
+ create pkg/foo-sandbox-0.0.1
195
+ create pkg/foo-sandbox-0.0.1/scripts
196
+ create pkg/foo-sandbox-0.0.1/scripts/lookup.rb
197
+ chmod pkg/foo-sandbox-0.0.1/scripts/lookup.rb
198
+ create pkg/foo-sandbox-0.0.1/scripts/run.sh
199
+ chmod pkg/foo-sandbox-0.0.1/scripts/run.sh
200
+ create pkg/foo-sandbox-0.0.1/manifests/site.pp
201
+ exist pkg
202
+ $ ls pkg
203
+ foo-sandbox-0.0.1 foo-sandbox-0.0.1.tar.gz
204
+ ```
205
+ The packaging process creates a portable tar file that can be run on any machine with puppet installed via the bundled run.sh:
206
+
207
+ ```bash
208
+ $ tar -xvzf foo-sandbox-0.0.1.tar.gz
209
+ $ cd foo-sandbox-0.0.1
210
+ $ sudo ./run.sh
211
+ ```
212
+
213
+ An external node classifier based runner is also available under scripts/run.sh, this runner expects to get a <hostname>.yaml input file with the required node classes.
214
+
215
+ === Updating
216
+ Keeping you box up to date with latest opsk version is easy, just re-generate it again and resolve conflicts by answering y/n:
217
+ ```bash
218
+ # Moving to latest opsk
219
+ $ gem update opskeleton
220
+ # foo box already exists
221
+ $ opsk generate foo <vagrant-box>
222
+ exist foo-sandbox
223
+ conflict foo-sandbox/Vagrantfile
224
+ Overwrite /home/ronen/code/foo-sandbox/Vagrantfile? (enter "h" for help) [Ynaqdh]
225
+ ```
226
+
227
+ === Vagrant
228
+ Opskeleton generates a Vagrant file with couple of enhancements:
229
+
230
+ * VAGRANT_BRIDGE (default eth0) for setting up public bridge on the go.
231
+ * PUPPET_ENV (default dev) for setting puppet environment.
232
+ * Puppet options preset to match modules and hiera folders.
233
+
234
+ === Docker
235
+ The only assumption that Opskelaton makes is that the target host will have Pupppet installed, this enables us to create docker images from our sandboxes quite easily:
236
+
237
+ ```bash
238
+ # creates dockerfiles/<host> and fig.yml
239
+ $ opsk dockerize
240
+ $ opsk package
241
+ # grabs the opsk tar file
242
+ $ sudo fig build
243
+ ```
244
+
245
+ === Benchmarking
246
+ Tracking the speed of our provisioning code is important for keeping a consistent level of service with the produced sandboxes, enabling benchmarking:
247
+
248
+ ```bash
249
+ $ opsk generate_puppet redis ubuntu-14.04 --bench-enable
250
+ # install imagemagic before bundle install
251
+ $ sudo apt-get install imagemagick libmagickwand-dev
252
+ $ rake serverspec:redis
253
+ # with each run more result lines will be recorded
254
+ $ cat benchmark.json
255
+ {"total":656,"host":"redis","revision":"5d03a41ade9fc3dd5296d4119ccb0b0ad8290b9e","time":"2014-12-17 02:57:45 +0200"}
256
+ # add it to git for tracking
257
+ $ git add benchmark.json
258
+ ```
259
+
260
+ Now after a number of runs we could plot and view the results of a single host or of all the hosts side by side:
261
+
262
+ ```bash
263
+ $ rake plot:hosts plot:per_hosts
264
+ # resulting png files
265
+ $ google-chrome plots
266
+ ```
267
+
268
+ == Chef
269
+
270
+ === Introduction
271
+ Opskelaton fully supports Chef based projects it offers similar features to the Puppet based sandboxes with additional support for roles, environments and cookbooks.
272
+
273
+ Creating out first sandbox
274
+
275
+ ```bash
276
+ $ opsk generate_chef redis ubuntu-14.04
277
+ $ cd redis-sandbox
278
+ ```
279
+
280
+ === Structure
281
+
282
+ ==== layout
283
+ Opskelaton creates the complete folder structure fine tuned to match best practices:
284
+
285
+ Folder layout:
286
+
287
+ image:https://raw.githubusercontent.com/opskeleton/opskeleton/master/img/chef-layout.png[width='30%',hight='50%']
288
+
289
+ ==== lifecycle
290
+
291
+ Opskelaton defines a simple cookbook life cycle:
292
+
293
+ 1. Internal non reusable cookbooks (usually specific to a client site) go under static-cookbooks
294
+ 2. If we create a general reusable cookbook which is ready for prime time we pull out to a new git repository.
295
+ 3. The extracted cookbook is added back as a third party (using [librarian-chef](https://github.com/applicationsonline/librarian-chef) thatd will place them under cookbooks folder).
296
+
297
+ Life cycle scheme:
298
+
299
+ image:https://raw.githubusercontent.com/opskeleton/opskeleton/master/img/chef-cycle.png[width='40%',hight='50%']
300
+
301
+ Creating new cookbooks is easy as:
302
+
303
+ ```bash
304
+ $ opsk cookbook foo
305
+ ```
306
+
307
+ === Testing
308
+
309
+ Opskelaton supports testing/linting:
310
+
311
+ * Static cookbook testing that includes rspec and food-critic. (TBD)
312
+ * Integration testing using [serverspec](http://serverspec.org/) and Vagrant.
313
+
314
+ ```bash
315
+ # running serverspec
316
+ $ rake spec
317
+ ```
318
+
319
+ === Packaging
320
+ Opskelaton fully supports deployment and portable execution of sandboxes on non Vagrant environments:
321
+
322
+ ```bash
323
+ $ opsk generate_chef foo ubuntu-14.04.
324
+ $ cd foo-sandbox
325
+ # The package version file
326
+ $ cat opsk.yaml
327
+
328
+ ---
329
+ version: '0.0.1'
330
+ name: redis
331
+ includes:
332
+ - Cheffile
333
+ - cookbooks
334
+ - static-cookbooks
335
+ - dna.json
336
+ - environments
337
+ - Gemfile
338
+ - Gemfile.lock
339
+ - opsk.yaml
340
+ - roles
341
+ - LICENSE-2.0.txt
342
+ - run.sh
343
+ - boot.sh
344
+ - solo.rb
345
+
346
+ # post bundle and gem install ..
347
+ $ opsk package
348
+ create pkg/foo-sandbox-0.0.1
349
+ create pkg/foo-sandbox-0.0.1/scripts
350
+ create pkg/foo-sandbox-0.0.1/scripts/lookup.rb
351
+ chmod pkg/foo-sandbox-0.0.1/scripts/lookup.rb
352
+ create pkg/foo-sandbox-0.0.1/scripts/run.sh
353
+ chmod pkg/foo-sandbox-0.0.1/scripts/run.sh
354
+ exist pkg
355
+ $ ls pkg
356
+ foo-sandbox-0.0.1 foo-sandbox-0.0.1.tar.gz
357
+ ```
358
+ The packaging process creates a portable tar file that can be run on any machine with chef-solo installed via the bundled run.sh:
359
+
360
+ ```bash
361
+ $ tar -xvzf foo-sandbox-0.0.1.tar.gz
362
+ $ cd foo-sandbox-0.0.1
363
+ # expects to get the chef environment
364
+ $ sudo ./run.sh dev
365
+ ```
366
+
367
+ === Updating
368
+
369
+ Keeping you box up to date with latest opsk version is easy, just re-generate it again and resolve conflicts by answering y/n:
370
+ ```bash
371
+ # Moving to latest opsk
372
+ $ gem update opskeleton
373
+ # foo box already exists
374
+ $ opsk generate_chef foo <vagrant-box>
375
+ exist foo-sandbox
376
+ conflict foo-sandbox/Vagrantfile
377
+ Overwrite /home/ronen/code/foo-sandbox/Vagrantfile? (enter "h" for help) [Ynaqdh]
378
+ ```
379
+
380
+ === Vagrant
381
+ Opskeleton generates a Vagrant file with couple of enhancements:
382
+
383
+ * CHEF_ENV (default dev) for setting chef environment.
384
+ * Default role (sandbox name) created under roles/{type}.rb
385
+ * static-cookbooks/cookbooks roles/environments folders are set.
386
+
387
+ == Deployment
388
+
389
+ The packaged tar files can be consumed using any tool and protocol (http, s3 etc), opsk has built in support for deploying public sandboxes into:
390
+
391
+ * Bintray (make sure to https://github.com/narkisr/bintray-deploy#usage[configure] the bintray API key):
392
+
393
+ ```bash
394
+ $ opsk package
395
+ $ opsk deploy_bintray <bintray-repo>
396
+ deployed foo-sandbox-0.0.1.tar.gz to http://dl.bintray.com/narkisr/<bintray-repo>/foo-sandbox-0.0.1.tar.gz
397
+ ```
398
+
399
+ * S3 (Make sure to configure s3 section under ~/.configuration.rb):
400
+
401
+ ```bash
402
+ $ opsk package
403
+ $ opsk deploy_s3 <bucket> <path>
404
+ deployed foo-sandbox-0.0.1.tar.gz to opsk-boxes/foo/foo-sandbox-0.0.1.tar.gz
405
+ ```
406
+
407
+ ```ruby
408
+ Configuration.for('s3') {
409
+ access_key ''
410
+ secret_key ''
411
+ region ''
412
+ }
413
+ ```
414
+
415
+ * Scp (Make sure to configure scp section under ~/.configuration.rb):
416
+
417
+ ```bash
418
+ $ opsk package
419
+ $ opsk deploy_scp bar
420
+ deployed foo-sandbox-0.0.1.tar.gz to foo@opsk-boxes:/var/boxes
421
+ ```
422
+
423
+ ```ruby
424
+ Configuration.for('scp') {
425
+ bar {
426
+ host 'opsk-boxes'
427
+ user 'foo'
428
+ dest '/var/boxes'
429
+ # optional
430
+ port 2222
431
+ }
432
+ }
433
+ ```
434
+
@@ -1,14 +1,42 @@
1
1
 
2
- def report(g)
3
- %i(changed added untracked).each do |state|
4
- say "#{state} files:\n\n"
5
- g.status.send(state).each do |k,v|
6
- say "- #{k}"
2
+
3
+ module Opsk
4
+ class CommitGit
5
+ def initialize(d,options,thor)
6
+ @g = Git.init(d)
7
+ @options = options
8
+ @thor = thor
9
+ end
10
+
11
+ def changed?
12
+ @g.status.changed.keys.length > 0
13
+ end
14
+
15
+ def report
16
+ %i(changed added untracked).each do |state|
17
+ @thor.say "#{state} files:\n\n"
18
+ @g.status.send(state).each do |k,v|
19
+ @thor.say "- #{k}"
20
+ end
21
+ @thor.say "\n"
22
+ end
23
+ end
24
+
25
+ def master_commit(d)
26
+ resp = @thor.yes? "Commit the changes under #{d}? (y/n)" unless @options['all']
27
+ if(@options['all'] or resp)
28
+ @g.checkout('master')
29
+ if @options['message']
30
+ @g.commit_all(@options['message'])
31
+ else
32
+ @thor.say 'Commit message:'
33
+ @g.commit_all(STDIN.gets.chomp)
34
+ end
35
+ end
36
+
7
37
  end
8
38
  end
9
- end
10
39
 
11
- module Opsk
12
40
  class Commit < Thor::Group
13
41
  include Thorable, Thor::Actions
14
42
 
@@ -23,25 +51,19 @@ module Opsk
23
51
  def commit
24
52
  Dir["modules/*"].reject{|o| not File.directory?(o)}.each do |d|
25
53
  if File.exists?("#{d}/.git")
26
- g = Git.init(d)
27
- if g.status.changed.keys.length > 0
28
- say "Listing changes for #{d}:\n\n"
29
- report(g)
30
- resp = yes? "Commit the changes under #{d}? (y/n)" unless options['all']
31
- if(options['all'] or resp)
32
- g.checkout('master')
33
- if options['message']
34
- g.commit_all(options['message'])
35
- else
36
- say 'Commit message:'
37
- g.commit_all(STDIN.gets.chomp)
38
- end
54
+ begin
55
+ cg = Opsk::CommitGit.new(d,options,self)
56
+ if cg.changed?
57
+ say "Listing changes for #{d}:\n\n"
58
+ cg.report
59
+ cg.master_commit(d)
39
60
  end
61
+ rescue => e
62
+ say "Failed to commit #{d} due to #{e}"
40
63
  end
41
64
  end
42
65
  end
43
66
  end
44
67
 
45
-
46
68
  end
47
69
  end
@@ -32,17 +32,21 @@ module Opsk
32
32
 
33
33
  def push
34
34
  Dir["modules/*"].reject{|o| not File.directory?(o)}.each do |d|
35
- if File.exists?("#{d}/.git")
36
- g = Git.init(d)
37
- add_writable(g,options['protocol'].to_sym)
38
- if !options['dry'] and g.diff('origin').stats[:files].keys.length > 0
39
- resp = yes?("Push #{d}? (y/n)") unless options['all']
40
- if(options['all'] or resp)
41
- say "pushing #{d} .."
42
- g.push('writable')
43
- g.pull
35
+ begin
36
+ if File.exists?("#{d}/.git")
37
+ g = Git.init(d)
38
+ add_writable(g,options['protocol'].to_sym)
39
+ if !options['dry'] and g.diff('origin').stats[:files].keys.length > 0
40
+ resp = yes?("Push #{d}? (y/n)") unless options['all']
41
+ if(options['all'] or resp)
42
+ say "pushing #{d} .."
43
+ g.push('writable')
44
+ g.pull
45
+ end
44
46
  end
45
47
  end
48
+ rescue => e
49
+ say "Failed to push #{d} due to #{e}"
46
50
  end
47
51
  end
48
52
  end
@@ -0,0 +1,64 @@
1
+
2
+
3
+ module Opsk
4
+ class CommitGit
5
+ def initialize(d,options,thor)
6
+ @g = Git.init(d)
7
+ @options = options
8
+ @thor = thor
9
+ end
10
+
11
+ def changed?
12
+ @g.status.changed.keys.length > 0
13
+ end
14
+
15
+ def report
16
+ %i(changed added untracked).each do |state|
17
+ @thor.say "#{state} files:\n\n"
18
+ @g.status.send(state).each do |k,v|
19
+ @thor.say "- #{k}"
20
+ end
21
+ @thor.say "\n"
22
+ end
23
+ end
24
+
25
+ def master_commit(d)
26
+ resp = @thor.yes? "Commit the changes under #{d}? (y/n)" unless @options['all']
27
+ if(@options['all'] or resp)
28
+ @g.checkout('master')
29
+ if @options['message']
30
+ @g.commit_all(@options['message'])
31
+ else
32
+ @thor.say 'Commit message:'
33
+ @g.commit_all(STDIN.gets.chomp)
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+
40
+ class Uncommited < Thor::Group
41
+ include Thorable, Thor::Actions
42
+
43
+ def validate
44
+ check_root
45
+ end
46
+
47
+
48
+ def uncommited
49
+ Dir["modules/*"].reject{|o| not File.directory?(o)}.each do |d|
50
+ if File.exists?("#{d}/.git")
51
+ begin
52
+ cg = Opsk::CommitGit.new(d,options,self)
53
+ if cg.changed?
54
+ say "Listing changes for #{d}:\n\n"
55
+ cg.report
56
+ end
57
+ rescue => e
58
+ say "Failed to check uncommited under #{d} due to #{e}"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,3 +1,3 @@
1
1
  module Opskeleton
2
- VERSION = '0.9.2'
2
+ VERSION = '0.9.3'
3
3
  end
data/lib/opskeleton.rb CHANGED
@@ -16,5 +16,6 @@ require 'opskeleton/deploy_s3'
16
16
  require 'opskeleton/deploy_scp'
17
17
  require 'opskeleton/module'
18
18
  require 'opskeleton/commit'
19
+ require 'opskeleton/uncommited'
19
20
  require 'opskeleton/push'
20
21
 
data/opskeleton.gemspec CHANGED
@@ -22,6 +22,11 @@ Gem::Specification.new do |gem|
22
22
  gem.add_development_dependency('librarian-puppet', '= 2.1.0')
23
23
  gem.add_development_dependency('puppetlabs_spec_helper', '>= 0.1.0')
24
24
  gem.add_development_dependency('pry')
25
+ gem.add_development_dependency('asciidoctor')
26
+ gem.add_development_dependency('pygments.rb')
27
+ gem.add_development_dependency('guard')
28
+ gem.add_development_dependency('guard-shell')
29
+ gem.add_development_dependency('guard-minitest')
25
30
 
26
31
  gem.files = `git ls-files`.split($/)
27
32
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opskeleton
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - narkisr
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-09 00:00:00.000000000 Z
11
+ date: 2015-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -164,6 +164,76 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: asciidoctor
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pygments.rb
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: guard
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: guard-shell
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: guard-minitest
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
167
237
  description: A generator for ops projects that include vagrant puppet and fpm
168
238
  email:
169
239
  - narkisr@gmail.com
@@ -179,6 +249,7 @@ files:
179
249
  - CHANGES.md
180
250
  - Gemfile
181
251
  - Gemfile.lock
252
+ - Guardfile
182
253
  - LICENSE-2.0.txt
183
254
  - README.md
184
255
  - Rakefile
@@ -187,6 +258,8 @@ files:
187
258
  - bin/opsk
188
259
  - docs/chef.md
189
260
  - docs/deploy.md
261
+ - docs/doc-docinfo.html
262
+ - docs/doc.adoc
190
263
  - docs/puppet.md
191
264
  - img/chef-cycle.png
192
265
  - img/chef-layout.png
@@ -206,6 +279,7 @@ files:
206
279
  - lib/opskeleton/package.rb
207
280
  - lib/opskeleton/push.rb
208
281
  - lib/opskeleton/thorable.rb
282
+ - lib/opskeleton/uncommited.rb
209
283
  - lib/opskeleton/version.rb
210
284
  - opskeleton.gemspec
211
285
  - templates/LICENSE-2.0.txt