rig 0.4.5 → 0.5.0

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.
Files changed (60) hide show
  1. data/Gemfile +1 -0
  2. data/conf/accounts/default.yml +3 -3
  3. data/conf/config.yml +33 -6
  4. data/conf/plugins/chef.rb +105 -0
  5. data/conf/plugins/mongo.rb +135 -0
  6. data/{lib/rig/command/database.rb → conf/plugins/mysql.rb} +12 -8
  7. data/conf/plugins/scout.rb +81 -0
  8. data/conf/userdata/chef/userdata.sh.erb +7 -1
  9. data/lib/rig.rb +11 -1
  10. data/lib/rig/account.rb +43 -0
  11. data/lib/rig/command.rb +92 -41
  12. data/lib/rig/command/abstract.rb +1 -2
  13. data/lib/rig/command/balancer.rb +102 -0
  14. data/lib/rig/command/dns.rb +47 -0
  15. data/lib/rig/command/environment.rb +67 -0
  16. data/lib/rig/command/keypair.rb +15 -0
  17. data/lib/rig/command/server.rb +181 -0
  18. data/lib/rig/config.rb +35 -105
  19. data/lib/rig/log.rb +66 -0
  20. data/lib/rig/model/account.rb +1 -1
  21. data/lib/rig/model/connection.rb +13 -6
  22. data/lib/rig/model/environment.rb +12 -8
  23. data/lib/rig/model/instance.rb +3 -8
  24. data/lib/rig/model/template.rb +1 -1
  25. data/lib/rig/model/userdata.rb +1 -1
  26. data/lib/rig/plugin.rb +61 -0
  27. data/lib/rig/version.rb +2 -2
  28. metadata +15 -35
  29. data/lib/rig/chef.rb +0 -59
  30. data/lib/rig/command/balancer/destroy.rb +0 -16
  31. data/lib/rig/command/balancer/list.rb +0 -30
  32. data/lib/rig/command/balancer/listener.rb +0 -31
  33. data/lib/rig/command/balancer/main.rb +0 -40
  34. data/lib/rig/command/balancer/view.rb +0 -19
  35. data/lib/rig/command/dns/create.rb +0 -19
  36. data/lib/rig/command/dns/destroy.rb +0 -16
  37. data/lib/rig/command/dns/edit.rb +0 -20
  38. data/lib/rig/command/dns/list.rb +0 -21
  39. data/lib/rig/command/dns/main.rb +0 -13
  40. data/lib/rig/command/environment/create.rb +0 -21
  41. data/lib/rig/command/environment/destroy.rb +0 -18
  42. data/lib/rig/command/environment/list.rb +0 -31
  43. data/lib/rig/command/environment/main.rb +0 -15
  44. data/lib/rig/command/environment/protect.rb +0 -22
  45. data/lib/rig/command/instance/create.rb +0 -60
  46. data/lib/rig/command/instance/destroy.rb +0 -19
  47. data/lib/rig/command/instance/list.rb +0 -26
  48. data/lib/rig/command/instance/main.rb +0 -16
  49. data/lib/rig/command/instance/tag/get.rb +0 -20
  50. data/lib/rig/command/instance/tag/main.rb +0 -14
  51. data/lib/rig/command/instance/tag/remove.rb +0 -44
  52. data/lib/rig/command/instance/tag/set.rb +0 -46
  53. data/lib/rig/command/instance/view.rb +0 -20
  54. data/lib/rig/command/keypair/list.rb +0 -14
  55. data/lib/rig/command/keypair/main.rb +0 -11
  56. data/lib/rig/command/main.rb +0 -90
  57. data/lib/rig/model/database.rb +0 -23
  58. data/lib/rig/model/database/base.rb +0 -11
  59. data/lib/rig/model/database/mongodb.rb +0 -70
  60. data/lib/rig/model/database/mysql.rb +0 -12
data/Gemfile CHANGED
@@ -8,3 +8,4 @@ gem 'chef', '~> 0.10.8'
8
8
  gem 'net-ssh', '~> 2.1.4'
9
9
  gem 'mongodb'
10
10
  gem 'bson_ext'
11
+ gem 'scout_api'
@@ -10,12 +10,12 @@
10
10
  # the same DNS provider for all of your accounts.
11
11
  :dns_zone: blah.com
12
12
 
13
- # this is the key that you will use to SSH to the server
13
+ # this is the keypair that you use to SSH to the servers
14
14
  :keypair: keyname
15
15
 
16
16
  # security groups to use when creating instances
17
17
  # groups configuration precedence:
18
- # template instances -> template -> account -> config
18
+ # template instances -> template -> account
19
19
  # :groups:
20
20
  # - default
21
21
 
@@ -28,7 +28,7 @@
28
28
  # ~/.rig/userdata/default
29
29
  #
30
30
  # The following are provided:
31
- # "default" is a vanilla install
31
+ # "default" is a vanilla install (intended for Ubuntu on AWS)
32
32
  # "chef" is designed to bootstrap a chef implementation
33
33
  #
34
34
  # See the corresponding userdata.yml for more information
@@ -13,13 +13,40 @@
13
13
  # AWS defaults to the user "ubuntu"
14
14
  :user: ubuntu
15
15
 
16
- # if you're using chef, set this to the knife.rb configuration file
17
- # this will allow Rig to manage the chef nodes, environments, etc.
18
- #
19
- #:chef:
20
- # :knife: /path/to/chef/knife.rb
16
+ # logging system, by default level is set to WARN
17
+ # the default log file is RIG_CONFIG/rig.log
18
+ :logging:
19
+ # define a logger, the key is the name of the logger
20
+ # you can define as many as you would like.
21
+ :console:
22
+ # opts correspond to the options passed to Logger.new
23
+ # this will convert STDOUT and STDERR to the corresponding constant
24
+ :opts: STDOUT
25
+ # supported log levels are:
26
+ # debug, info, warn, error, fatal
27
+ :level: warn
28
+ :log:
29
+ # relative file names are relative to the Rig configuration directory
30
+ # rig.log below corresponds to RIG_CONFIG/rig.log (~/.rig/rig.log)
31
+ :opts: [ rig.log, daily ]
32
+ :level: debug
21
33
 
22
- #TODO: Figure out the same thing for puppet
34
+ # event-based plugins framework
35
+ #
36
+ #:plugins:
37
+ # :chef:
38
+ # # if you're using chef, set this to the location of the knife.rb
39
+ # # configuration file.
40
+ # :knife: /Users/Shawn/work/chef/.chef/knife.rb
41
+ #
42
+ # :puppet:
43
+ # #TODO: Figure out the same thing for puppet
44
+ #
45
+ # :scout:
46
+ # # if you're using Scout, set the API account details here.
47
+ # :account: youraccount
48
+ # :email: your@awesome.com
49
+ # :secret: sekret
23
50
 
24
51
  #
25
52
  # DO NOT PUT ACCOUNT RELATED INFORMATION
@@ -0,0 +1,105 @@
1
+ require 'rubygems'
2
+
3
+ require 'chef'
4
+ require 'chef/config'
5
+ require 'chef/api_client'
6
+ require 'chef/node'
7
+ require 'chef/environment'
8
+
9
+ module Rig
10
+ module Plugin
11
+ module Chef
12
+ include Rig::Plugin::Base
13
+
14
+ on "environment:create" do |args|
15
+ environment = args.shift
16
+ name = environment.name
17
+ self.environment_create(name)
18
+ end
19
+
20
+ on "environment:destroy" do |args|
21
+ environment = args.shift
22
+ name = environment.name
23
+ self.environment_destroy(name)
24
+ end
25
+
26
+ on "instance:create" do |args|
27
+ # do nothing
28
+ # the instance will add itself through the chef-client call in userdata package
29
+ end
30
+
31
+ on "instance:destroy" do |args|
32
+ instance = args.shift
33
+ tags = args.shift
34
+ name = tags['Name']
35
+ self.client_delete(name)
36
+ self.node_delete(name)
37
+ end
38
+
39
+ command "chef", "test chef configuration" do
40
+ def execute
41
+ list = Rig::Plugin::Chef.client_list
42
+ rows = []
43
+ list.each do |c|
44
+ rows << c
45
+ end
46
+ print_table(%w{Name Location}, rows)
47
+ end
48
+ end
49
+
50
+ class << self
51
+ def configure
52
+ @config ||= config_for self
53
+ @chef ||= ::Chef::Config.from_file(File.expand_path(@config[:knife]))
54
+ end
55
+
56
+ def test
57
+ self.client_list
58
+ end
59
+
60
+ def environment_create(name)
61
+ configure
62
+ env = ::Chef::Environment.new
63
+ env.name(name)
64
+ env.description("created by Rig")
65
+ env.save
66
+ true
67
+ rescue => e
68
+ puts "*** chef exception: #{e.message}"
69
+ false
70
+ end
71
+
72
+ def environment_destroy(name)
73
+ configure
74
+ env = ::Chef::Environment.load(name) rescue nil
75
+ env.destroy if env
76
+ true
77
+ rescue => e
78
+ puts "*** chef exception: #{e.message}"
79
+ false
80
+ end
81
+
82
+ def client_delete(name)
83
+ configure
84
+ # TODO: better error handling
85
+ client = ::Chef::ApiClient.load(name) rescue nil
86
+ client.destroy if client
87
+ end
88
+
89
+ def client_list
90
+ configure
91
+ # TODO: better error handling
92
+ ::Chef::ApiClient.list
93
+ end
94
+
95
+ def node_delete(name)
96
+ configure
97
+ # TODO: better error handling
98
+ node = ::Chef::Node.load(name) rescue nil
99
+ node.destroy if node
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ end
@@ -0,0 +1,135 @@
1
+ require 'mongo'
2
+
3
+ module Rig
4
+ module Plugin
5
+ module Mongo
6
+ include Rig::Plugin::Base
7
+
8
+ #on "commands:loaded" do |args|
9
+ # command = args.shift
10
+ # command.subcommand "mongo", "manage mongodb databases", Rig::Command::Mongo::Main
11
+ #end
12
+
13
+ command "mongo", "manage mongodb databases" do
14
+ subcommand "list", "list all databases" do
15
+ def execute
16
+ list = Rig::Plugin::Mongo.all.sort
17
+ print_table(%w{Database Size}, list)
18
+ end
19
+ end
20
+ subcommand "create", "create a database" do
21
+ parameter "NAME", "name of the database"
22
+ parameter "[USER]", "user to add to database"
23
+ parameter "[PASS]", "password of user to add to database"
24
+
25
+ def execute
26
+ db = Rig::Connection.database
27
+ db.create_database(name, user, pass) unless test?
28
+ end
29
+ end
30
+ subcommand "destroy", "destroy a database" do
31
+ parameter "NAME", "name of the database"
32
+
33
+ def execute
34
+ db = Rig::Connection.database
35
+ db.destroy_database(name) unless test?
36
+ end
37
+ end
38
+ self.default_subcommand = "list"
39
+ end
40
+
41
+ class << self
42
+ #def initialize(opts)
43
+ # @options = {
44
+ # :host => "localhost",
45
+ # :port => 27017,
46
+ # :user => nil,
47
+ # :pass => nil,
48
+ # :admin_user => nil,
49
+ # :admin_pass => nil
50
+ # }.merge(opts)
51
+ # connect
52
+ #end
53
+
54
+ ## accessors
55
+ #def user; @options[:user]; end
56
+ #def host; @options[:host]; end
57
+ #def port; @options[:port]; end
58
+ #def pass; @options[:pass]; end
59
+ #def password; @options[:pass]; end
60
+ #def admin_user; @options[:admin_user]; end
61
+ #def admin_pass; @options[:admin_pass]; end
62
+ #def admin_password; @options[:admin_pass]; end
63
+
64
+ def connect
65
+ @options ||= config_for self
66
+ @cxn ||= begin
67
+ ::Mongo::Connection.new(@options[:host], @options[:port])
68
+ end
69
+ end
70
+
71
+ def auth_admin
72
+ db = @cxn.db("admin")
73
+ db.authenticate(@options[:admin_user], @options[:admin_pass])
74
+ end
75
+
76
+ def all
77
+ begin
78
+ connect.database_info
79
+ rescue ::Mongo::OperationFailure => e
80
+ raise unless e.message =~ /need to login/
81
+ raise unless auth_admin
82
+ connect.database_info
83
+ rescue => e
84
+ puts "exception: <#{e.class}> #{e.message} at #{e.backtrace.first}"
85
+ end
86
+ end
87
+
88
+ def create_database(name, user, pass)
89
+ db = connect.db("admin")
90
+ raise "failed to authenticate" unless db.authenticate(@options[:admin_user], @options[:admin_pass])
91
+ newdb = connect.db(name)
92
+ newdb.add_user(user, pass)
93
+ end
94
+
95
+ def destroy_database(name)
96
+ db = connect.db("admin")
97
+ raise "failed to authenticate" unless db.authenticate(@options[:admin_user], @options[:admin_pass])
98
+ connect.drop_database(name)
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ module Command
105
+ module Mongo
106
+ class Main < Clamp::Command
107
+ subcommand "list", "list all databases" do
108
+ def execute
109
+ list = Rig::Plugin::Mongo.all.sort
110
+ print_table(%w{Database Size}, list)
111
+ end
112
+ end
113
+ subcommand "create", "create a database" do
114
+ parameter "NAME", "name of the database"
115
+ parameter "[USER]", "user to add to database"
116
+ parameter "[PASS]", "password of user to add to database"
117
+
118
+ def execute
119
+ db = Rig::Connection.database
120
+ db.create_database(name, user, pass) unless test?
121
+ end
122
+ end
123
+ subcommand "destroy", "destroy a database" do
124
+ parameter "NAME", "name of the database"
125
+
126
+ def execute
127
+ db = Rig::Connection.database
128
+ db.destroy_database(name) unless test?
129
+ end
130
+ end
131
+ self.default_subcommand = "list"
132
+ end
133
+ end
134
+ end
135
+ end
@@ -1,9 +1,12 @@
1
- require 'mongo'
2
- require 'awesome_print'
3
-
4
1
  module Rig
2
+ module Plugin
3
+ class Mysql < Base
4
+
5
+ end
6
+ end
7
+
5
8
  module Command
6
- module Database
9
+ module Mysql
7
10
  class List < Abstract
8
11
  def execute
9
12
  db = Rig::Connection.database
@@ -15,8 +18,9 @@ module Rig
15
18
 
16
19
  class Create < Abstract
17
20
  parameter "NAME", "name of the database"
18
- parameter "[USER]", "user to add to database", :default => Rig::Connection.database.user
19
- parameter "[PASS]", "password of user to add to database", :default => Rig::Connection.database.pass
21
+ parameter "[USER]", "user to add to database"
22
+ parameter "[PASS]", "password of user to add to database"
23
+
20
24
  def execute
21
25
  db = Rig::Connection.database
22
26
  db.create_database(name, user, pass) unless test?
@@ -25,6 +29,7 @@ module Rig
25
29
 
26
30
  class Destroy < Abstract
27
31
  parameter "NAME", "name of the database"
32
+
28
33
  def execute
29
34
  db = Rig::Connection.database
30
35
  db.destroy_database(name) unless test?
@@ -39,5 +44,4 @@ module Rig
39
44
  end
40
45
  end
41
46
  end
42
- end
43
- Rig::Command::Main.subcommand "database", "manage mongodb or mysql databases", Rig::Command::Database::Main
47
+ end
@@ -0,0 +1,81 @@
1
+ require 'rubygems'
2
+ require 'scout_api'
3
+
4
+ module Rig
5
+ module Plugin
6
+ module Scout
7
+ include Rig::Plugin::Base
8
+
9
+ #on "environment:create" do |_|
10
+ #end
11
+
12
+ #on "environment:destroy" do |_|
13
+ #end
14
+
15
+ #on "instance:create" do |args|
16
+ #end
17
+
18
+ on "instance:destroy" do |args|
19
+ instance = args.shift
20
+ tags = args.shift
21
+ name = tags["Name"]
22
+ unless name.nil? || name.empty?
23
+ self.instance_destroy(name)
24
+ end
25
+ end
26
+
27
+ #on "commands:loaded" do |args|
28
+ # command = args.shift
29
+ # command.subcommand "scout", "test scout configuration", Rig::Command::Scout
30
+ #end
31
+
32
+ command "scout", "test scout configuration" do
33
+ def execute
34
+ list = Rig::Plugin::Scout.test
35
+ rows = []
36
+ list.each do |c|
37
+ rows << [c[:hostname], c[:checkup_status], c[:last_checkin]]
38
+ end
39
+ print_table(%w{Hostname Status LastCheckIn}, rows)
40
+ end
41
+ end
42
+
43
+ class << self
44
+ def configure
45
+ @config ||= config_for self
46
+ @scout ||= ::Scout::Account.new(@config[:account], @config[:email], @config[:secret])
47
+ end
48
+
49
+ def test
50
+ configure
51
+ ::Scout::Server.all
52
+ end
53
+
54
+ def instance_destroy(name)
55
+ configure
56
+ server = ::Scout::Server.first(:name => name)
57
+ ::Scout::Server.delete(server.id) if server
58
+ end
59
+
60
+ def environment_destroy(name)
61
+ configure
62
+ all = ::Scout::Server.all
63
+ list = all.select { |e| e.name =~ /\.#{name}\./ }
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ #module Command
70
+ # class Scout < Clamp::Command
71
+ # def execute
72
+ # list = Rig::Plugin::Scout.test
73
+ # rows = []
74
+ # list.each do |c|
75
+ # rows << [c[:hostname], c[:checkup_status], c[:last_checkin]]
76
+ # end
77
+ # table(%w{Hostname Status LastCheckIn}, rows)
78
+ # end
79
+ # end
80
+ #end
81
+ end
@@ -60,4 +60,10 @@ cat << <%= local.upcase %> > <%= remote %>
60
60
  <%= local.upcase %>
61
61
  <% end %>
62
62
 
63
- chef-client -N <%= @name %> <%= @chef && @environment ? "-E " + @environment : "" %> --once -j /etc/chef/bootstrap.json 2>&1
63
+ cat << BOOTCHEF > /root/boot-chef
64
+ #!/bin/bash
65
+ chef-client -N <%= @name %> <%= @environment ? "-E #@environment" : "" %> --once -j /etc/chef/bootstrap.json
66
+ BOOTCHEF
67
+ chmod 755 /root/boot-chef
68
+
69
+ /root/boot-chef