rig 0.3.1
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/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +67 -0
- data/Rakefile +2 -0
- data/bin/rig +15 -0
- data/lib/rig.rb +2 -0
- data/lib/rig/capistrano.rb +54 -0
- data/lib/rig/chef.rb +53 -0
- data/lib/rig/cloud.rb +4 -0
- data/lib/rig/cloud/balancer.rb +40 -0
- data/lib/rig/cloud/connection.rb +40 -0
- data/lib/rig/cloud/dns.rb +56 -0
- data/lib/rig/cloud/environment.rb +214 -0
- data/lib/rig/cloud/instance.rb +64 -0
- data/lib/rig/cloud/userdata.rb +111 -0
- data/lib/rig/command.rb +42 -0
- data/lib/rig/command/abstract.rb +36 -0
- data/lib/rig/command/balancer/destroy.rb +16 -0
- data/lib/rig/command/balancer/list.rb +21 -0
- data/lib/rig/command/balancer/main.rb +13 -0
- data/lib/rig/command/balancer/view.rb +19 -0
- data/lib/rig/command/dns/create.rb +19 -0
- data/lib/rig/command/dns/destroy.rb +16 -0
- data/lib/rig/command/dns/edit.rb +20 -0
- data/lib/rig/command/dns/list.rb +21 -0
- data/lib/rig/command/dns/main.rb +13 -0
- data/lib/rig/command/environment/create.rb +24 -0
- data/lib/rig/command/environment/destroy.rb +18 -0
- data/lib/rig/command/environment/list.rb +30 -0
- data/lib/rig/command/environment/main.rb +15 -0
- data/lib/rig/command/instance/create.rb +27 -0
- data/lib/rig/command/instance/destroy.rb +20 -0
- data/lib/rig/command/instance/list.rb +25 -0
- data/lib/rig/command/instance/main.rb +16 -0
- data/lib/rig/command/instance/ssh.rb +32 -0
- data/lib/rig/command/instance/tag/get.rb +41 -0
- data/lib/rig/command/instance/tag/main.rb +14 -0
- data/lib/rig/command/instance/tag/remove.rb +44 -0
- data/lib/rig/command/instance/tag/set.rb +47 -0
- data/lib/rig/command/instance/view.rb +20 -0
- data/lib/rig/command/keypair/list.rb +14 -0
- data/lib/rig/command/keypair/main.rb +11 -0
- data/lib/rig/command/main.rb +48 -0
- data/lib/rig/command/options.rb +97 -0
- data/lib/rig/config.rb +68 -0
- data/lib/rig/version.rb +10 -0
- data/rig.gemspec +39 -0
- metadata +196 -0
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'fog'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Cloud
|
5
|
+
class Instance
|
6
|
+
class << self
|
7
|
+
def all(filters={})
|
8
|
+
Rig::Cloud.compute.servers.all(filters)
|
9
|
+
end
|
10
|
+
|
11
|
+
def running
|
12
|
+
self.all({"instance-state-name"=>"running"})
|
13
|
+
end
|
14
|
+
|
15
|
+
def find(id)
|
16
|
+
if id =~ /^i-/
|
17
|
+
Rig::Cloud.compute.servers.find(id)
|
18
|
+
else
|
19
|
+
# must be tag:Name
|
20
|
+
Rig::Cloud.compute.servers.all({"tag:Name"=>id})
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_by_environment(env)
|
25
|
+
Rig::Cloud.compute.servers.all({"tag:Environment"=>env})
|
26
|
+
end
|
27
|
+
|
28
|
+
def create(opts, tags={})
|
29
|
+
fog = Rig::Cloud.compute
|
30
|
+
server = fog.servers.create(opts)
|
31
|
+
fog.create_tags(server.id, tags) if tags.count > 0
|
32
|
+
puts ".. created: #{server.id}"
|
33
|
+
server
|
34
|
+
end
|
35
|
+
|
36
|
+
def destroy(list)
|
37
|
+
list = [*list]
|
38
|
+
|
39
|
+
if list.count > 0
|
40
|
+
compute = Rig::Cloud.compute
|
41
|
+
ids = list.map {|e| e.kind_of?(String) ? e : e.id}
|
42
|
+
puts ".. destroying: #{ids.inspect}"
|
43
|
+
|
44
|
+
# if we've got a chef config, use it
|
45
|
+
if Rig.config.chef
|
46
|
+
list.each do |e|
|
47
|
+
Rig::Chef.client_delete(e.tags['Name']) if e.tags['Name']
|
48
|
+
Rig::Chef.node_delete(e.tags['Name']) if e.tags['Name']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# destroy the instances
|
53
|
+
list.each do |e|
|
54
|
+
e.destroy
|
55
|
+
end
|
56
|
+
|
57
|
+
tags = %w{Name Environment Role}.inject({}) {|h, e| h[e] = nil; h }
|
58
|
+
compute.create_tags(ids, tags)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Cloud
|
5
|
+
class << self
|
6
|
+
def userdata(name, role, environment, opts={ })
|
7
|
+
data = {
|
8
|
+
:name => name,
|
9
|
+
:role => role,
|
10
|
+
:environment => environment,
|
11
|
+
:zone => Rig.config.dns.zone,
|
12
|
+
:dependencies => %w{ ruby1.9.3 ruby1.9.1-dev rubygems ruby-switch libopenssl-ruby1.9.1 rdoc1.9.1 ri1.9.1 irb1.9.1
|
13
|
+
build-essential wget ssl-cert curl },
|
14
|
+
:gems => %w{chef},
|
15
|
+
:chef => false,
|
16
|
+
}.merge(opts)
|
17
|
+
template = <<-EOF
|
18
|
+
#!/bin/bash
|
19
|
+
set -e -x
|
20
|
+
exec > ~/userdata.log 2>&1
|
21
|
+
export DEBIAN_FRONTEND=noninteractive
|
22
|
+
apt-add-repository -y ppa:brightbox/ruby-ng-experimental
|
23
|
+
|
24
|
+
apt-get update && apt-get upgrade -y
|
25
|
+
apt-get -y install <%= @dependencies.join(' ') %>
|
26
|
+
mkdir -p /var/log/chef
|
27
|
+
mkdir -p /var/backups/chef
|
28
|
+
mkdir -p /var/run/chef
|
29
|
+
mkdir -p /var/cache/chef
|
30
|
+
mkdir -p /var/lib/chef
|
31
|
+
mkdir /etc/chef
|
32
|
+
|
33
|
+
# set up hostname
|
34
|
+
hostname <%= @name %>.<%= @zone %>
|
35
|
+
echo "<%= @name %>.<%= @zone %>" > /etc/hostname
|
36
|
+
echo "127.0.0.1 <%= @name %>.<%= @zone %> <%= @name.split('.')[0] %> <%= @name %> # entered by userdata script" >> /etc/hosts
|
37
|
+
|
38
|
+
gem install rubygems-update --no-ri --no-rdoc
|
39
|
+
update_rubygems
|
40
|
+
|
41
|
+
<% @gems.each do |gem| %>
|
42
|
+
gem install <%= gem %> --no-ri --no-rdoc
|
43
|
+
<% end %>
|
44
|
+
|
45
|
+
cat <<FACTS > /etc/facts.yml
|
46
|
+
inq_name: <%= @name %>
|
47
|
+
inq_role: <%= @role %>
|
48
|
+
inq_environment: <%= @environment %>
|
49
|
+
FACTS
|
50
|
+
|
51
|
+
cat <<JSON > /etc/chef/bootstrap.json
|
52
|
+
{
|
53
|
+
"run_list": [
|
54
|
+
"role[<%= @role %>]"
|
55
|
+
]
|
56
|
+
}
|
57
|
+
JSON
|
58
|
+
|
59
|
+
cat <<CLIENT > /etc/chef/client.rb
|
60
|
+
log_level :info
|
61
|
+
log_location "/var/log/chef/client.log"
|
62
|
+
ssl_verify_mode :verify_none
|
63
|
+
validation_client_name "chef-validator"
|
64
|
+
validation_key "/etc/chef/validation.pem"
|
65
|
+
client_key "/etc/chef/client.pem"
|
66
|
+
chef_server_url "http://chef.inqlabs.com:4000";
|
67
|
+
file_cache_path "/var/cache/chef"
|
68
|
+
file_backup_path "/var/backups/chef"
|
69
|
+
pid_file "/var/run/chef/client.pid"
|
70
|
+
node_name "<%= @name %>";
|
71
|
+
Chef::Log::Formatter.show_time = true
|
72
|
+
CLIENT
|
73
|
+
|
74
|
+
cat <<VALID > /etc/chef/validation.pem
|
75
|
+
-----BEGIN RSA PRIVATE KEY-----
|
76
|
+
MIIEpgIBAAKCAQEAxFST0blraLl7mac91QzSxNNZQt7A4Mo4O297e+r6F5b1+Eae
|
77
|
+
RNAH9w4p9sctLttIT8rI77hWrgS04f6mbamSaY+pAyWje+MX2s5YXizEML1Fdyr6
|
78
|
+
hV1n/vIMOmhcVwGbF3fg6BKwjur7A1dS+aOM1sEYi77hfbY4NHhLCQiR4v2m4saC
|
79
|
+
C9SPX7uNIzKvGB2P/5U+HNPaJuo6GAUsrOrTA/YB53Bza4DPMpyp9+Hf/ZR9l6Hd
|
80
|
+
4tCAp07dUNZ/LKKL4AmsnCqlT5EiYFIsaq2ezzPnS9t2FlFV60a2opbdEvq/QLbz
|
81
|
+
ouH6H+/4n/+BY9bVBCg1oBXHlLwbZmNl7Xl4wQIDAQABAoIBAQCFDIAkZ5C3psNx
|
82
|
+
bJoFkKwhQM1D+OsjK0eSV8mKP8J+TAqi11CYd5Z+QbYEjBQ9pdNKZ7VmZzkusvfW
|
83
|
+
E5m7xWf4a6fw/wfchBh9assN/y5xjULPMGwYByXb6zKIPoMdX3Q4IkBjZY8LO4ki
|
84
|
+
SYJstP5T5wX4ZkIvzFYokMDg/VLITUZPnxu+OunFF/vfl7mFOIrHtCj6LSpCk5xW
|
85
|
+
NsQqJWzK6/xjKH8KweWkl+E7k/ILUetXuCjKhj2XjiYUbzRH12e5jJIsEXRKWw8I
|
86
|
+
Iw5I8N4fWaXbTmoI+NUV+24BqwOfCH0RjoZXcc6LOxmxKDd8a00H3bCYj9GbpLed
|
87
|
+
oFcCY2OFAoGBAPSj4u2sSI1uMWNMivTbEYC5pYeltJgRYByazFHj5mHtPF7aDs2a
|
88
|
+
IWBfaaHbRIk7d9mIGYOrEiFFpDi5zWYo1gEbwqqOVw4cxL6coVA5mUMdZFDSGcpL
|
89
|
+
jwCIp9Yz92mOvygJEQosBIaMaBNTVY2GJPEo8Uhp0OstMDxIR9YrxdwjAoGBAM1y
|
90
|
+
atxCx8Z7Mua33x6gPxyyQVnqU/Hvpa9uTF0laAcwarsNlXczyfw/5TNJsEyTzbE1
|
91
|
+
6yJdm5GDS7L6whprx20SCHgpfBcAK6UGMMYsRvRz8kThLI7jgsXQjNXO8MNvaYwO
|
92
|
+
z9uVp+i1OVN0jURPwu6NsHcduSCP4asZwBIIOoPLAoGBAJdZQM5rlKMy9gkJ1Lnx
|
93
|
+
Qd3SfK7z/EtMDJsFxbwv81rIK14/J4NZhKabwL0q6za/fMEuqyJDVr8Q161kfcdj
|
94
|
+
IiqjYwajcwY/FBUcz8vTJpdX+rTplp0Jq9nXsYYatkkuz+JT4Z/aZZ5cBRNXrgkV
|
95
|
+
YYt1GfkDxgWI+luBGDhO8mTjAoGBAJ5j3dreaWKuTLnvfEcCSGX5T8TgkcNufRBZ
|
96
|
+
Oup9EkyomUCI4ni6JrkhEbWO1CrVsLk01ojyHiP7U3szND5mZaPDSWBKq26YJQ3f
|
97
|
+
Te8a58FDOr670zx+Tq3vcQTNvHUQChF+weWK5Z7VSNL8goTt8V01Q50x/y4Jf3QI
|
98
|
+
MDo2udYtAoGBAKk596lHuH5/LEjT5hfVrbarSvUjlXswJusZGnwbtEUERY7abUbG
|
99
|
+
5mtI+Xme2q6T0Wjf6N977ecNYAi5VwpUzoziZUPeSCQUlRWSyX2o6+fVBngOFpLZ
|
100
|
+
tRv2ngXlc2sYh9RbnlWSdaK0g+U7V8l2wSsQjcPQ1J2vbIGjwBHDSzjc
|
101
|
+
-----END RSA PRIVATE KEY-----
|
102
|
+
VALID
|
103
|
+
|
104
|
+
chef-client -N <%= @name %> <%= @chef && @environment ? "-E " + @environment : "" %> --once -j /etc/chef/bootstrap.json 2>&1
|
105
|
+
EOF
|
106
|
+
erb = Erubis::Eruby.new(template)
|
107
|
+
out = erb.evaluate(data)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/lib/rig/command.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rig'
|
2
|
+
require 'clamp'
|
3
|
+
require 'fog'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
require 'rig/cloud'
|
7
|
+
|
8
|
+
require 'rig/command/abstract'
|
9
|
+
require 'rig/command/options'
|
10
|
+
|
11
|
+
require 'rig/command/main'
|
12
|
+
|
13
|
+
require 'rig/command/environment/main'
|
14
|
+
require 'rig/command/environment/list'
|
15
|
+
require 'rig/command/environment/create'
|
16
|
+
require 'rig/command/environment/destroy'
|
17
|
+
|
18
|
+
require 'rig/command/balancer/main'
|
19
|
+
require 'rig/command/balancer/list'
|
20
|
+
require 'rig/command/balancer/view'
|
21
|
+
require 'rig/command/balancer/destroy'
|
22
|
+
|
23
|
+
require 'rig/command/dns/main'
|
24
|
+
require 'rig/command/dns/list'
|
25
|
+
require 'rig/command/dns/create'
|
26
|
+
require 'rig/command/dns/edit'
|
27
|
+
require 'rig/command/dns/destroy'
|
28
|
+
|
29
|
+
require 'rig/command/instance/main'
|
30
|
+
require 'rig/command/instance/ssh'
|
31
|
+
require 'rig/command/instance/list'
|
32
|
+
require 'rig/command/instance/create'
|
33
|
+
require 'rig/command/instance/destroy'
|
34
|
+
require 'rig/command/instance/view'
|
35
|
+
|
36
|
+
require 'rig/command/instance/tag/main'
|
37
|
+
require 'rig/command/instance/tag/get'
|
38
|
+
require 'rig/command/instance/tag/set'
|
39
|
+
require 'rig/command/instance/tag/remove'
|
40
|
+
|
41
|
+
require 'rig/command/keypair/main'
|
42
|
+
require 'rig/command/keypair/list'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'terminal-table/import'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Command
|
5
|
+
class Abstract < Clamp::Command
|
6
|
+
option ["-n","--test"], :flag, "use Fog.mock! to test command without creating / destroying cloud resources" do |o|
|
7
|
+
Fog.mock!
|
8
|
+
end
|
9
|
+
|
10
|
+
def print_table(columns, rows)
|
11
|
+
puts table(columns, *rows)
|
12
|
+
end
|
13
|
+
|
14
|
+
def instance_list(list)
|
15
|
+
rows = []
|
16
|
+
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]
|
26
|
+
end
|
27
|
+
|
28
|
+
print_table(%w{Name Environment Role PublicIP Size InstanceID State}, rows)
|
29
|
+
end
|
30
|
+
|
31
|
+
def execute
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rig'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Command
|
5
|
+
module Balancer
|
6
|
+
class Destroy < Abstract
|
7
|
+
parameter "NAME", "name of load balancer"
|
8
|
+
def execute
|
9
|
+
Rig::Cloud::Balancer.destroy(name)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Rig::Command::Balancer::Main.subcommand 'destroy', 'destroy load balancer', Rig::Command::Balancer::Destroy
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rig'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Command
|
5
|
+
module Balancer
|
6
|
+
class List < Abstract
|
7
|
+
def execute
|
8
|
+
list = Rig::Cloud::Balancer.all
|
9
|
+
list.each do |lb|
|
10
|
+
puts lb.id
|
11
|
+
lb.instances.each do |inst|
|
12
|
+
puts "- #{inst}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Rig::Command::Balancer::Main.subcommand 'list', 'list load balancers', Rig::Command::Balancer::List
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'awesome_print'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Command
|
5
|
+
module Balancer
|
6
|
+
class View < Abstract
|
7
|
+
include Options::ShowAll
|
8
|
+
|
9
|
+
parameter "NAME", "name of instance"
|
10
|
+
|
11
|
+
def execute
|
12
|
+
item = Rig::Cloud::Balancer.find(name)
|
13
|
+
puts item.attributes.to_yaml
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
Rig::Command::Balancer::Main.subcommand 'view', 'view instances', Rig::Command::Balancer::View
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rig'
|
2
|
+
require 'ipaddress'
|
3
|
+
|
4
|
+
module Rig
|
5
|
+
module Command
|
6
|
+
module Dns
|
7
|
+
class Create < Abstract
|
8
|
+
parameter 'NAME', 'the name to create'
|
9
|
+
parameter 'VALUE', 'where the name points to'
|
10
|
+
|
11
|
+
def execute
|
12
|
+
Rig::Cloud::Dns.create(name, value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Rig::Command::Dns::Main.subcommand 'create', 'create dns name', Rig::Command::Dns::Create
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rig'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Command
|
5
|
+
module Dns
|
6
|
+
class Destroy < Abstract
|
7
|
+
parameter "NAME", "name of load balancer"
|
8
|
+
def execute
|
9
|
+
Rig::Cloud::Dns.destroy(name)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Rig::Command::Dns::Main.subcommand 'destroy', 'destroy dns record', Rig::Command::Dns::Destroy
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rig'
|
2
|
+
require 'ipaddress'
|
3
|
+
|
4
|
+
module Rig
|
5
|
+
module Command
|
6
|
+
module Dns
|
7
|
+
class Edit < Abstract
|
8
|
+
parameter 'NAME', 'the name to create'
|
9
|
+
parameter 'VALUE', 'where the name points to'
|
10
|
+
|
11
|
+
def execute
|
12
|
+
Rig::Cloud::Dns.destroy(name)
|
13
|
+
Rig::Cloud::Dns.create(name, value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Rig::Command::Dns::Main.subcommand 'edit', 'edit dns name', Rig::Command::Dns::Edit
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rig'
|
2
|
+
|
3
|
+
module Rig
|
4
|
+
module Command
|
5
|
+
module Dns
|
6
|
+
class List < Abstract
|
7
|
+
def execute
|
8
|
+
zone = Rig.config.dns.zone
|
9
|
+
records = Rig::Cloud::Dns.records("#{zone}")
|
10
|
+
rows = []
|
11
|
+
records.each do |record|
|
12
|
+
rows << [zone, record.type, record.ttl, record.name, record.value]
|
13
|
+
end
|
14
|
+
print_table(%w{Domain Type TTL Name Value}, rows)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Rig::Command::Dns::Main.subcommand 'list', 'list dns', Rig::Command::Dns::List
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rig'
|
2
|
+
require 'fog'
|
3
|
+
|
4
|
+
module Rig
|
5
|
+
module Command
|
6
|
+
module Environment
|
7
|
+
class Create < Abstract
|
8
|
+
include Options::AwsKey
|
9
|
+
include Options::AwsSecret
|
10
|
+
|
11
|
+
parameter "NAME", "the name of the environment"
|
12
|
+
parameter "TEMPLATE", "the template to use (solo, multi, etc)", :default => "solo"
|
13
|
+
|
14
|
+
def execute
|
15
|
+
#connection = Rig::Cloud.compute
|
16
|
+
env = Rig::Cloud::Environment.create(name, template.to_sym)
|
17
|
+
#ap env.servers
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Rig::Command::Environment::Main.subcommand 'create', 'create environment', Rig::Command::Environment::Create
|