# Intro
Opskelaton fully supports Puppet based sandboxes with the same lifecycle semantics as Chef.
# Usage
Creating out first sandbox
```bash
$ opsk generate_puppet redis ubuntu-14.04
$ cd redis-sandbox
```
## Layout
Opskelaton creates the complete folder structure fine tuned to match best practices:
Folder layout:
## Module lifecycle
Opskelaton defines a simple module life cycle:
1. Internal non reusable modules (usually specific to a client site) go under static-modules
2. If we create a general reusable module which is ready for prime time we pull out to a new git repository.
3. The extracted module is added back as a third party (using [librarian-puppet](https://github.com/rodjek/librarian-puppet) module which resides under modules folder.
Life cycle scheme:
Creating new (static) modules is easy as:
```bash
$ opsk module foo
```
Each generated module will contain puppet-rspec with matching Rakefile (see [testing](https://github.com/opskeleton/opskeleton#testing)).
## Testing
Opskelaton supports two levels of testing:
* Static module testing that includes rspec and linting.
* Integration testing using [serverspec](http://serverspec.org/) and Vagrant.
```bash
# linting all static modules
$ rake lint
# rspecing
$ rake modspec
# running serverspec
$ rake spec
```
## Packaging
Opskelaton fully supports deployment and portable execution of sandboxes on non Vagrant environments:
```bash
$ opsk generate_puppet foo ubuntu-13.10
$ cd foo-sandbox
# The package version file
$ cat opsk.yaml
---
version: '0.0.1'
name: foo
# post bundle and gem install ..
$ opsk package
create pkg/foo-sandbox-0.0.1
create pkg/foo-sandbox-0.0.1/scripts
create pkg/foo-sandbox-0.0.1/scripts/lookup.rb
chmod pkg/foo-sandbox-0.0.1/scripts/lookup.rb
create pkg/foo-sandbox-0.0.1/scripts/run.sh
chmod pkg/foo-sandbox-0.0.1/scripts/run.sh
create pkg/foo-sandbox-0.0.1/manifests/site.pp
exist pkg
$ ls pkg
foo-sandbox-0.0.1 foo-sandbox-0.0.1.tar.gz
```
The packaging process creates a portable tar file that can be run on any machine with puppet installed via the bundled run.sh:
```bash
$ tar -xvzf foo-sandbox-0.0.1.tar.gz
$ cd foo-sandbox-0.0.1
$ sudo ./run.sh
```
An external node classifier based runner is also available under scripts/run.sh, this runner expects to get a .yaml input file with the required node classes.
## Deployment
The packaged tar files can be consumed using any tool and protocol however http is recommended, opsk has built in support for deploying public sandboxes into bintray:
```bash
$ opsk package
$ opsk deploy
deployed foo-sandbox-0.0.1.tar.gz to http://dl.bintray.com/narkisr//foo-sandbox-0.0.1.tar.gz
```
Make sure to [configure](https://github.com/narkisr/bintray-deploy#usage) configure the bintray API key.
## Updating
Keeping you box up to date with latest opsk version is easy, just re-generate it again and resolve conflicts by answering y/n:
```bash
# Moving to latest opsk
$ gem update opskeleton
# foo box already exists
$ opsk generate foo
exist foo-sandbox
conflict foo-sandbox/Vagrantfile
Overwrite /home/ronen/code/foo-sandbox/Vagrantfile? (enter "h" for help) [Ynaqdh]
```
## Vagrant
Opskeleton generates a Vagrant file with couple of enhancements:
* VAGRANT_BRIDGE (default eth0) for setting up public bridge on the go.
* PUPPET_ENV (default dev) for setting puppet environment.
* Puppet options preset to match modules and hiera folders.