hashicorptools 0.5.0 → 2.0.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/.github/workflows/ci.yml +14 -0
- data/.ruby-version +1 -1
- data/Gemfile +12 -13
- data/README.md +2 -0
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/hashicorptools.gemspec +32 -30
- data/lib/hashicorptools/auto_scaling_group.rb +10 -5
- data/lib/hashicorptools/code_deploy.rb +16 -5
- data/lib/hashicorptools/ec2_utilities.rb +7 -6
- data/lib/hashicorptools/host.rb +2 -0
- data/lib/hashicorptools/packer.rb +37 -23
- data/lib/hashicorptools.rb +0 -3
- data/spec/ec2_utilities_spec.rb +14 -0
- metadata +46 -47
- data/.travis.yml +0 -7
- 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: 246f2fed394c2713cc6950a0b1b6b05dd3ee85a010dee0af5f3d8a5f56f8c820
|
|
4
|
+
data.tar.gz: 799d6e3a0afacf388fad6f8633d081d6934f5b9937ad98e4fd150524dcf264cf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 48a77cc78797da4c0fcd46d277e30a910c40a7bd7130287cef2e4411375f02b0ebea2eafba7e7e3f06e43c4aa1e003ca380165897ce49d2bbcbf63d5734cec35
|
|
7
|
+
data.tar.gz: f2dd867948a60764a3359d30ac31172b03af77f27904a7839be034f92d958bcdc42c8301b2664772ad4d5105d3c5b87314d1f3c633ac99e17ad7c6036119ffd9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on: [push]
|
|
3
|
+
|
|
4
|
+
jobs:
|
|
5
|
+
test:
|
|
6
|
+
runs-on: ubuntu-latest
|
|
7
|
+
steps:
|
|
8
|
+
- uses: actions/checkout@v2
|
|
9
|
+
- uses: ruby/setup-ruby@477b21f02be01bcb8030d50f37cfec92bfa615b6
|
|
10
|
+
with:
|
|
11
|
+
ruby-version: 2.7
|
|
12
|
+
bundler-cache: true
|
|
13
|
+
- run: bundle install
|
|
14
|
+
- run: bundle exec rspec
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby-2.
|
|
1
|
+
ruby-2.7.4
|
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/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# hashicorptools
|
|
2
2
|
a set of ruby utilities for interacting with and wrapping packer, terraform and amazon web services.
|
|
3
3
|
|
|
4
|
+

|
|
5
|
+
|
|
4
6
|
## ec2_host
|
|
5
7
|
|
|
6
8
|
Allows quick lookup and ssh to machines by role and environment. Queries for instances by AWS tags.
|
data/Rakefile
CHANGED
|
@@ -15,12 +15,12 @@ require 'juwelier'
|
|
|
15
15
|
Juwelier::Tasks.new do |gem|
|
|
16
16
|
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
|
17
17
|
gem.name = "hashicorptools"
|
|
18
|
-
gem.homepage = "http://github.com/
|
|
18
|
+
gem.homepage = "http://github.com/controlshift/hashicorptools"
|
|
19
19
|
gem.license = "MIT"
|
|
20
20
|
gem.summary = %Q{Wrappers for terraform and packer}
|
|
21
21
|
gem.description = %Q{Wrappers for terraform and packer}
|
|
22
22
|
gem.email = "systems@controlshiftlabs.com"
|
|
23
|
-
gem.authors = [
|
|
23
|
+
gem.authors = ['Kathy Lu', 'Diego Marcet', 'Grey Moore', 'Nathan Woodhull']
|
|
24
24
|
gem.executables = ['ec2_host']
|
|
25
25
|
# dependencies defined in Gemfile
|
|
26
26
|
end
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
2.0.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 0.
|
|
5
|
+
# stub: hashicorptools 2.0.0 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
8
|
s.name = "hashicorptools".freeze
|
|
9
|
-
s.version = "0.
|
|
9
|
+
s.version = "2.0.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
|
-
s.authors = ["Nathan Woodhull".freeze]
|
|
14
|
-
s.date = "
|
|
13
|
+
s.authors = ["Kathy Lu".freeze, "Diego Marcet".freeze, "Grey Moore".freeze, "Nathan Woodhull".freeze]
|
|
14
|
+
s.date = "2022-01-18"
|
|
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]
|
|
@@ -20,9 +20,9 @@ Gem::Specification.new do |s|
|
|
|
20
20
|
"README.md"
|
|
21
21
|
]
|
|
22
22
|
s.files = [
|
|
23
|
+
".github/workflows/ci.yml",
|
|
23
24
|
".ruby-gemset",
|
|
24
25
|
".ruby-version",
|
|
25
|
-
".travis.yml",
|
|
26
26
|
"Gemfile",
|
|
27
27
|
"LICENSE",
|
|
28
28
|
"README.md",
|
|
@@ -39,12 +39,12 @@ 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
|
-
s.homepage = "http://github.com/
|
|
45
|
+
s.homepage = "http://github.com/controlshift/hashicorptools".freeze
|
|
46
46
|
s.licenses = ["MIT".freeze]
|
|
47
|
-
s.rubygems_version = "3.1.
|
|
47
|
+
s.rubygems_version = "3.1.6".freeze
|
|
48
48
|
s.summary = "Wrappers for terraform and packer".freeze
|
|
49
49
|
|
|
50
50
|
if s.respond_to? :specification_version then
|
|
@@ -52,32 +52,34 @@ Gem::Specification.new do |s|
|
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
if s.respond_to? :add_runtime_dependency then
|
|
55
|
-
s.add_runtime_dependency(%q<aws-sdk>.freeze, ["~>
|
|
56
|
-
s.add_runtime_dependency(%q<
|
|
57
|
-
s.add_runtime_dependency(%q<aws-sdk-
|
|
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"])
|
|
58
59
|
s.add_runtime_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
|
59
|
-
s.add_runtime_dependency(%q<thor>.freeze, ["
|
|
60
|
-
s.add_runtime_dependency(%q<activesupport>.freeze, ["
|
|
61
|
-
s.add_runtime_dependency(%q<byebug>.freeze, ["
|
|
62
|
-
s.add_runtime_dependency(%q<git>.freeze, ["
|
|
63
|
-
s.add_development_dependency(%q<rspec>.freeze, ["
|
|
64
|
-
s.add_development_dependency(%q<rdoc>.freeze, ["
|
|
65
|
-
s.add_development_dependency(%q<bundler>.freeze, ["
|
|
66
|
-
s.add_development_dependency(%q<juwelier>.freeze, ["
|
|
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"])
|
|
67
68
|
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
68
69
|
else
|
|
69
|
-
s.add_dependency(%q<aws-sdk>.freeze, ["~>
|
|
70
|
-
s.add_dependency(%q<
|
|
71
|
-
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"])
|
|
72
74
|
s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
|
73
|
-
s.add_dependency(%q<thor>.freeze, ["
|
|
74
|
-
s.add_dependency(%q<activesupport>.freeze, ["
|
|
75
|
-
s.add_dependency(%q<byebug>.freeze, ["
|
|
76
|
-
s.add_dependency(%q<git>.freeze, ["
|
|
77
|
-
s.add_dependency(%q<rspec>.freeze, ["
|
|
78
|
-
s.add_dependency(%q<rdoc>.freeze, ["
|
|
79
|
-
s.add_dependency(%q<bundler>.freeze, ["
|
|
80
|
-
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"])
|
|
81
83
|
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
82
84
|
end
|
|
83
85
|
end
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
require "timeout"
|
|
2
|
+
require 'aws-sdk-autoscaling'
|
|
3
|
+
require 'aws-sdk-ec2'
|
|
4
|
+
require 'aws-sdk-elasticloadbalancing'
|
|
2
5
|
|
|
3
6
|
module Hashicorptools
|
|
4
7
|
class AutoScalingGroup
|
|
@@ -91,11 +94,13 @@ module Hashicorptools
|
|
|
91
94
|
end
|
|
92
95
|
|
|
93
96
|
def verify_all_instances_using_correct_ami
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
if group.launch_configuration_name
|
|
98
|
+
launch_configuration = Aws::AutoScaling::LaunchConfiguration.new(name: group.launch_configuration_name, client: autoscaling)
|
|
99
|
+
image_id = launch_configuration.image_id
|
|
100
|
+
group.instances.each do |i|
|
|
101
|
+
instance = Aws::EC2::Instance.new(i.instance_id, client: ec2)
|
|
102
|
+
raise "#{i.instance_id} has the incorrect AMI, not #{image_id} from current LaunchConfig" if instance.image_id != image_id
|
|
103
|
+
end
|
|
99
104
|
end
|
|
100
105
|
end
|
|
101
106
|
|
|
@@ -1,6 +1,6 @@
|
|
|
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'
|
|
@@ -31,6 +31,9 @@ module Hashicorptools
|
|
|
31
31
|
})
|
|
32
32
|
output "created deployment #{response.deployment_id}"
|
|
33
33
|
output "https://console.aws.amazon.com/codedeploy/home?region=#{aws_region}#/deployments/#{response.deployment_id}"
|
|
34
|
+
|
|
35
|
+
# Classes that override this method should return true for a successful deployment, false otherwise
|
|
36
|
+
return true
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
private
|
|
@@ -72,9 +75,11 @@ module Hashicorptools
|
|
|
72
75
|
|
|
73
76
|
puts "Deploying for regions: #{aws_regions}"
|
|
74
77
|
|
|
75
|
-
|
|
78
|
+
all_succeeded = true
|
|
76
79
|
aws_regions.each_slice(2) do |aws_regions_batch|
|
|
77
|
-
puts "Deploying for
|
|
80
|
+
puts "Deploying for batch of regions: #{aws_regions_batch}"
|
|
81
|
+
|
|
82
|
+
threads = []
|
|
78
83
|
aws_regions_batch.each do |aws_region|
|
|
79
84
|
thread = Thread.new{ region_deployment(aws_region).create_deployment(commit.sha, commit.message) }
|
|
80
85
|
threads.push(thread)
|
|
@@ -82,13 +87,19 @@ module Hashicorptools
|
|
|
82
87
|
|
|
83
88
|
threads.each_with_index do |thread, index|
|
|
84
89
|
begin
|
|
85
|
-
thread.join
|
|
86
|
-
|
|
90
|
+
# thread.value waits for the thread to finish with #join, then returns the value of the expression
|
|
91
|
+
thread_succeeded = thread.value
|
|
92
|
+
all_succeeded = all_succeeded && thread_succeeded
|
|
93
|
+
rescue StandardError => e
|
|
87
94
|
# Don't quit whole program on exception in thread, just print exception and exit thread
|
|
88
95
|
puts "[#{aws_regions[index]}] EXCEPTION: #{e}"
|
|
96
|
+
all_succeeded = false
|
|
89
97
|
end
|
|
90
98
|
end
|
|
91
99
|
end
|
|
100
|
+
|
|
101
|
+
# Return a success or failure status code to be consumed by bash
|
|
102
|
+
exit(all_succeeded)
|
|
92
103
|
end
|
|
93
104
|
|
|
94
105
|
private
|
|
@@ -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
|
|
|
@@ -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)
|
|
@@ -133,15 +139,16 @@ module Hashicorptools
|
|
|
133
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
147
|
def amis_in_use(client_region)
|
|
141
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
|
|
@@ -170,7 +177,9 @@ module Hashicorptools
|
|
|
170
177
|
amis_to_remove.each do |ami|
|
|
171
178
|
ebs_mappings = ami.block_device_mappings
|
|
172
179
|
puts "Deregistering #{ami.image_id}"
|
|
173
|
-
|
|
180
|
+
regional_ec2_client(region_to_clean).deregister_image({
|
|
181
|
+
image_id: ami.image_id
|
|
182
|
+
})
|
|
174
183
|
delete_ami_snapshots(ebs_mappings, snapshot_region: region_to_clean)
|
|
175
184
|
end
|
|
176
185
|
|
|
@@ -184,16 +193,21 @@ module Hashicorptools
|
|
|
184
193
|
end
|
|
185
194
|
|
|
186
195
|
def amis_in_region(ami_region)
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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)
|
|
190
201
|
end
|
|
191
202
|
|
|
192
203
|
def delete_ami_snapshots(ebs_mappings, snapshot_region:)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
|
197
211
|
end
|
|
198
212
|
end
|
|
199
213
|
end
|
data/lib/hashicorptools.rb
CHANGED
|
@@ -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,74 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hashicorptools
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 2.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
+
- Kathy Lu
|
|
8
|
+
- Diego Marcet
|
|
9
|
+
- Grey Moore
|
|
7
10
|
- Nathan Woodhull
|
|
8
11
|
autorequire:
|
|
9
12
|
bindir: bin
|
|
10
13
|
cert_chain: []
|
|
11
|
-
date:
|
|
14
|
+
date: 2022-01-18 00:00:00.000000000 Z
|
|
12
15
|
dependencies:
|
|
13
16
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: aws-sdk
|
|
17
|
+
name: aws-sdk-autoscaling
|
|
15
18
|
requirement: !ruby/object:Gem::Requirement
|
|
16
19
|
requirements:
|
|
17
20
|
- - "~>"
|
|
18
21
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
22
|
+
version: '1'
|
|
20
23
|
type: :runtime
|
|
21
24
|
prerelease: false
|
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
26
|
requirements:
|
|
24
27
|
- - "~>"
|
|
25
28
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
29
|
+
version: '1'
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
31
|
+
name: aws-sdk-codedeploy
|
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
|
30
33
|
requirements:
|
|
31
|
-
- -
|
|
34
|
+
- - "~>"
|
|
32
35
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
36
|
+
version: '1'
|
|
34
37
|
type: :runtime
|
|
35
38
|
prerelease: false
|
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
40
|
requirements:
|
|
38
|
-
- -
|
|
41
|
+
- - "~>"
|
|
39
42
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
43
|
+
version: '1'
|
|
41
44
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: aws-sdk-
|
|
45
|
+
name: aws-sdk-ec2
|
|
43
46
|
requirement: !ruby/object:Gem::Requirement
|
|
44
47
|
requirements:
|
|
45
48
|
- - "~>"
|
|
46
49
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '1
|
|
50
|
+
version: '1'
|
|
48
51
|
type: :runtime
|
|
49
52
|
prerelease: false
|
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
54
|
requirements:
|
|
52
55
|
- - "~>"
|
|
53
56
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '1
|
|
57
|
+
version: '1'
|
|
58
|
+
- !ruby/object:Gem::Dependency
|
|
59
|
+
name: aws-sdk-elasticloadbalancing
|
|
60
|
+
requirement: !ruby/object:Gem::Requirement
|
|
61
|
+
requirements:
|
|
62
|
+
- - "~>"
|
|
63
|
+
- !ruby/object:Gem::Version
|
|
64
|
+
version: '1'
|
|
65
|
+
type: :runtime
|
|
66
|
+
prerelease: false
|
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
68
|
+
requirements:
|
|
69
|
+
- - "~>"
|
|
70
|
+
- !ruby/object:Gem::Version
|
|
71
|
+
version: '1'
|
|
55
72
|
- !ruby/object:Gem::Dependency
|
|
56
73
|
name: dotenv
|
|
57
74
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -76,23 +93,20 @@ dependencies:
|
|
|
76
93
|
name: thor
|
|
77
94
|
requirement: !ruby/object:Gem::Requirement
|
|
78
95
|
requirements:
|
|
79
|
-
- -
|
|
96
|
+
- - ">="
|
|
80
97
|
- !ruby/object:Gem::Version
|
|
81
98
|
version: 0.20.0
|
|
82
99
|
type: :runtime
|
|
83
100
|
prerelease: false
|
|
84
101
|
version_requirements: !ruby/object:Gem::Requirement
|
|
85
102
|
requirements:
|
|
86
|
-
- -
|
|
103
|
+
- - ">="
|
|
87
104
|
- !ruby/object:Gem::Version
|
|
88
105
|
version: 0.20.0
|
|
89
106
|
- !ruby/object:Gem::Dependency
|
|
90
107
|
name: activesupport
|
|
91
108
|
requirement: !ruby/object:Gem::Requirement
|
|
92
109
|
requirements:
|
|
93
|
-
- - "~>"
|
|
94
|
-
- !ruby/object:Gem::Version
|
|
95
|
-
version: '5.1'
|
|
96
110
|
- - ">="
|
|
97
111
|
- !ruby/object:Gem::Version
|
|
98
112
|
version: 5.1.4
|
|
@@ -100,9 +114,6 @@ dependencies:
|
|
|
100
114
|
prerelease: false
|
|
101
115
|
version_requirements: !ruby/object:Gem::Requirement
|
|
102
116
|
requirements:
|
|
103
|
-
- - "~>"
|
|
104
|
-
- !ruby/object:Gem::Version
|
|
105
|
-
version: '5.1'
|
|
106
117
|
- - ">="
|
|
107
118
|
- !ruby/object:Gem::Version
|
|
108
119
|
version: 5.1.4
|
|
@@ -110,9 +121,6 @@ dependencies:
|
|
|
110
121
|
name: byebug
|
|
111
122
|
requirement: !ruby/object:Gem::Requirement
|
|
112
123
|
requirements:
|
|
113
|
-
- - "~>"
|
|
114
|
-
- !ruby/object:Gem::Version
|
|
115
|
-
version: '10.0'
|
|
116
124
|
- - ">="
|
|
117
125
|
- !ruby/object:Gem::Version
|
|
118
126
|
version: 10.0.2
|
|
@@ -120,9 +128,6 @@ dependencies:
|
|
|
120
128
|
prerelease: false
|
|
121
129
|
version_requirements: !ruby/object:Gem::Requirement
|
|
122
130
|
requirements:
|
|
123
|
-
- - "~>"
|
|
124
|
-
- !ruby/object:Gem::Version
|
|
125
|
-
version: '10.0'
|
|
126
131
|
- - ">="
|
|
127
132
|
- !ruby/object:Gem::Version
|
|
128
133
|
version: 10.0.2
|
|
@@ -130,78 +135,72 @@ dependencies:
|
|
|
130
135
|
name: git
|
|
131
136
|
requirement: !ruby/object:Gem::Requirement
|
|
132
137
|
requirements:
|
|
133
|
-
- - "
|
|
138
|
+
- - ">"
|
|
134
139
|
- !ruby/object:Gem::Version
|
|
135
140
|
version: '1.3'
|
|
136
141
|
type: :runtime
|
|
137
142
|
prerelease: false
|
|
138
143
|
version_requirements: !ruby/object:Gem::Requirement
|
|
139
144
|
requirements:
|
|
140
|
-
- - "
|
|
145
|
+
- - ">"
|
|
141
146
|
- !ruby/object:Gem::Version
|
|
142
147
|
version: '1.3'
|
|
143
148
|
- !ruby/object:Gem::Dependency
|
|
144
149
|
name: rspec
|
|
145
150
|
requirement: !ruby/object:Gem::Requirement
|
|
146
151
|
requirements:
|
|
147
|
-
- - "
|
|
152
|
+
- - ">"
|
|
148
153
|
- !ruby/object:Gem::Version
|
|
149
154
|
version: '3.7'
|
|
150
155
|
type: :development
|
|
151
156
|
prerelease: false
|
|
152
157
|
version_requirements: !ruby/object:Gem::Requirement
|
|
153
158
|
requirements:
|
|
154
|
-
- - "
|
|
159
|
+
- - ">"
|
|
155
160
|
- !ruby/object:Gem::Version
|
|
156
161
|
version: '3.7'
|
|
157
162
|
- !ruby/object:Gem::Dependency
|
|
158
163
|
name: rdoc
|
|
159
164
|
requirement: !ruby/object:Gem::Requirement
|
|
160
165
|
requirements:
|
|
161
|
-
- - "
|
|
166
|
+
- - ">"
|
|
162
167
|
- !ruby/object:Gem::Version
|
|
163
168
|
version: '3.12'
|
|
164
169
|
type: :development
|
|
165
170
|
prerelease: false
|
|
166
171
|
version_requirements: !ruby/object:Gem::Requirement
|
|
167
172
|
requirements:
|
|
168
|
-
- - "
|
|
173
|
+
- - ">"
|
|
169
174
|
- !ruby/object:Gem::Version
|
|
170
175
|
version: '3.12'
|
|
171
176
|
- !ruby/object:Gem::Dependency
|
|
172
177
|
name: bundler
|
|
173
178
|
requirement: !ruby/object:Gem::Requirement
|
|
174
179
|
requirements:
|
|
175
|
-
- - "
|
|
180
|
+
- - ">"
|
|
176
181
|
- !ruby/object:Gem::Version
|
|
177
182
|
version: '2.0'
|
|
178
183
|
type: :development
|
|
179
184
|
prerelease: false
|
|
180
185
|
version_requirements: !ruby/object:Gem::Requirement
|
|
181
186
|
requirements:
|
|
182
|
-
- - "
|
|
187
|
+
- - ">"
|
|
183
188
|
- !ruby/object:Gem::Version
|
|
184
189
|
version: '2.0'
|
|
185
190
|
- !ruby/object:Gem::Dependency
|
|
186
191
|
name: juwelier
|
|
187
192
|
requirement: !ruby/object:Gem::Requirement
|
|
188
193
|
requirements:
|
|
189
|
-
- - "~>"
|
|
190
|
-
- !ruby/object:Gem::Version
|
|
191
|
-
version: '2.4'
|
|
192
194
|
- - ">="
|
|
193
195
|
- !ruby/object:Gem::Version
|
|
194
|
-
version:
|
|
196
|
+
version: '0'
|
|
195
197
|
type: :development
|
|
196
198
|
prerelease: false
|
|
197
199
|
version_requirements: !ruby/object:Gem::Requirement
|
|
198
200
|
requirements:
|
|
199
|
-
- - "~>"
|
|
200
|
-
- !ruby/object:Gem::Version
|
|
201
|
-
version: '2.4'
|
|
202
201
|
- - ">="
|
|
203
202
|
- !ruby/object:Gem::Version
|
|
204
|
-
version:
|
|
203
|
+
version: '0'
|
|
205
204
|
- !ruby/object:Gem::Dependency
|
|
206
205
|
name: simplecov
|
|
207
206
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -225,9 +224,9 @@ extra_rdoc_files:
|
|
|
225
224
|
- LICENSE
|
|
226
225
|
- README.md
|
|
227
226
|
files:
|
|
227
|
+
- ".github/workflows/ci.yml"
|
|
228
228
|
- ".ruby-gemset"
|
|
229
229
|
- ".ruby-version"
|
|
230
|
-
- ".travis.yml"
|
|
231
230
|
- Gemfile
|
|
232
231
|
- LICENSE
|
|
233
232
|
- README.md
|
|
@@ -244,9 +243,9 @@ files:
|
|
|
244
243
|
- lib/hashicorptools/packer.rb
|
|
245
244
|
- lib/hashicorptools/update_launch_configuration.rb
|
|
246
245
|
- lib/hashicorptools/variables.rb
|
|
247
|
-
- spec/
|
|
246
|
+
- spec/ec2_utilities_spec.rb
|
|
248
247
|
- spec/spec_helper.rb
|
|
249
|
-
homepage: http://github.com/
|
|
248
|
+
homepage: http://github.com/controlshift/hashicorptools
|
|
250
249
|
licenses:
|
|
251
250
|
- MIT
|
|
252
251
|
metadata: {}
|
|
@@ -265,7 +264,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
265
264
|
- !ruby/object:Gem::Version
|
|
266
265
|
version: '0'
|
|
267
266
|
requirements: []
|
|
268
|
-
rubygems_version: 3.1.
|
|
267
|
+
rubygems_version: 3.1.6
|
|
269
268
|
signing_key:
|
|
270
269
|
specification_version: 4
|
|
271
270
|
summary: Wrappers for terraform and packer
|
data/.travis.yml
DELETED