Skip to content
Rna is a ruby gem that provides simple DSL for generating node.json files required by chef-solo.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
bin
config
lib
spec
.gitignore
.rspec
.ruby-version
.travis.yml
CHANGELOG
Gemfile
Guardfile
LICENSE
README.md
Rakefile
rna.gemspec

README.md

Rna gem

ReadmeCI Build History

Rna is a ruby gem that provides simple DSL for generating node.json files required by chef-solo.

Requirements

$ gem install rna

Usage

$ mkdir rna
$ cd rna
$ rna init

This will create starter config/rna.rb and config/s3.yml files.

Example:

config/rna.rb file

# This is starter example rna template.
# This is meant be be modified to your needs.
default_includes 'base'
# Pre processing rules that run at the beginning
before do
  if role != 'base'
    node[:application] = nil
    node[:deploy_code] = false
    node[:framework_env] = 'production'
    node[:repository] = nil
  end

  node[:before] = 1
  node[:chef_branch] = 'prod' if role =~ /^prod/
  node[:chef_branch] = 'master' if role =~ /^stag/
end

settings[:sendgrid][:relayhost] = "smtp.sendgrid.net"

# Roles
role 'base' do
  role_list ['base']
end

# api
role 'prod-api-redis', 'stag-api-redis' do
  run_list ['base','api_redis']
end
role 'prod-api-app', 'stag-api-app' do
  run_list ['base','api_app']
  node[:application] = 'api'
  node[:deploy_code] = true
  node[:database][:adapter] = "mysql"
  node[:database][:host] = "127.0.0.1"
  node[:database][:user] = "user"
  node[:database][:pass] = "pass"
  node[:repository] = 'git@github.com:owner/repo.git/api.git'
end
role 'prod-api-resque', 'stag-api-resque' do
  includes 'prod-api-app'
  run_list ['base','api_resque']
  node[:workers] = 8
end


# Post processing rules that run at the end
after do
  node[:after] = 2
  node[:framework_env] = 'production' if role =~ /^prod/
  node[:framework_env] = 'staging' if role =~ /^stag/

  list = role.split('-')
  if list.size == 3
    env, repo, role = list
    role_list ['base', "#{repo}_#{role}"]
    node[:application] = repo
  end
end

Shared Settings

You might want a shared settings hash that you can use in only some of your roles.

settings[:foo][:bar] = 1
settings[:foo][:baz] = 2

You can use this any where in your roles.

role 'role1' do
  node[:foo][:bar] = settings[:foo][:bar]
end

role 'role2' do
  node[:foo][:bar] = settings[:foo][:bar]
end

role 'role3' do
  node[:foo][:baz] = settings[:foo][:baz]
end

Breaking up config/rna.rb

If you have a lot of roles, the config/rna.rb file can get unwieldy long. You can break up the rna.rb file and put role defintions in the config/rna directory. Any file in this directory will be automatically loaded.

An example is in the spec/project folder:

  • config/rna/api.rb
  • config/rna/blog.rb

Generating the json files

$ rna generate

Here is the example of the output looks like:

base.json:

{
  "before": 1,
  "role": "base",
  "run_list": [
    "role[base]"
  ],
  "after": 2
}

prod-api-app.json:

{
  "before": 1,
  "role": "prod-api-app",
  "run_list": [
    "role[base]",
    "role[api_app]"
  ],
  "application": "api",
  "deploy_code": true,
  "database": {
    "adapter": "mysql",
    "host": "127.0.0.1",
    "user": "user",
    "pass": "pass"
  },
  "repository": "git@github.com:owner/repo.git/api.git",
  "after": 2,
  "framework_env": "production"
}

prod-api-redis.json:

{
  "before": 1,
  "role": "prod-api-redis",
  "run_list": [
    "role[base]",
    "role[api_redis]"
  ],
  "after": 2,
  "framework_env": "production",
  "application": "api"
}

prod-api-resque.json:

{
  "before": 1,
  "role": "prod-api-resque",
  "run_list": [
    "role[base]",
    "role[api_resque]"
  ],
  "application": "api",
  "deploy_code": true,
  "database": {
    "adapter": "mysql",
    "host": "127.0.0.1",
    "user": "user",
    "pass": "pass"
  },
  "repository": "git@github.com:owner/repo.git/api.git",
  "workers": 8,
  "after": 2,
  "framework_env": "production"
}

stag-api-app.json:

{
  "before": 1,
  "role": "stag-api-app",
  "run_list": [
    "role[base]",
    "role[api_app]"
  ],
  "application": "api",
  "deploy_code": true,
  "database": {
    "adapter": "mysql",
    "host": "127.0.0.1",
    "user": "user",
    "pass": "pass"
  },
  "repository": "git@github.com:owner/repo.git/api.git",
  "after": 2,
  "framework_env": "staging"
}

stag-api-redis.json:

{
  "before": 1,
  "role": "stag-api-redis",
  "run_list": [
    "role[base]",
    "role[api_redis]"
  ],
  "after": 2,
  "framework_env": "staging",
  "application": "api"
}

stag-api-resque.json:

{
  "before": 1,
  "role": "stag-api-resque",
  "run_list": [
    "role[base]",
    "role[api_resque]"
  ],
  "application": "api",
  "deploy_code": true,
  "database": {
    "adapter": "mysql",
    "host": "127.0.0.1",
    "user": "user",
    "pass": "pass"
  },
  "repository": "git@github.com:owner/repo.git/api.git",
  "workers": 8,
  "after": 2,
  "framework_env": "staging"
}

Uploading to S3

$ rna build -o s3 # saves s3 based on config/s3.yml settings

The config/s3.yml should look like this:

access_key_id: hocuspocus
secret_access_key: opensesame
bucket: my-bucket
folder: chef/rna
You can’t perform that action at this time.