vgh 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -1
- data/CHANGELOG.rdoc +6 -0
- data/README.rdoc +36 -46
- data/Rakefile +7 -0
- data/conf/config.yml.example +27 -6
- data/lib/vgh/apps/checkpoint.rb +55 -0
- data/lib/vgh/apps/ec2_backup.rb +21 -45
- data/lib/vgh/apps.rb +2 -1
- data/lib/vgh/cli.rb +9 -9
- data/lib/vgh/configuration.rb +60 -71
- data/lib/vgh/{extended_aws/extended_ec2 → ec2}/metadata.rb +5 -6
- data/lib/vgh/ec2/snapshot.rb +112 -0
- data/lib/vgh/ec2/volume.rb +77 -0
- data/lib/vgh/ec2.rb +15 -0
- data/lib/vgh/output.rb +0 -2
- data/lib/vgh/system/lvm.rb +38 -24
- data/lib/vgh/system/mysql.rb +16 -6
- data/lib/vgh/system.rb +50 -10
- data/lib/vgh/version.rb +1 -1
- data/lib/vgh.rb +3 -1
- data/spec/cli_spec.rb +14 -22
- data/spec/configuration_spec.rb +44 -0
- data/spec/ec2/metadata_spec.rb +14 -0
- data/spec/ec2/snapshot_spec.rb +39 -0
- data/spec/ec2/volume_spec.rb +47 -0
- data/spec/helpers/aws_mock.rb +49 -0
- data/spec/helpers/spec.rb +4 -22
- data/spec/logging_spec.rb +29 -4
- data/spec/output_spec.rb +30 -4
- data/spec/version_spec.rb +11 -0
- data/vgh.gemspec +1 -0
- metadata +41 -14
- data/conf/ec2-backup.config.yml.example +0 -12
- data/lib/vgh/extended_aws/extended_ec2/snapshot.rb +0 -87
- data/lib/vgh/extended_aws/extended_ec2/volume.rb +0 -66
- data/lib/vgh/extended_aws/extended_ec2.rb +0 -10
- data/lib/vgh/extended_aws.rb +0 -10
- data/spec/extended_aws/extended_ec2/metadata_spec.rb +0 -24
- data/spec/extended_aws/extended_ec2/snapshot_spec.rb +0 -48
- data/spec/extended_aws/extended_ec2/volume_spec.rb +0 -27
data/.travis.yml
CHANGED
data/CHANGELOG.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -8,12 +8,12 @@ A collection of custom scripts used on VladGh.com
|
|
8
8
|
== Instalation
|
9
9
|
|
10
10
|
Some system wide dependencies should be installed first:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
* ruby 1.8 or 1.9
|
12
|
+
* rubygems (if ruby 1.8)
|
13
|
+
* ruby-dev
|
14
|
+
* build-essential
|
15
|
+
* libxslt & libxslt-dev
|
16
|
+
* libxml2 & libxml2-dev
|
17
17
|
|
18
18
|
|
19
19
|
Add this line to your application's Gemfile:
|
@@ -31,26 +31,14 @@ Or install it yourself as:
|
|
31
31
|
|
32
32
|
== Configuration
|
33
33
|
|
34
|
-
This gem looks for the
|
35
|
-
|
34
|
+
This gem looks for the configuration file inside the following folders
|
35
|
+
* +/etc/vgh+
|
36
|
+
* +~/.vgh+
|
37
|
+
* +--confdir+ (specified in the command line options)
|
36
38
|
|
37
|
-
|
38
|
-
The main configuration file for this gem.
|
39
|
-
This file should include the AWS specific configuration.
|
40
|
-
Available values:
|
41
|
-
- +:access_key_id+ - [String] Your AWS credentials
|
42
|
-
- +:secret_access_key+ - [String] Your AWS credentials
|
43
|
-
- +:region+ - optional [String] Your current instance's region.
|
44
|
-
Ex: +'us-west-1'+
|
39
|
+
This gem checks if the file exists and if it is in a correct YAML format.
|
45
40
|
|
46
|
-
|
47
|
-
The application specific configuration (see
|
48
|
-
{file:README.rdoc#Applications Applications} below for a list of available
|
49
|
-
apps and values).
|
50
|
-
|
51
|
-
This gem checks if the files exists and if they are in a correct YAML format.
|
52
|
-
|
53
|
-
All files should have the following format (where the keys are symbols):
|
41
|
+
It should have the following format (where the keys are symbols):
|
54
42
|
# Comment
|
55
43
|
:key: 'value'
|
56
44
|
:string: 'string value'
|
@@ -63,11 +51,14 @@ All files should have the following format (where the keys are symbols):
|
|
63
51
|
-
|
64
52
|
:sub_key: 'sub value'
|
65
53
|
|
66
|
-
|
67
|
-
find were that is by specifying the +--gemdir+ command line option.
|
54
|
+
An example of the configuration file can be found in this gem's directory.
|
55
|
+
You can find were that is by specifying the +--gemdir+ command line option.
|
68
56
|
|
69
57
|
Ex: <tt>vgh --gemdir</tt>
|
70
58
|
|
59
|
+
Read the config.yml.example for a list of configuration options.
|
60
|
+
|
61
|
+
|
71
62
|
== Command line options
|
72
63
|
|
73
64
|
The following command line options are available:
|
@@ -75,8 +66,8 @@ The following command line options are available:
|
|
75
66
|
[+ApplicationName+] Specify the application you want to run. For a
|
76
67
|
list of available apps see
|
77
68
|
{file:README.rdoc#Applications Applications} below.
|
78
|
-
[
|
79
|
-
|
69
|
+
[<tt>--confdir=~/.vgh</tt>] Specify the desired directory in which
|
70
|
+
the configuration files reside.
|
80
71
|
[+-v+ <tt>--[no-]verbose</tt>] Specify whether to display messages on the
|
81
72
|
screen or not.
|
82
73
|
[+-l+ <tt>--[no-]logging</tt>] Specify whether to log messages or not.
|
@@ -116,28 +107,27 @@ The following command line options are available:
|
|
116
107
|
be postponed for as long as the device is suspended.
|
117
108
|
|
118
109
|
|
119
|
-
====
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
:fqdn: 'MyServer.Example.com'
|
110
|
+
==== Intended usage
|
111
|
+
# Cron Job:
|
112
|
+
0 */6 * * * vgh ec2-backup -l
|
113
|
+
|
114
|
+
=== Checkpoint
|
115
|
+
|
116
|
+
[/bin/vgh checkpoint]
|
117
|
+
|
118
|
+
==== Description
|
119
|
+
This app looks for volumes tagged with the 'CHECKPOINT' key attached to the
|
120
|
+
current instance, and creates snapshots for them.
|
121
|
+
It is intended to be used as a cron job on an AWS instance running
|
122
|
+
Ubuntu.
|
123
|
+
|
124
|
+
MySQL flushing and LVM suspending specified above in the EC2-Backup app, work
|
125
|
+
the same.
|
136
126
|
|
137
127
|
|
138
128
|
==== Intended usage
|
139
129
|
# Cron Job:
|
140
|
-
0 */6 * * * vgh
|
130
|
+
0 */6 * * * vgh checkpoint -l
|
141
131
|
|
142
132
|
|
143
133
|
== Contributing
|
data/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'bundler/gem_helper'
|
2
2
|
require 'rspec/core/rake_task'
|
3
3
|
require 'yard'
|
4
|
+
require 'reek/rake/task'
|
4
5
|
|
5
6
|
$LOAD_PATH << File.join(File.dirname(__FILE__), 'tasks')
|
6
7
|
Dir['tasks/**/*.rake'].each { |task| load task }
|
@@ -8,6 +9,12 @@ Dir['tasks/**/*.rake'].each { |task| load task }
|
|
8
9
|
RSpec::Core::RakeTask.new
|
9
10
|
Bundler::GemHelper.install_tasks
|
10
11
|
|
12
|
+
Reek::Rake::Task.new do |t|
|
13
|
+
t.fail_on_error = false
|
14
|
+
t.verbose = false
|
15
|
+
t.reek_opts = "--quiet"
|
16
|
+
end
|
17
|
+
|
11
18
|
task :default do
|
12
19
|
puts `rake -T`
|
13
20
|
end
|
data/conf/config.yml.example
CHANGED
@@ -1,9 +1,30 @@
|
|
1
|
-
#
|
1
|
+
# Configuration for the VGH gem
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
#####################
|
4
|
+
# AWS Configuration #
|
5
|
+
#####################
|
6
|
+
# (See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS.html#config-class_method
|
7
|
+
# for a full list of configuration options):
|
8
|
+
# (NOTE: It's recommended to use IAM roles and not put your credentials here:
|
9
|
+
# http://docs.aws.amazon.com/AWSSdkDocsRuby/latest/DeveloperGuide/ruby-dg-roles.html)
|
10
|
+
#
|
11
|
+
#:access_key_id: '1234'
|
12
|
+
#:secret_access_key: '4321'
|
13
|
+
#:ec2_endpoint: 'ec2.us-west-2.amazonaws.com'
|
14
|
+
#:auto_scaling_endpoint: 'autoscaling.us-west-2.amazonaws.com'
|
6
15
|
|
7
|
-
# AWS Region (optional). It defaults to 'us-east-1'
|
8
|
-
#:region: 'us-west-1'
|
9
16
|
|
17
|
+
###########################
|
18
|
+
# EC2-Backup app settings #
|
19
|
+
###########################
|
20
|
+
|
21
|
+
# Expiration period (defaults to 7 days)
|
22
|
+
#:expiration: 7 # Number of days to keep the snapshots
|
23
|
+
|
24
|
+
# MySQL Settings
|
25
|
+
#:mysql_user: 'dbadmin' # The MySQL user that can flush the tables
|
26
|
+
#:mysql_password: 'MyStrongPassword' # The password of the above MySQL user
|
27
|
+
|
28
|
+
# Remote settings
|
29
|
+
#:instance: 'i-12345678' # The id of the remote instance you want to backup
|
30
|
+
#:fqdn: 'server.example.com' # The fully qualified domain name of the server
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module VGH
|
2
|
+
module APPS
|
3
|
+
|
4
|
+
# == Description:
|
5
|
+
#
|
6
|
+
# See {file:README.rdoc#Checkpoint Checkpoint Section} in the README
|
7
|
+
# file.
|
8
|
+
#
|
9
|
+
# == Usage:
|
10
|
+
# checkpoint = APPS::Checkpoint.new
|
11
|
+
# checkpoint.run
|
12
|
+
#
|
13
|
+
class Checkpoint
|
14
|
+
|
15
|
+
# @return [Object] Volumes Class
|
16
|
+
attr_reader :volumes
|
17
|
+
|
18
|
+
# Initialize external classes
|
19
|
+
def initialize
|
20
|
+
@volumes ||= EC2::Volume.new
|
21
|
+
end
|
22
|
+
|
23
|
+
# Runs the checkpoint app logic
|
24
|
+
def run
|
25
|
+
|
26
|
+
System.lock
|
27
|
+
|
28
|
+
vols = volumes
|
29
|
+
vols.list_tagged('CHECKPOINT').map {|vid|
|
30
|
+
snap_and_tag(
|
31
|
+
vid,
|
32
|
+
"CHECKPOINT for #{vid}(#{vols.name_tag(vid)})",
|
33
|
+
{
|
34
|
+
'Name' => fqdn,
|
35
|
+
'CHECKPOINT' => "#{instance_id};#{vid}"
|
36
|
+
}
|
37
|
+
)
|
38
|
+
}
|
39
|
+
|
40
|
+
System.unlock
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end # class EC2_Backup
|
45
|
+
|
46
|
+
end # module APPS
|
47
|
+
end # module VGH
|
48
|
+
|
49
|
+
require 'vgh/output'
|
50
|
+
require 'vgh/configuration'
|
51
|
+
require 'vgh/system/lvm'
|
52
|
+
require 'vgh/system/mysql'
|
53
|
+
require 'vgh/ec2/volume'
|
54
|
+
require 'vgh/ec2/snapshot'
|
55
|
+
|
data/lib/vgh/apps/ec2_backup.rb
CHANGED
@@ -12,58 +12,33 @@ module APPS
|
|
12
12
|
#
|
13
13
|
class EC2_Backup
|
14
14
|
|
15
|
-
#
|
15
|
+
# @return [Object] Volumes Class
|
16
|
+
attr_reader :volumes
|
17
|
+
|
18
|
+
# Initialize external classes
|
16
19
|
def initialize
|
17
|
-
|
18
|
-
abort "ERROR: This app needs to be run as root!" unless is_root?
|
19
|
-
@mysql = System::MySQL.new
|
20
|
-
@lv = System::LV.new
|
21
|
-
@volume = Extended_AWS::Extended_EC2::Volume.new
|
22
|
-
@snapshot = Extended_AWS::Extended_EC2::Snapshot.new
|
20
|
+
@volumes ||= EC2::Volume.new
|
23
21
|
end
|
24
22
|
|
25
23
|
# Runs the ec2-backup app logic
|
26
24
|
def run
|
27
|
-
lock
|
28
|
-
|
29
|
-
begin
|
30
|
-
@volume.list.map {|id, info|
|
31
|
-
@snapshot.create(id, info[:tag])
|
32
|
-
}
|
33
|
-
rescue
|
34
|
-
message.fatal "Something went wrong in the snapshot creation process!"
|
35
|
-
end
|
36
|
-
|
37
|
-
unlock
|
38
25
|
|
39
|
-
|
40
|
-
end
|
26
|
+
System.lock
|
41
27
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
28
|
+
vols = volumes
|
29
|
+
vols.list.map {|vid|
|
30
|
+
snap_and_tag(
|
31
|
+
vid,
|
32
|
+
"Backup for #{vid}(#{vols.name_tag(vid)})",
|
33
|
+
{
|
34
|
+
'Name' => fqdn,
|
35
|
+
'BACKUP' => "#{instance_id};#{vid}"
|
36
|
+
}
|
37
|
+
)
|
38
|
+
}
|
49
39
|
|
50
|
-
|
51
|
-
def unlock
|
52
|
-
unless remotely?
|
53
|
-
@mysql.unlock
|
54
|
-
@lv.resume
|
55
|
-
end
|
56
|
-
end
|
40
|
+
System.unlock
|
57
41
|
|
58
|
-
# Checks if this script is run remotely.
|
59
|
-
# @return [Boolean]
|
60
|
-
def remotely?
|
61
|
-
cfg = app_config
|
62
|
-
if cfg[:instance] or cfg[:fqdn]
|
63
|
-
@remotely = true
|
64
|
-
else
|
65
|
-
@remotely = false
|
66
|
-
end
|
67
42
|
end
|
68
43
|
|
69
44
|
end # class EC2_Backup
|
@@ -72,8 +47,9 @@ end # module APPS
|
|
72
47
|
end # module VGH
|
73
48
|
|
74
49
|
require 'vgh/output'
|
50
|
+
require 'vgh/configuration'
|
75
51
|
require 'vgh/system/lvm'
|
76
52
|
require 'vgh/system/mysql'
|
77
|
-
require 'vgh/
|
78
|
-
require 'vgh/
|
53
|
+
require 'vgh/ec2/volume'
|
54
|
+
require 'vgh/ec2/snapshot'
|
79
55
|
|
data/lib/vgh/apps.rb
CHANGED
data/lib/vgh/cli.rb
CHANGED
@@ -14,12 +14,6 @@ module VGH
|
|
14
14
|
$app ||= cli[:app]
|
15
15
|
end
|
16
16
|
|
17
|
-
# Returns the configuration specified in the command line
|
18
|
-
# @return [String]
|
19
|
-
def cli_confdir
|
20
|
-
$cli_confdir ||= cli[:confdir]
|
21
|
-
end
|
22
|
-
|
23
17
|
# Returns verbosity
|
24
18
|
# @return [Boolean]
|
25
19
|
def verbose?
|
@@ -56,6 +50,7 @@ module VGH
|
|
56
50
|
@options[:app] = false
|
57
51
|
@options[:verbose] = false
|
58
52
|
@options[:logging] = false
|
53
|
+
@options[:confdir] = nil
|
59
54
|
end
|
60
55
|
|
61
56
|
# Collect options
|
@@ -115,9 +110,14 @@ module VGH
|
|
115
110
|
|
116
111
|
# Loads the configuration directory
|
117
112
|
def confdir
|
118
|
-
@optparse.on('
|
119
|
-
path = File.expand_path(
|
120
|
-
|
113
|
+
@optparse.on('--confdir=PATH', 'Configuration directory') do |config_dir|
|
114
|
+
path = File.expand_path(config_dir)
|
115
|
+
if File.directory?(path)
|
116
|
+
@options[:confdir] = path
|
117
|
+
else
|
118
|
+
puts "The configuration directory '#{config_dir}' does not exist!"
|
119
|
+
exit
|
120
|
+
end
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
data/lib/vgh/configuration.rb
CHANGED
@@ -5,40 +5,12 @@ require 'logger'
|
|
5
5
|
|
6
6
|
module VGH
|
7
7
|
|
8
|
-
#
|
9
|
-
# @return [Hash]
|
10
|
-
def parse_config
|
11
|
-
$parse_config ||= Configuration.new
|
12
|
-
end
|
13
|
-
|
14
|
-
# Returns a hash containing the main settings
|
8
|
+
# Global config method
|
15
9
|
# @return [Hash]
|
16
10
|
def config
|
17
|
-
$config ||=
|
18
|
-
end
|
19
|
-
|
20
|
-
# Returns a hash containing the app settings
|
21
|
-
# @return [Hash]
|
22
|
-
def app_config
|
23
|
-
$app_config ||= parse_config.app_config
|
11
|
+
$config ||= Configuration.new.config
|
24
12
|
end
|
25
13
|
|
26
|
-
# Returns a single merged hash with all configurations
|
27
|
-
# @return [Hash]
|
28
|
-
def global_config
|
29
|
-
$global_config ||= [config, app_config].inject(:merge)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Creates a global ec2 method (passing the specified region).
|
33
|
-
# The default region is us-east-1, so we overwrite it here.
|
34
|
-
def ec2
|
35
|
-
region = config[:region]
|
36
|
-
if region
|
37
|
-
$ec2 = AWS::EC2.new.regions[region]
|
38
|
-
else
|
39
|
-
$ec2 = AWS::EC2.new
|
40
|
-
end
|
41
|
-
end
|
42
14
|
|
43
15
|
# == Description:
|
44
16
|
#
|
@@ -48,81 +20,98 @@ module VGH
|
|
48
20
|
#
|
49
21
|
# == Usage:
|
50
22
|
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
# app_config = parse.app_config
|
23
|
+
# config = Configuration.new.config
|
24
|
+
# mysetting = config[:mysetting]
|
54
25
|
#
|
55
|
-
# pp main_config
|
56
|
-
# pp app_config
|
57
26
|
#
|
58
27
|
class Configuration
|
59
28
|
|
60
|
-
#
|
61
|
-
|
29
|
+
# Global configuration
|
30
|
+
# @return [Hash] The configuration hash
|
31
|
+
attr_reader :config
|
62
32
|
|
63
|
-
#
|
64
|
-
|
65
|
-
|
66
|
-
# Set defaults
|
33
|
+
# Parse the main configuration
|
34
|
+
# @return [Hash]
|
67
35
|
def initialize
|
68
|
-
|
69
|
-
@
|
70
|
-
|
36
|
+
message.info "Loading configuration..."
|
37
|
+
@config ||= validate(config_file)
|
38
|
+
aws_config
|
39
|
+
end
|
40
|
+
|
41
|
+
# The global configuration directory
|
42
|
+
# @return [String]
|
43
|
+
def global_config_dir
|
44
|
+
'/etc/vgh'
|
45
|
+
end
|
46
|
+
|
47
|
+
# The user configuration directory
|
48
|
+
# @return [String]
|
49
|
+
def user_config_dir
|
50
|
+
File.expand_path('~/.vgh')
|
71
51
|
end
|
72
52
|
|
73
53
|
# IF specified, use the confdir specified in the command line options
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
54
|
+
# @return [String]
|
55
|
+
def confdir
|
56
|
+
cli_confdir = cli[:confdir]
|
57
|
+
global = global_config_dir
|
58
|
+
if !cli_confdir.nil?
|
59
|
+
return cli_confdir
|
60
|
+
elsif File.directory?(global)
|
61
|
+
return global
|
78
62
|
else
|
79
|
-
return
|
63
|
+
return user_config_dir
|
80
64
|
end
|
81
65
|
end
|
82
66
|
|
67
|
+
# The main configuration file
|
68
|
+
# @return [String]
|
69
|
+
def config_file
|
70
|
+
"#{confdir}/config.yml"
|
71
|
+
end
|
72
|
+
|
83
73
|
# Returns error if the configuration is not right
|
84
|
-
|
85
|
-
|
86
|
-
|
74
|
+
# @return [Hash]
|
75
|
+
def validate(path)
|
76
|
+
if config_exists?(path) and config_correct?(path)
|
77
|
+
parse(path)
|
78
|
+
else
|
79
|
+
puts load_error(path)
|
87
80
|
exit 1
|
88
81
|
end
|
89
82
|
end
|
90
83
|
|
91
84
|
# Checks if the configuration file exists
|
85
|
+
# @return [Boolean]
|
92
86
|
def config_exists?(path)
|
93
87
|
File.exist?(path)
|
94
88
|
end
|
95
89
|
|
96
90
|
# Checks if the configuration is a valid YAML file
|
91
|
+
# @return [Boolean]
|
97
92
|
def config_correct?(path)
|
98
93
|
parse(path).kind_of?(Hash)
|
99
94
|
end
|
100
95
|
|
101
96
|
# Returns a parsed configuration
|
97
|
+
# @return [Hash]
|
102
98
|
def parse(path)
|
103
|
-
|
99
|
+
YAML.load(File.read(path))
|
104
100
|
end
|
105
101
|
|
106
|
-
#
|
107
|
-
def
|
108
|
-
|
109
|
-
|
110
|
-
@main_config = parse(@main)
|
111
|
-
AWS.config({
|
112
|
-
:access_key_id => @main_config[:access_key_id],
|
113
|
-
:secret_access_key => @main_config[:secret_access_key],
|
114
|
-
:logger => log,
|
115
|
-
:log_formatter => AWS::Core::LogFormatter.colored,
|
116
|
-
:max_retries => 2
|
117
|
-
})
|
118
|
-
return @main_config
|
102
|
+
# Configures AWS
|
103
|
+
def aws_config
|
104
|
+
AWS.config(config)
|
105
|
+
AWS.config(aws_logging)
|
119
106
|
end
|
120
107
|
|
121
|
-
#
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
108
|
+
# Implements our own Logging class
|
109
|
+
# @return [Hash]
|
110
|
+
def aws_logging
|
111
|
+
aws_logging ||= {
|
112
|
+
:logger => log,
|
113
|
+
:log_formatter => AWS::Core::LogFormatter.colored
|
114
|
+
}
|
126
115
|
end
|
127
116
|
|
128
117
|
# Returns the error message in case the configuration os not right
|
@@ -6,16 +6,16 @@ module VGH
|
|
6
6
|
# queries the API server for it.
|
7
7
|
# @return [String]
|
8
8
|
def instance_id
|
9
|
-
remote_instance =
|
9
|
+
remote_instance = config[:instance]
|
10
10
|
if remote_instance
|
11
11
|
$instance_id ||= remote_instance
|
12
12
|
else
|
13
|
-
$instance_id ||= VGH::
|
13
|
+
$instance_id ||= VGH::EC2::MetaData.new.instance_id
|
14
14
|
end
|
15
|
+
return $instance_id
|
15
16
|
end
|
16
17
|
|
17
|
-
module
|
18
|
-
module Extended_EC2
|
18
|
+
module EC2
|
19
19
|
|
20
20
|
# This class gathers metadata information about the current instance, used by
|
21
21
|
# the applications in this gem.
|
@@ -50,8 +50,7 @@ class MetaData
|
|
50
50
|
|
51
51
|
end
|
52
52
|
|
53
|
-
end # module
|
54
|
-
end # module Extended_AWS
|
53
|
+
end # module EC2
|
55
54
|
end # module VGH
|
56
55
|
|
57
56
|
require 'vgh/output'
|