hashicorptools 0.3.0 → 1.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/Gemfile +12 -13
- data/VERSION +1 -1
- data/hashicorptools.gemspec +33 -45
- data/lib/hashicorptools.rb +0 -3
- data/lib/hashicorptools/auto_scaling_group.rb +3 -0
- data/lib/hashicorptools/code_deploy.rb +70 -34
- data/lib/hashicorptools/ec2_utilities.rb +7 -6
- data/lib/hashicorptools/host.rb +2 -0
- data/lib/hashicorptools/packer.rb +62 -32
- data/spec/ec2_utilities_spec.rb +14 -0
- metadata +41 -45
- data/spec/hashicorptools_spec.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6be604fe3116d183c2dde41307fbc77382ee5145279fc75a893360594fe63c99
|
4
|
+
data.tar.gz: 35227d95311d6653e9aad115973c65b19138957abee5930b09f5c3e279fdecdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '088072cf063c210b280e91c9345d3be10529d41fc4c70398c10a53fbf613877f3ec8dac13f606783124bcb19d102533bbad797663294e072080dd03924c2fcdb'
|
7
|
+
data.tar.gz: 47d602929569a5608fc557529381dea15a3e8e0fb079f1fa0dab4194e5415c8694a783d1a5ff936cc4a6566900af7794a3040009601b5f97b242a5aa95266452
|
data/Gemfile
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
gem 'aws-sdk', '~>
|
3
|
+
gem 'aws-sdk-autoscaling', '~> 1'
|
4
|
+
gem 'aws-sdk-codedeploy', '~> 1'
|
5
|
+
gem 'aws-sdk-ec2', '~> 1'
|
6
|
+
gem 'aws-sdk-elasticloadbalancing', '~> 1'
|
5
7
|
|
6
|
-
gem 'dynect_rest', '= 0.4.6'
|
7
|
-
|
8
|
-
gem 'aws-sdk-v1', '~> 1.67'
|
9
8
|
gem 'dotenv', '~> 2.2', '>= 2.2.1'
|
10
|
-
gem 'thor', '
|
11
|
-
gem 'activesupport', '
|
12
|
-
gem 'byebug', '
|
13
|
-
gem 'git', '
|
9
|
+
gem 'thor', '>= 0.20.0'
|
10
|
+
gem 'activesupport', '>= 5.1.4'
|
11
|
+
gem 'byebug', '>= 10.0.2'
|
12
|
+
gem 'git', '> 1.3'
|
14
13
|
|
15
14
|
group :development do
|
16
|
-
gem 'rspec', '
|
17
|
-
gem 'rdoc', '
|
18
|
-
gem 'bundler', '
|
19
|
-
gem 'juwelier',
|
15
|
+
gem 'rspec', '> 3.7'
|
16
|
+
gem 'rdoc', '> 3.12'
|
17
|
+
gem 'bundler', '> 2.0'
|
18
|
+
gem 'juwelier', git: 'https://github.com/flajann2/juwelier.git'
|
20
19
|
gem 'simplecov', '>= 0'
|
21
20
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
1.1.0
|
data/hashicorptools.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: hashicorptools
|
5
|
+
# stub: hashicorptools 1.1.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "hashicorptools".freeze
|
9
|
-
s.version = "
|
9
|
+
s.version = "1.1.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Nathan Woodhull".freeze]
|
14
|
-
s.date = "2020-
|
14
|
+
s.date = "2020-07-30"
|
15
15
|
s.description = "Wrappers for terraform and packer".freeze
|
16
16
|
s.email = "systems@controlshiftlabs.com".freeze
|
17
17
|
s.executables = ["ec2_host".freeze]
|
@@ -39,59 +39,47 @@ Gem::Specification.new do |s|
|
|
39
39
|
"lib/hashicorptools/packer.rb",
|
40
40
|
"lib/hashicorptools/update_launch_configuration.rb",
|
41
41
|
"lib/hashicorptools/variables.rb",
|
42
|
-
"spec/
|
42
|
+
"spec/ec2_utilities_spec.rb",
|
43
43
|
"spec/spec_helper.rb"
|
44
44
|
]
|
45
45
|
s.homepage = "http://github.com/woodhull/hashicorptools".freeze
|
46
46
|
s.licenses = ["MIT".freeze]
|
47
|
-
s.rubygems_version = "3.
|
47
|
+
s.rubygems_version = "3.1.2".freeze
|
48
48
|
s.summary = "Wrappers for terraform and packer".freeze
|
49
49
|
|
50
50
|
if s.respond_to? :specification_version then
|
51
51
|
s.specification_version = 4
|
52
|
+
end
|
52
53
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
|
69
|
-
s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
|
70
|
-
s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
|
71
|
-
s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
72
|
-
s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
|
73
|
-
s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
|
74
|
-
s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
|
75
|
-
s.add_dependency(%q<git>.freeze, ["~> 1.3"])
|
76
|
-
s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
|
77
|
-
s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
78
|
-
s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
|
79
|
-
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
|
80
|
-
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
81
|
-
end
|
54
|
+
if s.respond_to? :add_runtime_dependency then
|
55
|
+
s.add_runtime_dependency(%q<aws-sdk-autoscaling>.freeze, ["~> 1"])
|
56
|
+
s.add_runtime_dependency(%q<aws-sdk-codedeploy>.freeze, ["~> 1"])
|
57
|
+
s.add_runtime_dependency(%q<aws-sdk-ec2>.freeze, ["~> 1"])
|
58
|
+
s.add_runtime_dependency(%q<aws-sdk-elasticloadbalancing>.freeze, ["~> 1"])
|
59
|
+
s.add_runtime_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
60
|
+
s.add_runtime_dependency(%q<thor>.freeze, [">= 0.20.0"])
|
61
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 5.1.4"])
|
62
|
+
s.add_runtime_dependency(%q<byebug>.freeze, [">= 10.0.2"])
|
63
|
+
s.add_runtime_dependency(%q<git>.freeze, ["> 1.3"])
|
64
|
+
s.add_development_dependency(%q<rspec>.freeze, ["> 3.7"])
|
65
|
+
s.add_development_dependency(%q<rdoc>.freeze, ["> 3.12"])
|
66
|
+
s.add_development_dependency(%q<bundler>.freeze, ["> 2.0"])
|
67
|
+
s.add_development_dependency(%q<juwelier>.freeze, [">= 0"])
|
68
|
+
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
82
69
|
else
|
83
|
-
s.add_dependency(%q<aws-sdk>.freeze, ["~>
|
84
|
-
s.add_dependency(%q<
|
85
|
-
s.add_dependency(%q<aws-sdk-
|
70
|
+
s.add_dependency(%q<aws-sdk-autoscaling>.freeze, ["~> 1"])
|
71
|
+
s.add_dependency(%q<aws-sdk-codedeploy>.freeze, ["~> 1"])
|
72
|
+
s.add_dependency(%q<aws-sdk-ec2>.freeze, ["~> 1"])
|
73
|
+
s.add_dependency(%q<aws-sdk-elasticloadbalancing>.freeze, ["~> 1"])
|
86
74
|
s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
87
|
-
s.add_dependency(%q<thor>.freeze, ["
|
88
|
-
s.add_dependency(%q<activesupport>.freeze, ["
|
89
|
-
s.add_dependency(%q<byebug>.freeze, ["
|
90
|
-
s.add_dependency(%q<git>.freeze, ["
|
91
|
-
s.add_dependency(%q<rspec>.freeze, ["
|
92
|
-
s.add_dependency(%q<rdoc>.freeze, ["
|
93
|
-
s.add_dependency(%q<bundler>.freeze, ["
|
94
|
-
s.add_dependency(%q<juwelier>.freeze, ["
|
75
|
+
s.add_dependency(%q<thor>.freeze, [">= 0.20.0"])
|
76
|
+
s.add_dependency(%q<activesupport>.freeze, [">= 5.1.4"])
|
77
|
+
s.add_dependency(%q<byebug>.freeze, [">= 10.0.2"])
|
78
|
+
s.add_dependency(%q<git>.freeze, ["> 1.3"])
|
79
|
+
s.add_dependency(%q<rspec>.freeze, ["> 3.7"])
|
80
|
+
s.add_dependency(%q<rdoc>.freeze, ["> 3.12"])
|
81
|
+
s.add_dependency(%q<bundler>.freeze, ["> 2.0"])
|
82
|
+
s.add_dependency(%q<juwelier>.freeze, [">= 0"])
|
95
83
|
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
96
84
|
end
|
97
85
|
end
|
data/lib/hashicorptools.rb
CHANGED
@@ -1,68 +1,104 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'aws-sdk'
|
3
|
+
require 'aws-sdk-codedeploy'
|
4
4
|
require 'dotenv'
|
5
5
|
require 'git'
|
6
6
|
require 'logger'
|
7
7
|
require 'thor'
|
8
8
|
|
9
9
|
module Hashicorptools
|
10
|
+
class RegionDeployment
|
11
|
+
attr_accessor :aws_region, :environment
|
12
|
+
|
13
|
+
def initialize(aws_region:, environment:)
|
14
|
+
@aws_region = aws_region
|
15
|
+
@environment = environment
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_deployment(commit_id, commit_message)
|
19
|
+
client = Aws::CodeDeploy::Client.new(region: aws_region)
|
20
|
+
response = client.create_deployment({
|
21
|
+
application_name: application_name,
|
22
|
+
deployment_group_name: "#{application_name}-#{@environment}",
|
23
|
+
revision: {
|
24
|
+
revision_type: 'GitHub',
|
25
|
+
git_hub_location: {
|
26
|
+
repository: "controlshift/#{application_name}",
|
27
|
+
commit_id: commit_id
|
28
|
+
}
|
29
|
+
},
|
30
|
+
description: (commit_message || "commit #{commit_id}").slice(0,99)
|
31
|
+
})
|
32
|
+
output "created deployment #{response.deployment_id}"
|
33
|
+
output "https://console.aws.amazon.com/codedeploy/home?region=#{aws_region}#/deployments/#{response.deployment_id}"
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def application_name
|
39
|
+
raise "implement me"
|
40
|
+
end
|
41
|
+
|
42
|
+
def output(text)
|
43
|
+
puts "[#{aws_region}] #{text}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
10
47
|
class CodeDeploy < Thor
|
48
|
+
AWS_REGION_US_EAST_1 = 'us-east-1'
|
11
49
|
|
12
50
|
desc 'deploy', 'deploy latest code to environment'
|
13
|
-
option :environment, :
|
51
|
+
option :environment, required: true
|
14
52
|
option :branch
|
15
|
-
option :
|
53
|
+
option :aws_regions, type: :array
|
16
54
|
option :commit
|
17
55
|
def deploy
|
18
56
|
g = Git.open('..')
|
19
57
|
|
20
|
-
#
|
21
|
-
|
22
|
-
# Currently, `agra` is using `master` while other apps are using `main`.
|
23
|
-
# and we are unable to detect what the default branch is
|
24
|
-
# via the git client here.
|
25
|
-
if options[:commit].nil? && options[:branch].nil?
|
26
|
-
raise 'You must supply either commit or branch to deploy'
|
27
|
-
end
|
58
|
+
# We set defaults (depending on environment) for aws_regions if not passed in
|
59
|
+
aws_regions = options[:aws_regions] || default_regions
|
28
60
|
|
29
61
|
commit = if options[:commit].present?
|
30
62
|
g.gcommit(options[:commit])
|
31
63
|
else
|
32
|
-
|
64
|
+
branch = options[:branch].nil? ? :main : options[:branch].to_sym
|
65
|
+
g.checkout(branch)
|
33
66
|
g.log.first
|
34
67
|
end
|
35
68
|
|
69
|
+
puts "Deploying to environment #{options[:environment]} - regions: #{aws_regions.join(', ')}
|
70
|
+
commit: #{commit.sha}
|
71
|
+
message: #{commit.message}"
|
72
|
+
|
73
|
+
puts "Deploying for regions: #{aws_regions}"
|
36
74
|
|
37
|
-
|
75
|
+
threads = []
|
76
|
+
aws_regions.each_slice(2) do |aws_regions_batch|
|
77
|
+
puts "Deploying for batch of regions: #{aws_regions_batch}"
|
78
|
+
aws_regions_batch.each do |aws_region|
|
79
|
+
thread = Thread.new{ region_deployment(aws_region).create_deployment(commit.sha, commit.message) }
|
80
|
+
threads.push(thread)
|
81
|
+
end
|
38
82
|
|
39
|
-
|
83
|
+
threads.each_with_index do |thread, index|
|
84
|
+
begin
|
85
|
+
thread.join
|
86
|
+
rescue Exception => e
|
87
|
+
# Don't quit whole program on exception in thread, just print exception and exit thread
|
88
|
+
puts "[#{aws_regions[index]}] EXCEPTION: #{e}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
40
92
|
end
|
41
93
|
|
42
94
|
private
|
43
95
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
client = Aws::CodeDeploy::Client.new(region: options[:aws_region])
|
48
|
-
response = client.create_deployment({
|
49
|
-
application_name: application_name,
|
50
|
-
deployment_group_name: "#{application_name}-#{options[:environment]}",
|
51
|
-
revision: {
|
52
|
-
revision_type: 'GitHub',
|
53
|
-
git_hub_location: {
|
54
|
-
repository: "controlshift/#{application_name}",
|
55
|
-
commit_id: commit_id
|
56
|
-
}
|
57
|
-
},
|
58
|
-
description: (commit_message || "commit #{commit_id}").slice(0,99)
|
59
|
-
})
|
60
|
-
puts "created deployment #{response.deployment_id}"
|
61
|
-
puts "https://console.aws.amazon.com/codedeploy/home?region=#{options[:aws_region]}#/deployments/#{response.deployment_id}"
|
96
|
+
def region_deployment(aws_region)
|
97
|
+
RegionDeployment.new(aws_region: aws_region, environment: options[:environment])
|
62
98
|
end
|
63
99
|
|
64
|
-
def
|
65
|
-
|
100
|
+
def default_regions
|
101
|
+
[AWS_REGION_US_EAST_1]
|
66
102
|
end
|
67
103
|
end
|
68
104
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'aws-sdk-ec2'
|
2
|
+
|
1
3
|
module Hashicorptools
|
2
4
|
module Ec2Utilities
|
3
5
|
def current_ami(tag = tag_name)
|
@@ -5,7 +7,8 @@ module Hashicorptools
|
|
5
7
|
end
|
6
8
|
|
7
9
|
def amis(tag = tag_name)
|
8
|
-
|
10
|
+
images = ec2.describe_images({owners: ['self'], filters: [{name: 'tag:Name', values: [tag]}]}).images
|
11
|
+
sort_by_created_at(images)
|
9
12
|
end
|
10
13
|
|
11
14
|
def ec2
|
@@ -17,17 +20,15 @@ module Hashicorptools
|
|
17
20
|
'us-east-1'
|
18
21
|
end
|
19
22
|
|
20
|
-
@_ec2 =
|
23
|
+
@_ec2 = Aws::EC2::Client.new(region: reg)
|
21
24
|
end
|
22
25
|
|
23
26
|
def vpc_with_name(name)
|
24
|
-
|
25
|
-
vpcs.first
|
27
|
+
ec2.describe_vpcs({filters: [{name: 'tag:Name', values: [name]}]}).vpcs.first
|
26
28
|
end
|
27
29
|
|
28
30
|
def internet_gateway_for_vpc(vpc_id)
|
29
|
-
|
30
|
-
igs.first
|
31
|
+
ec2.describe_internet_gateways({filters: [{name: 'attachment.vpc-id', values: [vpc_id]}]}).internet_gateways.first
|
31
32
|
end
|
32
33
|
|
33
34
|
def sort_by_created_at(collection)
|
data/lib/hashicorptools/host.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'aws-sdk-autoscaling'
|
2
|
+
require 'aws-sdk-ec2'
|
3
|
+
|
1
4
|
module Hashicorptools
|
2
5
|
NUMBER_OF_AMIS_TO_KEEP = 2
|
3
6
|
|
@@ -33,7 +36,7 @@ module Hashicorptools
|
|
33
36
|
|
34
37
|
desc "list", "list all available amis"
|
35
38
|
def list
|
36
|
-
|
39
|
+
amis_in_region(region).each do |ami|
|
37
40
|
puts ami.image_id
|
38
41
|
end
|
39
42
|
end
|
@@ -45,7 +48,7 @@ module Hashicorptools
|
|
45
48
|
|
46
49
|
desc "clean_snapshots", "clean obsolete EBS snapshots not associated with any AMI"
|
47
50
|
def clean_snapshots
|
48
|
-
snapshots = ec2.
|
51
|
+
snapshots = ec2.describe_snapshots({owner_ids: ['self']}).snapshots
|
49
52
|
snapshots.each do |snapshot|
|
50
53
|
match = snapshot.description.match(/Created by CreateImage\(.+\) for (ami-[0-9a-f]+) from vol-.+/)
|
51
54
|
if match.nil?
|
@@ -54,25 +57,28 @@ module Hashicorptools
|
|
54
57
|
end
|
55
58
|
|
56
59
|
ami_id = match[1]
|
57
|
-
unless
|
58
|
-
puts "Removing obsolete snapshot #{snapshot.
|
59
|
-
|
60
|
-
snapshot.delete
|
60
|
+
unless Aws::EC2::Image.new(ami_id, region: region).exists?
|
61
|
+
puts "Removing obsolete snapshot #{snapshot.snapshot_id} - #{snapshot.description}"
|
62
|
+
ec2.delete_snapshot({snapshot_id: snapshot.snapshot_id})
|
61
63
|
end
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
65
67
|
desc "boot", "start up an instance of the latest version of AMI"
|
66
68
|
def boot
|
67
|
-
run_instances_resp = ec2.run_instances(
|
69
|
+
run_instances_resp = ec2.run_instances({
|
70
|
+
image_id: current_ami('base-image').image_id,
|
68
71
|
min_count: 1,
|
69
72
|
max_count: 1,
|
70
|
-
instance_type: "t2.micro"
|
73
|
+
instance_type: "t2.micro"
|
74
|
+
})
|
71
75
|
|
72
|
-
ec2.create_tags(
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
+
ec2.create_tags({
|
77
|
+
resources: run_instances_resp.instances.collect(&:instance_id),
|
78
|
+
tags: [ {key: 'Name', value: "packer test boot #{tag_name}"},
|
79
|
+
{key: 'environment', value: 'packer-development'},
|
80
|
+
{key: 'temporary', value: 'kill me'}]
|
81
|
+
})
|
76
82
|
|
77
83
|
require 'byebug'
|
78
84
|
byebug
|
@@ -106,7 +112,7 @@ module Hashicorptools
|
|
106
112
|
end
|
107
113
|
|
108
114
|
def ami_building_subnet_id
|
109
|
-
ec2.
|
115
|
+
ec2.describe_subnets({filters: [{name: "vpc-id", values: [ami_building_vpc_id]}]}).subnets.first.subnet_id
|
110
116
|
end
|
111
117
|
|
112
118
|
def format_variable(key, value)
|
@@ -129,39 +135,52 @@ module Hashicorptools
|
|
129
135
|
'us-east-1'
|
130
136
|
end
|
131
137
|
|
132
|
-
def auto_scaling
|
133
|
-
@auto_scaling ||= Aws::AutoScaling::Client.new(region:
|
138
|
+
def auto_scaling(client_region=region)
|
139
|
+
@auto_scaling ||= Aws::AutoScaling::Client.new(region: client_region)
|
134
140
|
end
|
135
141
|
|
136
|
-
def
|
137
|
-
@
|
142
|
+
def regional_ec2_client(client_region=region)
|
143
|
+
@_regional_ec2_clients = {} if @_regional_ec2_clients.nil?
|
144
|
+
@_regional_ec2_clients[client_region] ||= Aws::EC2::Client.new(region: client_region)
|
138
145
|
end
|
139
146
|
|
140
|
-
def amis_in_use
|
141
|
-
launch_configs = auto_scaling.describe_launch_configurations
|
147
|
+
def amis_in_use(client_region)
|
148
|
+
launch_configs = auto_scaling(client_region).describe_launch_configurations
|
142
149
|
image_ids = launch_configs.data['launch_configurations'].collect{|lc| lc.image_id}.flatten
|
143
150
|
|
144
|
-
ec2_reservations =
|
151
|
+
ec2_reservations = regional_ec2_client(client_region).describe_instances
|
145
152
|
image_ids << ec2_reservations.reservations.collect{|res| res.instances.collect{|r| r.image_id}}.flatten
|
146
153
|
image_ids.flatten
|
147
154
|
end
|
148
155
|
|
156
|
+
def ami_regions
|
157
|
+
['us-east-1', 'eu-central-1']
|
158
|
+
end
|
159
|
+
|
149
160
|
def clean_amis
|
150
|
-
|
151
|
-
|
152
|
-
|
161
|
+
ami_regions.each do |ami_region|
|
162
|
+
clean_amis_for_region(ami_region)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def clean_amis_for_region(region_to_clean)
|
167
|
+
ami_ids = amis_in_region(region_to_clean).collect{|a| a.image_id}
|
168
|
+
ami_ids_to_remove = ami_ids - amis_in_use(region_to_clean)
|
169
|
+
potential_amis_to_remove = amis_in_region(region_to_clean)
|
153
170
|
potential_amis_to_remove.keep_if {|a| ami_ids_to_remove.include?(a.image_id) }
|
154
171
|
|
155
172
|
if potential_amis_to_remove.size > NUMBER_OF_AMIS_TO_KEEP
|
156
173
|
amis_to_remove = potential_amis_to_remove[NUMBER_OF_AMIS_TO_KEEP..-1]
|
157
174
|
amis_to_keep = potential_amis_to_remove[0..(NUMBER_OF_AMIS_TO_KEEP-1)]
|
158
175
|
|
159
|
-
puts "Deregistering old AMIs..."
|
176
|
+
puts "Deregistering old AMIs in #{region_to_clean}..."
|
160
177
|
amis_to_remove.each do |ami|
|
161
178
|
ebs_mappings = ami.block_device_mappings
|
162
179
|
puts "Deregistering #{ami.image_id}"
|
163
|
-
|
164
|
-
|
180
|
+
regional_ec2_client(region_to_clean).deregister_image({
|
181
|
+
image_id: ami.image_id
|
182
|
+
})
|
183
|
+
delete_ami_snapshots(ebs_mappings, snapshot_region: region_to_clean)
|
165
184
|
end
|
166
185
|
|
167
186
|
puts "Currently active AMIs..."
|
@@ -169,15 +188,26 @@ module Hashicorptools
|
|
169
188
|
puts ami.image_id
|
170
189
|
end
|
171
190
|
else
|
172
|
-
puts "no AMIs to clean."
|
191
|
+
puts "no AMIs to clean in #{region_to_clean}."
|
173
192
|
end
|
174
193
|
end
|
175
194
|
|
176
|
-
def
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
195
|
+
def amis_in_region(ami_region)
|
196
|
+
images = regional_ec2_client(ami_region).describe_images({
|
197
|
+
owners: ['self'],
|
198
|
+
filters: [{name: 'tag:Name', values: [tag_name]}]
|
199
|
+
}).images
|
200
|
+
sort_by_created_at(images)
|
201
|
+
end
|
202
|
+
|
203
|
+
def delete_ami_snapshots(ebs_mappings, snapshot_region:)
|
204
|
+
ec2_client = regional_ec2_client(snapshot_region)
|
205
|
+
|
206
|
+
ebs_mappings.each do |ebs_mapping|
|
207
|
+
unless ebs_mapping.ebs.nil?
|
208
|
+
puts "Deleting snapshot #{ebs_mapping.ebs.snapshot_id}"
|
209
|
+
ec2_client.delete_snapshot({snapshot_id: ebs_mapping.ebs.snapshot_id})
|
210
|
+
end
|
181
211
|
end
|
182
212
|
end
|
183
213
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Hashicorptools::Ec2Utilities, type: :helper do
|
4
|
+
let(:including_class) { Class.new { include Hashicorptools::Ec2Utilities } }
|
5
|
+
|
6
|
+
subject { including_class.new }
|
7
|
+
|
8
|
+
describe '#ec2' do
|
9
|
+
it 'should return a client' do
|
10
|
+
client = subject.ec2
|
11
|
+
expect(client).to be_a Aws::EC2::Client
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,57 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashicorptools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Woodhull
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: aws-sdk
|
14
|
+
name: aws-sdk-autoscaling
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: aws-sdk-codedeploy
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: aws-sdk-
|
42
|
+
name: aws-sdk-ec2
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1
|
47
|
+
version: '1'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1
|
54
|
+
version: '1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: aws-sdk-elasticloadbalancing
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: dotenv
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,23 +90,20 @@ dependencies:
|
|
76
90
|
name: thor
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
78
92
|
requirements:
|
79
|
-
- -
|
93
|
+
- - ">="
|
80
94
|
- !ruby/object:Gem::Version
|
81
95
|
version: 0.20.0
|
82
96
|
type: :runtime
|
83
97
|
prerelease: false
|
84
98
|
version_requirements: !ruby/object:Gem::Requirement
|
85
99
|
requirements:
|
86
|
-
- -
|
100
|
+
- - ">="
|
87
101
|
- !ruby/object:Gem::Version
|
88
102
|
version: 0.20.0
|
89
103
|
- !ruby/object:Gem::Dependency
|
90
104
|
name: activesupport
|
91
105
|
requirement: !ruby/object:Gem::Requirement
|
92
106
|
requirements:
|
93
|
-
- - "~>"
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '5.1'
|
96
107
|
- - ">="
|
97
108
|
- !ruby/object:Gem::Version
|
98
109
|
version: 5.1.4
|
@@ -100,9 +111,6 @@ dependencies:
|
|
100
111
|
prerelease: false
|
101
112
|
version_requirements: !ruby/object:Gem::Requirement
|
102
113
|
requirements:
|
103
|
-
- - "~>"
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '5.1'
|
106
114
|
- - ">="
|
107
115
|
- !ruby/object:Gem::Version
|
108
116
|
version: 5.1.4
|
@@ -110,9 +118,6 @@ dependencies:
|
|
110
118
|
name: byebug
|
111
119
|
requirement: !ruby/object:Gem::Requirement
|
112
120
|
requirements:
|
113
|
-
- - "~>"
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: '10.0'
|
116
121
|
- - ">="
|
117
122
|
- !ruby/object:Gem::Version
|
118
123
|
version: 10.0.2
|
@@ -120,9 +125,6 @@ dependencies:
|
|
120
125
|
prerelease: false
|
121
126
|
version_requirements: !ruby/object:Gem::Requirement
|
122
127
|
requirements:
|
123
|
-
- - "~>"
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '10.0'
|
126
128
|
- - ">="
|
127
129
|
- !ruby/object:Gem::Version
|
128
130
|
version: 10.0.2
|
@@ -130,78 +132,72 @@ dependencies:
|
|
130
132
|
name: git
|
131
133
|
requirement: !ruby/object:Gem::Requirement
|
132
134
|
requirements:
|
133
|
-
- - "
|
135
|
+
- - ">"
|
134
136
|
- !ruby/object:Gem::Version
|
135
137
|
version: '1.3'
|
136
138
|
type: :runtime
|
137
139
|
prerelease: false
|
138
140
|
version_requirements: !ruby/object:Gem::Requirement
|
139
141
|
requirements:
|
140
|
-
- - "
|
142
|
+
- - ">"
|
141
143
|
- !ruby/object:Gem::Version
|
142
144
|
version: '1.3'
|
143
145
|
- !ruby/object:Gem::Dependency
|
144
146
|
name: rspec
|
145
147
|
requirement: !ruby/object:Gem::Requirement
|
146
148
|
requirements:
|
147
|
-
- - "
|
149
|
+
- - ">"
|
148
150
|
- !ruby/object:Gem::Version
|
149
151
|
version: '3.7'
|
150
152
|
type: :development
|
151
153
|
prerelease: false
|
152
154
|
version_requirements: !ruby/object:Gem::Requirement
|
153
155
|
requirements:
|
154
|
-
- - "
|
156
|
+
- - ">"
|
155
157
|
- !ruby/object:Gem::Version
|
156
158
|
version: '3.7'
|
157
159
|
- !ruby/object:Gem::Dependency
|
158
160
|
name: rdoc
|
159
161
|
requirement: !ruby/object:Gem::Requirement
|
160
162
|
requirements:
|
161
|
-
- - "
|
163
|
+
- - ">"
|
162
164
|
- !ruby/object:Gem::Version
|
163
165
|
version: '3.12'
|
164
166
|
type: :development
|
165
167
|
prerelease: false
|
166
168
|
version_requirements: !ruby/object:Gem::Requirement
|
167
169
|
requirements:
|
168
|
-
- - "
|
170
|
+
- - ">"
|
169
171
|
- !ruby/object:Gem::Version
|
170
172
|
version: '3.12'
|
171
173
|
- !ruby/object:Gem::Dependency
|
172
174
|
name: bundler
|
173
175
|
requirement: !ruby/object:Gem::Requirement
|
174
176
|
requirements:
|
175
|
-
- - "
|
177
|
+
- - ">"
|
176
178
|
- !ruby/object:Gem::Version
|
177
179
|
version: '2.0'
|
178
180
|
type: :development
|
179
181
|
prerelease: false
|
180
182
|
version_requirements: !ruby/object:Gem::Requirement
|
181
183
|
requirements:
|
182
|
-
- - "
|
184
|
+
- - ">"
|
183
185
|
- !ruby/object:Gem::Version
|
184
186
|
version: '2.0'
|
185
187
|
- !ruby/object:Gem::Dependency
|
186
188
|
name: juwelier
|
187
189
|
requirement: !ruby/object:Gem::Requirement
|
188
190
|
requirements:
|
189
|
-
- - "~>"
|
190
|
-
- !ruby/object:Gem::Version
|
191
|
-
version: '2.4'
|
192
191
|
- - ">="
|
193
192
|
- !ruby/object:Gem::Version
|
194
|
-
version:
|
193
|
+
version: '0'
|
195
194
|
type: :development
|
196
195
|
prerelease: false
|
197
196
|
version_requirements: !ruby/object:Gem::Requirement
|
198
197
|
requirements:
|
199
|
-
- - "~>"
|
200
|
-
- !ruby/object:Gem::Version
|
201
|
-
version: '2.4'
|
202
198
|
- - ">="
|
203
199
|
- !ruby/object:Gem::Version
|
204
|
-
version:
|
200
|
+
version: '0'
|
205
201
|
- !ruby/object:Gem::Dependency
|
206
202
|
name: simplecov
|
207
203
|
requirement: !ruby/object:Gem::Requirement
|
@@ -244,7 +240,7 @@ files:
|
|
244
240
|
- lib/hashicorptools/packer.rb
|
245
241
|
- lib/hashicorptools/update_launch_configuration.rb
|
246
242
|
- lib/hashicorptools/variables.rb
|
247
|
-
- spec/
|
243
|
+
- spec/ec2_utilities_spec.rb
|
248
244
|
- spec/spec_helper.rb
|
249
245
|
homepage: http://github.com/woodhull/hashicorptools
|
250
246
|
licenses:
|
@@ -265,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
265
261
|
- !ruby/object:Gem::Version
|
266
262
|
version: '0'
|
267
263
|
requirements: []
|
268
|
-
rubygems_version: 3.
|
264
|
+
rubygems_version: 3.1.2
|
269
265
|
signing_key:
|
270
266
|
specification_version: 4
|
271
267
|
summary: Wrappers for terraform and packer
|