awstool 0.0.2 → 0.1.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.
- 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
|