rig 0.4.5 → 0.5.0

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