rig 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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