awstool 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +18 -9
- data/bin/awstool +11 -4
- data/examples/awstools.yaml +11 -5
- data/lib/awstool/instance.rb +16 -8
- data/lib/awstool/settings.rb +26 -8
- data/lib/awstool/version.rb +1 -1
- data/userdata/default.erb +18 -8
- metadata +2 -6
- data/bin/console +0 -14
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa7519114222d1de674841c22bee82fc62444d4e
|
4
|
+
data.tar.gz: 57ac99fc9beb9fbb41e576771d3ce9eba096addd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47e913f259f1c39c6ab791e1fa795e49f0c7cbb03c42e03dec5a58b2097d52616b3b3d2681b7448481681805550a1f15a9482561907c20486b79107ce5b41bc7
|
7
|
+
data.tar.gz: db8eaa00d531d0b330a32f894f00ec2aca07e74b274c1197e08d233eb274248ee3cae14d47a4e254a3dc5251376907e04af6842080112e3d701372c08e7e0c13
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,25 +1,34 @@
|
|
1
|
-
#
|
1
|
+
# Awstool
|
2
2
|
|
3
3
|
Tool for launching and configuring AWS EC2 instances.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
Not properly gemmed up yet. You'll need to clone and set RUBYLIB environment variable to clonepath/awstools/lib. Requires the fog gem and ruby >=1.9.3.
|
8
7
|
```bash
|
9
|
-
|
10
|
-
sudo apt-get install ruby-dev # For ubuntu/debian
|
11
|
-
gem install fog
|
8
|
+
gem install awstool
|
12
9
|
```
|
13
10
|
|
14
11
|
## Usage
|
15
12
|
|
16
13
|
Copy example/awstools.yaml to ~/.awstools.yaml. Fill it out to your liking.
|
17
14
|
```bash
|
18
|
-
|
19
|
-
./awstools hostname
|
15
|
+
awstool floop.example.com
|
20
16
|
```
|
21
|
-
This will launch and instance and create an A record with route53.
|
22
|
-
|
17
|
+
This will launch and instance and create an A record with route53.
|
18
|
+
You can split your settings files up and then merge them on the command line with the -o flag.
|
19
|
+
```bash
|
20
|
+
awstool -o ~/ubuntu-14.04.yaml,~/webserver.yaml floop.example.com
|
21
|
+
```
|
22
|
+
This will allow for different levels of templating. Particularly useful for setting puppet
|
23
|
+
options and security groups. Launch a bunch of instances off of the same configs like so.
|
24
|
+
```bash
|
25
|
+
awstool -o ~/ubuntu-14.04.yaml,~/webserver.yaml floop1.example.com floop2.example.com jb.example.com
|
26
|
+
# or
|
27
|
+
awstool -o ~/ubuntu-14.04.yaml,~/webserver.yaml floop{1..5}.example.com
|
28
|
+
```
|
29
|
+
When launching multiple instances the tool will choose a random subnet from the subnet-ids array unless
|
30
|
+
the -s flag or the 'subnet-id-index' option is set. It can also balance between the subnets with
|
31
|
+
'subnet_balance: true' in settings.
|
23
32
|
|
24
33
|
## Contributing
|
25
34
|
|
data/bin/awstool
CHANGED
@@ -2,10 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'awstool'
|
4
4
|
require 'pp'
|
5
|
-
require 'fog'
|
6
5
|
|
7
6
|
options = Awstool::Settings.get_options
|
7
|
+
pp options
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
options['hostnames'].each do |hostname|
|
10
|
+
if options['subnet_balance']
|
11
|
+
options['subnet-id-index'] = ( options['subnet-id-index'] + 1 ) % ( options['subnet-ids'].length - 1 )
|
12
|
+
end
|
13
|
+
options['tags']['Name'] = hostname
|
14
|
+
options['hostname'] = hostname
|
15
|
+
instance = Awstool::Instance.new(options)
|
16
|
+
instance.launch
|
17
|
+
instance.set_dns
|
18
|
+
end
|
data/examples/awstools.yaml
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
key-name: mykey
|
2
2
|
image-id: ami-foobar
|
3
|
-
subnet-
|
3
|
+
subnet-ids:
|
4
|
+
- subnet-foobar
|
5
|
+
- subnet-foobas
|
4
6
|
security-group-ids:
|
5
7
|
- sg-foobar
|
6
8
|
- sg-foobaz
|
@@ -11,7 +13,11 @@ region: us-east-1
|
|
11
13
|
instance-type: t2.medium
|
12
14
|
facts:
|
13
15
|
foo: bar
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
puppet_install:
|
17
|
+
package_manager: apt-get
|
18
|
+
repo_package: puppetlabs-release-pc1-trusty.deb
|
19
|
+
csr_attributes: longrandomstring
|
20
|
+
server: puppet.example.com
|
21
|
+
environment: aws
|
22
|
+
purge_dns: true
|
23
|
+
subnet_balance: true
|
data/lib/awstool/instance.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'erb'
|
2
|
+
require 'fog'
|
2
3
|
|
3
4
|
class Awstool::Instance
|
4
5
|
def initialize(options)
|
5
6
|
@options = options
|
6
7
|
@compute = Fog::Compute.new(
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
8
|
+
provider: 'AWS',
|
9
|
+
region: @options['region'],
|
10
|
+
aws_access_key_id: @options['access_key_id'],
|
11
|
+
aws_secret_access_key: @options['access_key'],
|
11
12
|
)
|
12
13
|
end
|
13
14
|
|
@@ -16,7 +17,7 @@ class Awstool::Instance
|
|
16
17
|
image_id: @options['image-id'],
|
17
18
|
flavor_id: @options['instance-type'],
|
18
19
|
security_group_ids: @options['security-group-ids'],
|
19
|
-
subnet_id: @options['subnet-id'],
|
20
|
+
subnet_id: @options['subnet-ids'][@options['subnet-id-index']],
|
20
21
|
key_name: @options['key-name'],
|
21
22
|
tags: @options['tags'],
|
22
23
|
user_data: ERB.new(File.read(@options['userdata'])).result
|
@@ -27,13 +28,20 @@ class Awstool::Instance
|
|
27
28
|
|
28
29
|
def set_dns
|
29
30
|
dns = Fog::DNS.new(
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
31
|
+
provider: 'AWS',
|
32
|
+
aws_access_key_id: @options['access_key_id'],
|
33
|
+
aws_secret_access_key: @options['access_key'],
|
33
34
|
)
|
34
35
|
|
35
36
|
zone = dns.zones.get(@options['dns-zone-id'])
|
36
37
|
|
38
|
+
if @options['purge_dns']
|
39
|
+
record = zone.records.find { |r| r.name == "#{@options['hostname']}." }
|
40
|
+
if record
|
41
|
+
record.destroy
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
37
45
|
@record = zone.records.create(
|
38
46
|
value: @instance.private_ip_address,
|
39
47
|
name: @options['hostname'],
|
data/lib/awstool/settings.rb
CHANGED
@@ -3,6 +3,7 @@ require 'psych'
|
|
3
3
|
|
4
4
|
class Awstool::Settings
|
5
5
|
@options = {}
|
6
|
+
@option_files = []
|
6
7
|
|
7
8
|
attr_reader :options
|
8
9
|
|
@@ -10,6 +11,9 @@ class Awstool::Settings
|
|
10
11
|
set_default
|
11
12
|
get_rc
|
12
13
|
get_flags
|
14
|
+
@option_files.each do |f|
|
15
|
+
@options.merge!(f)
|
16
|
+
end
|
13
17
|
@options
|
14
18
|
end
|
15
19
|
|
@@ -41,17 +45,29 @@ class Awstool::Settings
|
|
41
45
|
opts.on('--debug', 'Prints some extra output helpful for debugging') do
|
42
46
|
@options['debug'] = true
|
43
47
|
end
|
44
|
-
end.parse!
|
45
48
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
opts.on('-s', '--subnet-id-index INDEX', 'Select a subnet-id from you subnet-ids array.') do |index|
|
50
|
+
@options['subnet-id-index'] = index.to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
opts.on(
|
54
|
+
'-o',
|
55
|
+
'--options-file FILE1,FILE2',
|
56
|
+
Array,
|
57
|
+
'List option files that will merge and override settings in .awstool.yaml. Last entry takes precedence.' ) do |of|
|
58
|
+
of.each do |f|
|
59
|
+
@option_files << Psych.load_file(File.expand_path(f))
|
60
|
+
end
|
52
61
|
end
|
62
|
+
|
63
|
+
end.parse!
|
64
|
+
|
65
|
+
if ARGV.empty?
|
66
|
+
puts "hostname string is required."
|
67
|
+
exit 1
|
68
|
+
else
|
69
|
+
@options['hostnames'] = ARGV
|
53
70
|
end
|
54
|
-
@options['tags']['Name'] = @options['hostname']
|
55
71
|
end
|
56
72
|
|
57
73
|
def self.get_rc
|
@@ -59,11 +75,13 @@ class Awstool::Settings
|
|
59
75
|
if File.exist?(awsconf)
|
60
76
|
@options.merge!(Psych.load_file(awsconf))
|
61
77
|
end
|
78
|
+
@options['subnet-id-index'] = rand(@options['subnet-ids'].length - 1 )
|
62
79
|
end
|
63
80
|
|
64
81
|
def self.set_default
|
65
82
|
@options['userdata'] = File.expand_path('../userdata/default.erb')
|
66
83
|
@options['facts'] = {}
|
67
84
|
@options['tags']= {}
|
85
|
+
@options['hostnames'] = []
|
68
86
|
end
|
69
87
|
end
|
data/lib/awstool/version.rb
CHANGED
data/userdata/default.erb
CHANGED
@@ -12,12 +12,12 @@ package_upgrade: true
|
|
12
12
|
package_reboot_if_required: true
|
13
13
|
|
14
14
|
write_files:
|
15
|
-
<% if options['csr_attributes'] %>
|
15
|
+
<% if options['puppet_install']['csr_attributes'] %>
|
16
16
|
- content: |
|
17
17
|
---
|
18
18
|
custom_attributes:
|
19
|
-
1.2.840.113549.1.9.7: <%= options['csr_attributes'] %>
|
20
|
-
path: /etc/
|
19
|
+
1.2.840.113549.1.9.7: <%= options['puppet_install']['csr_attributes'] %>
|
20
|
+
path: /etc/puppetlabs/puppet/csr_attributes.yaml
|
21
21
|
permissions: 0600
|
22
22
|
<% end %>
|
23
23
|
<% options['facts'].each do |fact, value| %>
|
@@ -28,8 +28,18 @@ write_files:
|
|
28
28
|
permissions: '0644'
|
29
29
|
<% end %>
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
<% if options['puppet_install'] %>
|
32
|
+
runcmd:
|
33
|
+
<% if options['puppet_install']['package_manager'] == 'apt-get' %>
|
34
|
+
- wget https://apt.puppetlabs.com/<%= options['puppet_install']['repo_package'] %>
|
35
|
+
- dpkg -i /<%= options['puppet_install']['repo_package'] %>
|
36
|
+
- apt-get update
|
37
|
+
- apt-get -y install puppet-agent
|
38
|
+
<% elsif options['puppet_install']['package_manager'] == 'yum' %>
|
39
|
+
- rpm -ivh https://yum.puppetlabs.com/<%= options['puppet_install']['repo_package'] %>
|
40
|
+
- yum -y install puppet-agent
|
41
|
+
<% end %>
|
42
|
+
- /opt/puppetlabs/bin/puppet agent -t --waitforcert 5 --server <%= options['puppet_install']['server'] %> <% if options['puppet_install']['environment'] %> --environment <%= options['puppet_install']['environment'] %><% end %>
|
43
|
+
- /opt/puppetlabs/bin/puppet agent -t
|
44
|
+
<% else %>
|
45
|
+
<% end %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awstool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Burgess
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,8 +72,6 @@ email:
|
|
72
72
|
- nburgess@uchicago.edu
|
73
73
|
executables:
|
74
74
|
- awstool
|
75
|
-
- console
|
76
|
-
- setup
|
77
75
|
extensions: []
|
78
76
|
extra_rdoc_files: []
|
79
77
|
files:
|
@@ -85,8 +83,6 @@ files:
|
|
85
83
|
- Rakefile
|
86
84
|
- awstools.gemspec
|
87
85
|
- bin/awstool
|
88
|
-
- bin/console
|
89
|
-
- bin/setup
|
90
86
|
- examples/awstools.yaml
|
91
87
|
- lib/awstool.rb
|
92
88
|
- lib/awstool/instance.rb
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "awstool"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|