rig 0.3.1 → 0.3.2

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.
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rig.gemspec
4
4
  gemspec
5
+
6
+ gem 'chef', '~> 0.10.8'
7
+ gem 'net-ssh', '~> 2.1.4'
@@ -0,0 +1,14 @@
1
+
2
+ common: &common
3
+ aws_access_key_id: aws_key
4
+ aws_secret_access_key: aws_secret
5
+ compute:
6
+ <<: *common
7
+ provider: AWS
8
+ region: us-east-1
9
+ dns:
10
+ <<: *common
11
+ provider: AWS
12
+ zone: dns.zone.com
13
+ balancer:
14
+ <<: *common
@@ -0,0 +1,27 @@
1
+
2
+ rig:
3
+
4
+ # if you're using chef, set this to the knife.rb configuration file
5
+ # this will allow Rig to manage the chef nodes, environments and such.
6
+ #
7
+ #chef:
8
+ # knife: /path/to/chef/knife.rb
9
+ #
10
+ # TODO: Figure out the same thing for puppet
11
+
12
+ ssh:
13
+ # user to connect as, when ssh to server
14
+ user: root
15
+
16
+ # the account to use if one is not specified
17
+ default_account: default
18
+
19
+ # uncomment this and specify the accounts you want to support
20
+ # all others will be filtered from use.
21
+ #accounts:
22
+ # - default
23
+ # - production
24
+
25
+
26
+ # flavor_id: ami-8baa73e2 # ubuntu 11.10, non-ebs storage
27
+ # key_name: keyname
@@ -0,0 +1,16 @@
1
+ ---
2
+ :instances:
3
+ - :memcache:
4
+ :count: 1
5
+ :flavor: m1.large
6
+ :appserver:
7
+ :count: 3
8
+ :flavor: c1.large
9
+ :balance: true
10
+ :webserver:
11
+ :count: 3
12
+ :flavor: c1.large
13
+ :balance: true
14
+ :primary: true
15
+ :groups:
16
+ - default
@@ -0,0 +1,9 @@
1
+ ---
2
+ :instances:
3
+ - :solo:
4
+ :count: 1
5
+ :flavor: c1.medium
6
+ :balance: true
7
+ :primary: true
8
+ :groups:
9
+ - default
@@ -1,4 +1,3 @@
1
1
  require 'rig'
2
- require 'rig/chef' if Rig.config.chef
3
2
 
4
3
  Dir["#{File.dirname(__FILE__)}/cloud/*.rb"].each {|file| require file.gsub(/\.rb/,'')}
@@ -6,33 +6,18 @@ module Rig
6
6
  class << self
7
7
  def compute
8
8
  @compute ||= begin
9
- Fog::Compute.new(
10
- :provider => Rig.config.provider,
11
- :aws_access_key_id => Rig.config.key,
12
- :aws_secret_access_key => Rig.config.secret,
13
- :region => Rig.config.region
14
- )
9
+ Fog::Compute.new(Rig.account.compute.to_hash)
15
10
  end
16
11
  end
17
12
  def balancer
18
13
  @balancer ||= begin
19
14
  #Fog::Compute.new(
20
- Fog::AWS::ELB.new(
21
- #:provider => Rig.config.provider,
22
- :aws_access_key_id => Rig.config.key,
23
- :aws_secret_access_key => Rig.config.secret,
24
- :region => Rig.config.region
25
- )
15
+ Fog::AWS::ELB.new(Rig.account.balancer.to_hash)
26
16
  end
27
17
  end
28
18
  def dns
29
19
  @dns ||= begin
30
- Fog::DNS.new(
31
- :provider => Rig.config.provider,
32
- :aws_access_key_id => Rig.config.key,
33
- :aws_secret_access_key => Rig.config.secret
34
- #:region => Rig.config.region
35
- )
20
+ Fog::DNS.new(Rig.account.dns.to_hash)
36
21
  end
37
22
  end
38
23
  end
@@ -24,6 +24,14 @@ module Rig
24
24
  def find_by_environment(env)
25
25
  Rig::Cloud.compute.servers.all({"tag:Environment"=>env})
26
26
  end
27
+ def find_by_role_and_environment(role, env)
28
+ Rig::Cloud.compute.servers.all({"tag:Environment"=> env, "tag:Role" => role})
29
+ end
30
+
31
+ def find_by_nick(name)
32
+ (role, num, env) = name.match(/(\w+)(\d+)\.(\w+)/)[1..3]
33
+ find_by_role_and_environment(role, env).select {|s| s.tags['Name'] =~ /^#{role}#{num}/ }
34
+ end
27
35
 
28
36
  def create(opts, tags={})
29
37
  fog = Rig::Cloud.compute
@@ -9,6 +9,7 @@ require 'rig/command/abstract'
9
9
  require 'rig/command/options'
10
10
 
11
11
  require 'rig/command/main'
12
+ require 'rig/command/ssh'
12
13
 
13
14
  require 'rig/command/environment/main'
14
15
  require 'rig/command/environment/list'
@@ -27,7 +28,6 @@ require 'rig/command/dns/edit'
27
28
  require 'rig/command/dns/destroy'
28
29
 
29
30
  require 'rig/command/instance/main'
30
- require 'rig/command/instance/ssh'
31
31
  require 'rig/command/instance/list'
32
32
  require 'rig/command/instance/create'
33
33
  require 'rig/command/instance/destroy'
@@ -3,9 +3,10 @@ require 'terminal-table/import'
3
3
  module Rig
4
4
  module Command
5
5
  class Abstract < Clamp::Command
6
- option ["-n","--test"], :flag, "use Fog.mock! to test command without creating / destroying cloud resources" do |o|
6
+ option ["-n", "--test"], :flag, "use Fog.mock! to test command without creating / destroying cloud resources" do |o|
7
7
  Fog.mock!
8
8
  end
9
+ option ["-a", "--account"], "ACCOUNT", "set the rig account to use", :default => "default"
9
10
 
10
11
  def print_table(columns, rows)
11
12
  puts table(columns, *rows)
@@ -14,18 +15,19 @@ module Rig
14
15
  def instance_list(list)
15
16
  rows = []
16
17
  list.each do |server|
17
- name = server.tags['Name']
18
- env = server.tags['Environment']
19
- role = server.tags['Role']
20
- ip = server.public_ip_address.to_s
21
- flavor = server.flavor_id.to_s
22
- id = server.id.to_s
23
- state = server.state.to_s.downcase
24
-
25
- rows << [name, env, role, ip, flavor, id, state]
18
+ r = []
19
+ r << server.tags['Name']
20
+ r << server.tags['Environment']
21
+ r << server.tags['Role']
22
+ r << server.public_ip_address.to_s
23
+ r << server.private_ip_address.to_s
24
+ r << server.flavor_id.to_s
25
+ r << server.id.to_s
26
+ r << server.state.to_s.downcase
27
+ rows << r
26
28
  end
27
29
 
28
- print_table(%w{Name Environment Role PublicIP Size InstanceID State}, rows)
30
+ print_table(%w{Name Environment Role PublicIP PrivateIP Size InstanceID State}, rows)
29
31
  end
30
32
 
31
33
  def execute
@@ -1,3 +1,4 @@
1
+ require 'awesome_print'
1
2
 
2
3
  module Rig
3
4
  module Command
@@ -8,40 +9,54 @@ module Rig
8
9
  exit(0)
9
10
  end
10
11
 
11
- option %w{--init}, :flag, "initialize the ~/.rig configuration file" do |o|
12
- dir = ENV['RIG_CONFIG'] ? File.dirname(ENV['RIG_CONFIG']) : ENV['HOME']
13
-
14
- unless dir
15
- puts "directory could not be found: tried environment variables RIG_CONFIG (#{ENV['RIG_CONFIG']}) and HOME (#{ENV['HOME']}"
16
- exit(1)
12
+ subcommand "accounts", "show account list" do
13
+ def execute
14
+ list = Rig.account_list
15
+ list.each do |n, f|
16
+ puts " #{n} => #{f}"
17
+ end
17
18
  end
19
+ end
18
20
 
19
- file = "#{dir}/.rig"
20
- puts "[initializing] #{file}"
21
- data = <<-EOF
22
- rig:
23
- provider: AWS
24
- key: AKIAIWUGNGSUZWW5XVCQ
25
- secret: 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
26
- ami: ami-8baa73e2
27
- region: us-east-1
28
- keypair: inqcloud-dev
29
-
30
- dns:
31
- zone: inqlabs.com
32
-
33
- # if you're using chef, set this to the knife.rb configuration file
34
- # this will allow Rig to manage the chef nodes, environments and such.
35
- #chef:
36
- # knife: ~/work/chef/.chef/knife.rb
37
- # TODO: Figure out the same thing for puppet
38
-
39
- # eventually we should be able to put default options and such in the config file
40
-
41
- EOF
42
- #puts data
43
- File.open(file, 'w') { |f| f.write(data) }
44
- exit(0)
21
+ subcommand "init", "initialize configuration directory" do
22
+ option %w{-f --force}, :flag, "force creation of files", :default => false
23
+ option %w{-d --directory}, "DIRECTORY", "configuration directory", :default => "~/.rig"
24
+
25
+ def execute
26
+ dir = File.expand_path(ENV['RIG_CONFIG'] ? ENV['RIG_CONFIG'] : directory)
27
+ back = "#{dir}.bak.#{Time.now.to_i}"
28
+ conf = File.expand_path("../../../../conf", __FILE__)
29
+
30
+ files = ["config.yml", "accounts/default.yml", "templates/solo.yml", "templates/multi.yml"]
31
+
32
+ unless dir
33
+ puts "directory could not be found: tried environment variables RIG_CONFIG (#{ENV['RIG_CONFIG']}) and HOME (#{ENV['HOME']}"
34
+ exit(1)
35
+ end
36
+
37
+ if File.exists?(dir)
38
+ unless File.directory?(dir)
39
+ puts "moving old config #{dir} to #{back}"
40
+ FileUtils.mv(dir, new)
41
+ end
42
+ end
43
+
44
+ puts "[create] #{dir}/"
45
+ FileUtils.mkdir_p(dir)
46
+ FileUtils.mkdir_p("#{dir}/accounts")
47
+ FileUtils.mkdir_p("#{dir}/templates")
48
+
49
+ files.each do |file|
50
+ src = "#{conf}/#{file}"
51
+ dest = "#{dir}/#{file}"
52
+ if File.exists?(dest) && !force?
53
+ puts "[skip] #{dest}"
54
+ else
55
+ puts "[create] #{dest}"
56
+ FileUtils.copy(src, dest)
57
+ end
58
+ end
59
+ end
45
60
  end
46
61
  end
47
62
  end
@@ -0,0 +1,27 @@
1
+ module Rig
2
+ module Command
3
+ class Ssh < Abstract
4
+ parameter "NAME", "name of the host. <role><#>.<env>, eg: solo1.stable for the first solo role in environment stable"
5
+ def execute
6
+ user = Rig.config.ssh.user rescue nil
7
+ unless user
8
+ puts "must set rig:ssh:user in configuration."
9
+ exit(1)
10
+ end
11
+
12
+ list = Rig::Cloud::Instance.find_by_nick(name)
13
+ if list.count == 0
14
+ puts "server not found."
15
+ elsif list.count > 1
16
+ puts "query returned more than one server:"
17
+ instance_list(list)
18
+ else
19
+ server = list.first
20
+ puts "connecting as #{user} to: #{server.tags['Name']} (#{server.public_ip_address})"
21
+ exec("ssh #{user}@#{server.public_ip_address}")
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ Rig::Command::Main.subcommand 'ssh', 'ssh to server', Rig::Command::Ssh
@@ -1,19 +1,57 @@
1
1
 
2
2
  module Rig
3
3
  class << self
4
+ def configdir
5
+ @configdir ||= File.expand_path(ENV["RIG_CONFIG"] || "~/.rig")
6
+ end
7
+
4
8
  def config
5
9
  @configuration ||= begin
6
- f = ENV["RIG_CONFIG"] || "~/.rig"
7
- file = File.expand_path(f)
8
- #puts "loading file: #{f}"
9
- raise "Configuration not found: #{f} (#{file})" unless File.exists?(file)
10
- yaml = YAML.load_file(file)
11
- Rig::Oconfig.new(yaml['rig'])
10
+ c = Rig::Oconfig.load_yaml_file("#{configdir}/config.yml")
11
+ if c.chef
12
+ require 'rig/chef'
13
+ end
14
+ c
12
15
  end
13
16
  end
17
+
18
+ def account_list
19
+ @account_list ||= begin
20
+ accountdir = "#{configdir}/accounts"
21
+ Dir["#{accountdir}/*"].inject({}) do |h, e|
22
+ f = e.gsub("#{accountdir}/", "")
23
+ f = File.basename(f, ".yml")
24
+ h[f.to_sym] = e
25
+ h
26
+ end
27
+ end
28
+ end
29
+
30
+ def account
31
+ @account ||= begin
32
+ Oconfig.load_yaml_file("#{configdir}/accounts/#{get_account}.yml")
33
+ end
34
+ end
35
+
36
+ def get_account
37
+ return ENV['RIG_ACCOUNT'] if ENV['RIG_ACCOUNT']
38
+ return Rig.config.default_account if Rig.config.default_account
39
+ return Rig.config.accounts.first if Rig.config.accounts.count > 0
40
+ "default"
41
+ end
14
42
  end
15
43
 
16
44
  class Oconfig
45
+ class << self
46
+ def load_yaml_file(path)
47
+ file = File.expand_path(path)
48
+ raise "Configuration not found: #{path} (#{file})" unless File.exists?(file)
49
+ yaml = YAML.load_file(file)
50
+ yaml = yaml[yaml.keys.first] if yaml.keys.count == 1
51
+ Rig::Oconfig.new(yaml)
52
+ end
53
+ end
54
+
17
55
  def initialize(data={})
18
56
  @data = {}
19
57
  update!(data)
@@ -53,7 +91,7 @@ module Rig
53
91
  def to_hash
54
92
  out = {}
55
93
  @data.each do |k, v|
56
- out[k.to_s] = v.kind_of?(Oconfig) ? v.to_hash : v
94
+ out[k] = v.kind_of?(Oconfig) ? v.to_hash : v
57
95
  end
58
96
  out
59
97
  end
@@ -3,7 +3,7 @@ unless defined?(Rig::Version)
3
3
  module Version
4
4
  MAJOR = 0
5
5
  MINOR = 3
6
- TINY = 1
6
+ TINY = 2
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ require File.expand_path('../lib/rig/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Shawn Catanzarite"]
6
- gem.email = ["xenonsoul@gmail.com"]
6
+ gem.email = ["scatanzarite@gmail.com"]
7
7
  gem.description = %q{Cloud provisioning tool built on ruby fog}
8
8
  gem.summary = %q{Cloud provisioning tool built on ruby fog}
9
9
  gem.homepage = "https://github.com/shawncatz/rig"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rig
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 1
10
- version: 0.3.1
9
+ - 2
10
+ version: 0.3.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Shawn Catanzarite
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-23 00:00:00 Z
18
+ date: 2012-04-25 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: clamp
@@ -103,7 +103,7 @@ dependencies:
103
103
  version_requirements: *id006
104
104
  description: Cloud provisioning tool built on ruby fog
105
105
  email:
106
- - xenonsoul@gmail.com
106
+ - scatanzarite@gmail.com
107
107
  executables:
108
108
  - rig
109
109
  extensions: []
@@ -117,6 +117,10 @@ files:
117
117
  - README.md
118
118
  - Rakefile
119
119
  - bin/rig
120
+ - conf/accounts/default.yml
121
+ - conf/config.yml
122
+ - conf/templates/multi.yml
123
+ - conf/templates/solo.yml
120
124
  - lib/rig.rb
121
125
  - lib/rig/capistrano.rb
122
126
  - lib/rig/chef.rb
@@ -146,7 +150,6 @@ files:
146
150
  - lib/rig/command/instance/destroy.rb
147
151
  - lib/rig/command/instance/list.rb
148
152
  - lib/rig/command/instance/main.rb
149
- - lib/rig/command/instance/ssh.rb
150
153
  - lib/rig/command/instance/tag/get.rb
151
154
  - lib/rig/command/instance/tag/main.rb
152
155
  - lib/rig/command/instance/tag/remove.rb
@@ -156,6 +159,7 @@ files:
156
159
  - lib/rig/command/keypair/main.rb
157
160
  - lib/rig/command/main.rb
158
161
  - lib/rig/command/options.rb
162
+ - lib/rig/command/ssh.rb
159
163
  - lib/rig/config.rb
160
164
  - lib/rig/version.rb
161
165
  - rig.gemspec
@@ -1,32 +0,0 @@
1
- require 'rig'
2
-
3
- module Rig
4
- module Command
5
- module Instance
6
- class Ssh < Abstract
7
- include Options::Config
8
-
9
- parameter "NAME", "the name of the instance to connect to"
10
-
11
- def execute
12
- connection = Rig::Cloud.compute
13
-
14
- filters = {}
15
- filters["tag:Name"] = name if name
16
-
17
- list = connection.servers.all(filters)
18
- if list.count > 1
19
- puts "there is more than one instance that matches:"
20
- instance_list(list)
21
- return
22
- end
23
-
24
- server = list.first
25
- puts "ssh root@#{server.public_ip_address}"
26
- end
27
- end
28
- end
29
- end
30
- end
31
-
32
- Rig::Command::Instance::Main.subcommand 'ssh', 'Connect to instance', Rig::Command::Instance::Ssh