hashicorptools 0.2.3 → 0.3.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/.ruby-version +1 -1
- data/.travis.yml +5 -1
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/hashicorptools.gemspec +19 -20
- data/lib/hashicorptools.rb +0 -1
- data/lib/hashicorptools/ami_configs/standard-ami.json +1 -0
- data/lib/hashicorptools/auto_scaling_group.rb +4 -4
- data/lib/hashicorptools/code_deploy.rb +13 -3
- data/lib/hashicorptools/packer.rb +4 -2
- data/lib/hashicorptools/update_launch_configuration.rb +2 -1
- data/lib/hashicorptools/variables.rb +1 -5
- metadata +29 -31
- data/lib/hashicorptools/terraform.rb +0 -299
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 75178f2878dffffbcca566e4ed6fa81c9cc612f55b601adf82a5a31da8492e74
|
|
4
|
+
data.tar.gz: 47fef27c27f49f242188b474872ef4b57128e8998e9a277de2c19f6752a74759
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 75d5ca009f079b41864ec1e5d66b1d6a2e88dcbab943ee2aff7f7cb869a41e667ef32483c0de2c865fe885f5c9d726c6c32122d79a3f7077fa7eec418de111de
|
|
7
|
+
data.tar.gz: d346e24bc5ae25eb45e9406894701d96095d75eec0b40838cd85e647943b6c21a019913a21bb4ba51f9426d9bfa56fbee0cd0b80e90bf0b2bf73b75d62f24996
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby-2.
|
|
1
|
+
ruby-2.6.6
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.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 0.3.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 = "0.3.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 = "
|
|
14
|
+
s.date = "2020-06-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]
|
|
@@ -37,7 +37,6 @@ Gem::Specification.new do |s|
|
|
|
37
37
|
"lib/hashicorptools/ec2_utilities.rb",
|
|
38
38
|
"lib/hashicorptools/host.rb",
|
|
39
39
|
"lib/hashicorptools/packer.rb",
|
|
40
|
-
"lib/hashicorptools/terraform.rb",
|
|
41
40
|
"lib/hashicorptools/update_launch_configuration.rb",
|
|
42
41
|
"lib/hashicorptools/variables.rb",
|
|
43
42
|
"spec/hashicorptools_spec.rb",
|
|
@@ -45,7 +44,7 @@ Gem::Specification.new do |s|
|
|
|
45
44
|
]
|
|
46
45
|
s.homepage = "http://github.com/woodhull/hashicorptools".freeze
|
|
47
46
|
s.licenses = ["MIT".freeze]
|
|
48
|
-
s.rubygems_version = "
|
|
47
|
+
s.rubygems_version = "3.0.3".freeze
|
|
49
48
|
s.summary = "Wrappers for terraform and packer".freeze
|
|
50
49
|
|
|
51
50
|
if s.respond_to? :specification_version then
|
|
@@ -55,44 +54,44 @@ Gem::Specification.new do |s|
|
|
|
55
54
|
s.add_runtime_dependency(%q<aws-sdk>.freeze, ["~> 2"])
|
|
56
55
|
s.add_runtime_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
|
|
57
56
|
s.add_runtime_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
|
|
58
|
-
s.add_runtime_dependency(%q<dotenv>.freeze, ["
|
|
57
|
+
s.add_runtime_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
|
59
58
|
s.add_runtime_dependency(%q<thor>.freeze, ["= 0.20.0"])
|
|
60
|
-
s.add_runtime_dependency(%q<activesupport>.freeze, ["
|
|
61
|
-
s.add_runtime_dependency(%q<byebug>.freeze, ["
|
|
59
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
|
|
60
|
+
s.add_runtime_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
|
|
62
61
|
s.add_runtime_dependency(%q<git>.freeze, ["~> 1.3"])
|
|
63
62
|
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.7"])
|
|
64
63
|
s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
|
65
|
-
s.add_development_dependency(%q<bundler>.freeze, ["~>
|
|
66
|
-
s.add_development_dependency(%q<juwelier>.freeze, ["
|
|
64
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 2.0"])
|
|
65
|
+
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
|
|
67
66
|
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
68
67
|
else
|
|
69
68
|
s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
|
|
70
69
|
s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
|
|
71
70
|
s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
|
|
72
|
-
s.add_dependency(%q<dotenv>.freeze, ["
|
|
71
|
+
s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
|
73
72
|
s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
|
|
74
|
-
s.add_dependency(%q<activesupport>.freeze, ["
|
|
75
|
-
s.add_dependency(%q<byebug>.freeze, ["
|
|
73
|
+
s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
|
|
74
|
+
s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
|
|
76
75
|
s.add_dependency(%q<git>.freeze, ["~> 1.3"])
|
|
77
76
|
s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
|
|
78
77
|
s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
|
79
|
-
s.add_dependency(%q<bundler>.freeze, ["~>
|
|
80
|
-
s.add_dependency(%q<juwelier>.freeze, ["
|
|
78
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
|
|
79
|
+
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
|
|
81
80
|
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
82
81
|
end
|
|
83
82
|
else
|
|
84
83
|
s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
|
|
85
84
|
s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
|
|
86
85
|
s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
|
|
87
|
-
s.add_dependency(%q<dotenv>.freeze, ["
|
|
86
|
+
s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
|
|
88
87
|
s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
|
|
89
|
-
s.add_dependency(%q<activesupport>.freeze, ["
|
|
90
|
-
s.add_dependency(%q<byebug>.freeze, ["
|
|
88
|
+
s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
|
|
89
|
+
s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
|
|
91
90
|
s.add_dependency(%q<git>.freeze, ["~> 1.3"])
|
|
92
91
|
s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
|
|
93
92
|
s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
|
94
|
-
s.add_dependency(%q<bundler>.freeze, ["~>
|
|
95
|
-
s.add_dependency(%q<juwelier>.freeze, ["
|
|
93
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
|
|
94
|
+
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
|
|
96
95
|
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
97
96
|
end
|
|
98
97
|
end
|
data/lib/hashicorptools.rb
CHANGED
|
@@ -13,7 +13,6 @@ require_relative 'hashicorptools/variables'
|
|
|
13
13
|
require_relative 'hashicorptools/ec2_utilities'
|
|
14
14
|
require_relative 'hashicorptools/auto_scaling_group'
|
|
15
15
|
require_relative 'hashicorptools/packer'
|
|
16
|
-
require_relative 'hashicorptools/terraform'
|
|
17
16
|
require_relative 'hashicorptools/host'
|
|
18
17
|
require_relative 'hashicorptools/update_launch_configuration'
|
|
19
18
|
require_relative 'hashicorptools/code_deploy'
|
|
@@ -2,7 +2,7 @@ require "timeout"
|
|
|
2
2
|
|
|
3
3
|
module Hashicorptools
|
|
4
4
|
class AutoScalingGroup
|
|
5
|
-
attr_accessor :name
|
|
5
|
+
attr_accessor :name, :region
|
|
6
6
|
|
|
7
7
|
def initialize(attrs = {})
|
|
8
8
|
attrs.each do |key,value|
|
|
@@ -115,15 +115,15 @@ module Hashicorptools
|
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
def autoscaling
|
|
118
|
-
@autoscaling ||= Aws::AutoScaling::Client.new(region:
|
|
118
|
+
@autoscaling ||= Aws::AutoScaling::Client.new(region: region)
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
def ec2
|
|
122
|
-
@ec2 ||= Aws::EC2::Client.new(region:
|
|
122
|
+
@ec2 ||= Aws::EC2::Client.new(region: region)
|
|
123
123
|
end
|
|
124
124
|
|
|
125
125
|
def elb
|
|
126
|
-
@elb ||= Aws::ElasticLoadBalancing::Client.new(region:
|
|
126
|
+
@elb ||= Aws::ElasticLoadBalancing::Client.new(region: region)
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
def groups
|
|
@@ -11,11 +11,21 @@ module Hashicorptools
|
|
|
11
11
|
|
|
12
12
|
desc 'deploy', 'deploy latest code to environment'
|
|
13
13
|
option :environment, :required => true
|
|
14
|
-
option :branch
|
|
14
|
+
option :branch
|
|
15
|
+
option :aws_region, default: 'us-east-1'
|
|
15
16
|
option :commit
|
|
16
17
|
def deploy
|
|
17
18
|
g = Git.open('..')
|
|
18
19
|
|
|
20
|
+
# TODO restore defaulting branch to the default branch (and remove below check)
|
|
21
|
+
# once all the repos have the same default branch name of `main`
|
|
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
|
|
28
|
+
|
|
19
29
|
commit = if options[:commit].present?
|
|
20
30
|
g.gcommit(options[:commit])
|
|
21
31
|
else
|
|
@@ -34,7 +44,7 @@ module Hashicorptools
|
|
|
34
44
|
def create_deployment(commit_id, commit_message = nil)
|
|
35
45
|
Dotenv.load
|
|
36
46
|
|
|
37
|
-
client = Aws::CodeDeploy::Client.new
|
|
47
|
+
client = Aws::CodeDeploy::Client.new(region: options[:aws_region])
|
|
38
48
|
response = client.create_deployment({
|
|
39
49
|
application_name: application_name,
|
|
40
50
|
deployment_group_name: "#{application_name}-#{options[:environment]}",
|
|
@@ -48,7 +58,7 @@ module Hashicorptools
|
|
|
48
58
|
description: (commit_message || "commit #{commit_id}").slice(0,99)
|
|
49
59
|
})
|
|
50
60
|
puts "created deployment #{response.deployment_id}"
|
|
51
|
-
puts "https://console.aws.amazon.com/codedeploy/home?region=#{
|
|
61
|
+
puts "https://console.aws.amazon.com/codedeploy/home?region=#{options[:aws_region]}#/deployments/#{response.deployment_id}"
|
|
52
62
|
end
|
|
53
63
|
|
|
54
64
|
def application_name
|
|
@@ -69,8 +69,10 @@ module Hashicorptools
|
|
|
69
69
|
max_count: 1,
|
|
70
70
|
instance_type: "t2.micro")
|
|
71
71
|
|
|
72
|
-
ec2.create_tags( resources: run_instances_resp.instances.collect
|
|
73
|
-
tags: [ {key: 'Name', value: "packer test boot #{tag_name}"},
|
|
72
|
+
ec2.create_tags( resources: run_instances_resp.instances.collect(&:instance_id),
|
|
73
|
+
tags: [ {key: 'Name', value: "packer test boot #{tag_name}"},
|
|
74
|
+
{key: 'environment', value: 'packer-development'},
|
|
75
|
+
{key: 'temporary', value: 'kill me'}])
|
|
74
76
|
|
|
75
77
|
require 'byebug'
|
|
76
78
|
byebug
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
module Hashicorptools
|
|
2
2
|
class UpdateLaunchConfiguration < Thor
|
|
3
3
|
desc 'deploy ASG_NAME', 'recycle instances in the ASG with no downtime'
|
|
4
|
+
option :aws_region, default: 'us-east-1'
|
|
4
5
|
def deploy(asg_name)
|
|
5
|
-
asg = AutoScalingGroup.new(name: asg_name)
|
|
6
|
+
asg = AutoScalingGroup.new(name: asg_name, region: options[:aws_region])
|
|
6
7
|
if asg.group.nil?
|
|
7
8
|
raise "could not find asg #{asg_name}"
|
|
8
9
|
end
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
module Hashicorptools
|
|
2
2
|
module Variables
|
|
3
|
-
def aws_credentials_settings(settings_overrides = {})
|
|
4
|
-
{aws_access_key: ENV['AWS_ACCESS_KEY_ID'],
|
|
5
|
-
aws_secret_key: ENV['AWS_SECRET_ACCESS_KEY']}.merge(settings_overrides)
|
|
6
|
-
end
|
|
7
3
|
|
|
8
4
|
def variables(settings_overrides = {})
|
|
9
|
-
|
|
5
|
+
settings_overrides.collect{|key,value| format_variable(key, value)}.join(' ')
|
|
10
6
|
end
|
|
11
7
|
|
|
12
8
|
protected
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hashicorptools
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.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:
|
|
11
|
+
date: 2020-06-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: aws-sdk
|
|
@@ -56,22 +56,22 @@ dependencies:
|
|
|
56
56
|
name: dotenv
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: 2.2.1
|
|
62
59
|
- - "~>"
|
|
63
60
|
- !ruby/object:Gem::Version
|
|
64
61
|
version: '2.2'
|
|
62
|
+
- - ">="
|
|
63
|
+
- !ruby/object:Gem::Version
|
|
64
|
+
version: 2.2.1
|
|
65
65
|
type: :runtime
|
|
66
66
|
prerelease: false
|
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
|
68
68
|
requirements:
|
|
69
|
-
- - ">="
|
|
70
|
-
- !ruby/object:Gem::Version
|
|
71
|
-
version: 2.2.1
|
|
72
69
|
- - "~>"
|
|
73
70
|
- !ruby/object:Gem::Version
|
|
74
71
|
version: '2.2'
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: 2.2.1
|
|
75
75
|
- !ruby/object:Gem::Dependency
|
|
76
76
|
name: thor
|
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -90,42 +90,42 @@ dependencies:
|
|
|
90
90
|
name: activesupport
|
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
|
92
92
|
requirements:
|
|
93
|
-
- - ">="
|
|
94
|
-
- !ruby/object:Gem::Version
|
|
95
|
-
version: 5.1.4
|
|
96
93
|
- - "~>"
|
|
97
94
|
- !ruby/object:Gem::Version
|
|
98
95
|
version: '5.1'
|
|
96
|
+
- - ">="
|
|
97
|
+
- !ruby/object:Gem::Version
|
|
98
|
+
version: 5.1.4
|
|
99
99
|
type: :runtime
|
|
100
100
|
prerelease: false
|
|
101
101
|
version_requirements: !ruby/object:Gem::Requirement
|
|
102
102
|
requirements:
|
|
103
|
-
- - ">="
|
|
104
|
-
- !ruby/object:Gem::Version
|
|
105
|
-
version: 5.1.4
|
|
106
103
|
- - "~>"
|
|
107
104
|
- !ruby/object:Gem::Version
|
|
108
105
|
version: '5.1'
|
|
106
|
+
- - ">="
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: 5.1.4
|
|
109
109
|
- !ruby/object:Gem::Dependency
|
|
110
110
|
name: byebug
|
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
|
112
112
|
requirements:
|
|
113
|
-
- - ">="
|
|
114
|
-
- !ruby/object:Gem::Version
|
|
115
|
-
version: 10.0.2
|
|
116
113
|
- - "~>"
|
|
117
114
|
- !ruby/object:Gem::Version
|
|
118
115
|
version: '10.0'
|
|
116
|
+
- - ">="
|
|
117
|
+
- !ruby/object:Gem::Version
|
|
118
|
+
version: 10.0.2
|
|
119
119
|
type: :runtime
|
|
120
120
|
prerelease: false
|
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
|
122
122
|
requirements:
|
|
123
|
-
- - ">="
|
|
124
|
-
- !ruby/object:Gem::Version
|
|
125
|
-
version: 10.0.2
|
|
126
123
|
- - "~>"
|
|
127
124
|
- !ruby/object:Gem::Version
|
|
128
125
|
version: '10.0'
|
|
126
|
+
- - ">="
|
|
127
|
+
- !ruby/object:Gem::Version
|
|
128
|
+
version: 10.0.2
|
|
129
129
|
- !ruby/object:Gem::Dependency
|
|
130
130
|
name: git
|
|
131
131
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -174,34 +174,34 @@ dependencies:
|
|
|
174
174
|
requirements:
|
|
175
175
|
- - "~>"
|
|
176
176
|
- !ruby/object:Gem::Version
|
|
177
|
-
version: '
|
|
177
|
+
version: '2.0'
|
|
178
178
|
type: :development
|
|
179
179
|
prerelease: false
|
|
180
180
|
version_requirements: !ruby/object:Gem::Requirement
|
|
181
181
|
requirements:
|
|
182
182
|
- - "~>"
|
|
183
183
|
- !ruby/object:Gem::Version
|
|
184
|
-
version: '
|
|
184
|
+
version: '2.0'
|
|
185
185
|
- !ruby/object:Gem::Dependency
|
|
186
186
|
name: juwelier
|
|
187
187
|
requirement: !ruby/object:Gem::Requirement
|
|
188
188
|
requirements:
|
|
189
|
-
- - ">="
|
|
190
|
-
- !ruby/object:Gem::Version
|
|
191
|
-
version: 2.4.7
|
|
192
189
|
- - "~>"
|
|
193
190
|
- !ruby/object:Gem::Version
|
|
194
191
|
version: '2.4'
|
|
192
|
+
- - ">="
|
|
193
|
+
- !ruby/object:Gem::Version
|
|
194
|
+
version: 2.4.7
|
|
195
195
|
type: :development
|
|
196
196
|
prerelease: false
|
|
197
197
|
version_requirements: !ruby/object:Gem::Requirement
|
|
198
198
|
requirements:
|
|
199
|
-
- - ">="
|
|
200
|
-
- !ruby/object:Gem::Version
|
|
201
|
-
version: 2.4.7
|
|
202
199
|
- - "~>"
|
|
203
200
|
- !ruby/object:Gem::Version
|
|
204
201
|
version: '2.4'
|
|
202
|
+
- - ">="
|
|
203
|
+
- !ruby/object:Gem::Version
|
|
204
|
+
version: 2.4.7
|
|
205
205
|
- !ruby/object:Gem::Dependency
|
|
206
206
|
name: simplecov
|
|
207
207
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -242,7 +242,6 @@ files:
|
|
|
242
242
|
- lib/hashicorptools/ec2_utilities.rb
|
|
243
243
|
- lib/hashicorptools/host.rb
|
|
244
244
|
- lib/hashicorptools/packer.rb
|
|
245
|
-
- lib/hashicorptools/terraform.rb
|
|
246
245
|
- lib/hashicorptools/update_launch_configuration.rb
|
|
247
246
|
- lib/hashicorptools/variables.rb
|
|
248
247
|
- spec/hashicorptools_spec.rb
|
|
@@ -266,8 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
266
265
|
- !ruby/object:Gem::Version
|
|
267
266
|
version: '0'
|
|
268
267
|
requirements: []
|
|
269
|
-
|
|
270
|
-
rubygems_version: 2.7.6
|
|
268
|
+
rubygems_version: 3.0.3
|
|
271
269
|
signing_key:
|
|
272
270
|
specification_version: 4
|
|
273
271
|
summary: Wrappers for terraform and packer
|
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
module Hashicorptools
|
|
2
|
-
class Terraform < Thor
|
|
3
|
-
TERRAFORM_VERSION = '0.11.0'
|
|
4
|
-
|
|
5
|
-
include Ec2Utilities
|
|
6
|
-
include Variables
|
|
7
|
-
|
|
8
|
-
desc 'bootstrap', 'terraform a new infrastructure from scratch'
|
|
9
|
-
option :environment, :required => true
|
|
10
|
-
def bootstrap
|
|
11
|
-
apply
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
desc 'init', 'install providers into local terraform'
|
|
15
|
-
option :environment, :required => true
|
|
16
|
-
def init
|
|
17
|
-
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
[:apply, :plan, :destroy, :pull, :refresh].each do |cmd|
|
|
21
|
-
desc cmd, "terraform #{cmd}"
|
|
22
|
-
option :environment, :required => true
|
|
23
|
-
option :debug, :required => false
|
|
24
|
-
|
|
25
|
-
define_method cmd do
|
|
26
|
-
send("_#{cmd}")
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
no_commands do
|
|
30
|
-
define_method "_#{cmd}" do |settings_overrides = {}|
|
|
31
|
-
enforce_version!
|
|
32
|
-
raise 'invalid environment' unless ['staging', 'production'].include?(options[:environment])
|
|
33
|
-
|
|
34
|
-
execute(state_path, var_file_path) do
|
|
35
|
-
|
|
36
|
-
settings_overrides
|
|
37
|
-
.merge!({ app_environment: options[:environment] }
|
|
38
|
-
.merge(env_variable_keys)
|
|
39
|
-
.merge(settings)
|
|
40
|
-
.merge(shared_plan_variables))
|
|
41
|
-
|
|
42
|
-
send("before_#{cmd}")
|
|
43
|
-
|
|
44
|
-
terraform_command = "terraform #{cmd} #{variables(settings_overrides)} -state #{state_path} #{var_file_param} #{config_directory}"
|
|
45
|
-
|
|
46
|
-
if (options[:debug])
|
|
47
|
-
puts "[DEBUG] running command: '#{terraform_command}"
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
result = system terraform_command
|
|
51
|
-
|
|
52
|
-
if result
|
|
53
|
-
send("after_#{cmd}")
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
define_method "before_#{cmd}" do
|
|
59
|
-
# no-op
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
no_commands do
|
|
64
|
-
define_method "before_shared_#{cmd}" do
|
|
65
|
-
# no-op
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
define_method "after_#{cmd}" do
|
|
69
|
-
# no-op
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
define_method "after_shared_#{cmd}" do
|
|
73
|
-
# no-op
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
desc cmd, "terraform #{cmd} for shared plan"
|
|
78
|
-
option :debug, :required => false
|
|
79
|
-
define_method "shared_#{cmd}" do
|
|
80
|
-
enforce_version!
|
|
81
|
-
|
|
82
|
-
execute(shared_state_path) do
|
|
83
|
-
send("before_shared_#{cmd}")
|
|
84
|
-
|
|
85
|
-
terraform_command = "terraform #{cmd} #{variables(env_variable_keys.merge(settings))} -state #{shared_state_path} #{shared_config_directory}"
|
|
86
|
-
if (options[:debug])
|
|
87
|
-
puts "[DEBUG] running command: '#{terraform_command}"
|
|
88
|
-
end
|
|
89
|
-
result = system terraform_command
|
|
90
|
-
|
|
91
|
-
if result
|
|
92
|
-
send("after_shared_#{cmd}")
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
desc 'output', 'terraform output'
|
|
99
|
-
option :environment, :required => true
|
|
100
|
-
option :name, :required => true
|
|
101
|
-
def output
|
|
102
|
-
execute(state_path) do
|
|
103
|
-
system output_cmd(state_path, options[:name])
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
desc 'shared_output', 'terraform output for shared plan'
|
|
108
|
-
option :name, :required => true
|
|
109
|
-
def shared_output
|
|
110
|
-
execute(shared_state_path) do
|
|
111
|
-
system output_cmd(shared_state_path, options[:name])
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
desc 'taint', 'terraform taint'
|
|
116
|
-
option :environment, :required => true
|
|
117
|
-
option :name, :required => true
|
|
118
|
-
option :module, :required => false
|
|
119
|
-
def taint
|
|
120
|
-
execute(state_path) do
|
|
121
|
-
if options[:module].present?
|
|
122
|
-
system "terraform taint -module #{options[:module]} -state #{state_path} #{options[:name]}"
|
|
123
|
-
else
|
|
124
|
-
system "terraform taint -state #{state_path} #{options[:name]}"
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
desc 'shared_taint', 'terraform taint for shared plan'
|
|
130
|
-
option :name, :required => true
|
|
131
|
-
option :module, :required => false
|
|
132
|
-
def shared_taint
|
|
133
|
-
execute(shared_state_path) do
|
|
134
|
-
if options[:module].present?
|
|
135
|
-
system "terraform taint -module #{options[:module]} -state #{shared_state_path} #{options[:name]}"
|
|
136
|
-
else
|
|
137
|
-
system "terraform taint -state #{shared_state_path} #{options[:name]}"
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
desc 'show', 'terraform show'
|
|
143
|
-
option :environment, :required => true
|
|
144
|
-
def show
|
|
145
|
-
execute(state_path) do
|
|
146
|
-
system "terraform show #{state_path}"
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
desc 'shared_show', 'terraform show for shared plan'
|
|
151
|
-
def shared_show
|
|
152
|
-
execute(shared_state_path) do
|
|
153
|
-
system "terraform show #{shared_state_path}"
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
desc "console", "interactive session"
|
|
158
|
-
def console
|
|
159
|
-
require 'pry-byebug'
|
|
160
|
-
binding.pry
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
protected
|
|
164
|
-
|
|
165
|
-
def var_file_param
|
|
166
|
-
File.exist?(var_file_path) ?
|
|
167
|
-
"-var-file #{var_file_path}" :
|
|
168
|
-
""
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
def execute(state_file_path, var_file_path=nil)
|
|
172
|
-
begin
|
|
173
|
-
yield
|
|
174
|
-
rescue StandardError => e
|
|
175
|
-
puts e.message
|
|
176
|
-
puts e.backtrace
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
def state_path
|
|
181
|
-
"#{config_environment_path}/#{options[:environment]}.tfstate"
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
def shared_state_path
|
|
185
|
-
"#{shared_config_directory}/shared.tfstate"
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def var_file_path
|
|
189
|
-
"#{config_environment_path}/variables.tfvars"
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
def config_directory
|
|
193
|
-
"config/infrastructure/#{infrastructure}"
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def shared_config_directory
|
|
197
|
-
"config/infrastructure/#{infrastructure}/shared"
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
def config_environment_path
|
|
201
|
-
"#{config_directory}/environments/#{options[:environment]}"
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
def infrastructure
|
|
205
|
-
raise 'implement me'
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
def output_cmd(state_file_path, name=nil)
|
|
209
|
-
"terraform output -state=#{state_file_path} #{name}"
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
def output_variable(state_file_path, name)
|
|
213
|
-
`#{output_cmd(state_file_path, name)}`.chomp
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
def output_variables(state_file_path)
|
|
217
|
-
raw_plan_output = `#{output_cmd(state_file_path)}`
|
|
218
|
-
parse_key_value_variables(raw_plan_output)
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
def var_file_variables
|
|
222
|
-
raise "Vars file #{var_file_path} does not exist" unless File.exist?(var_file_path)
|
|
223
|
-
|
|
224
|
-
raw_var_file_variables = File.read(var_file_path)
|
|
225
|
-
parse_key_value_variables(raw_var_file_variables)
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
def terraform_version
|
|
229
|
-
version_string = `terraform version`.chomp
|
|
230
|
-
version = /(\d+.\d+.\d+)/.match(version_string)
|
|
231
|
-
version[0]
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
def enforce_version!
|
|
235
|
-
if Gem::Version.new(terraform_version) < Gem::Version.new(TERRAFORM_VERSION)
|
|
236
|
-
raise "Terraform #{terraform_version} is out of date, please upgrade"
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
def settings
|
|
241
|
-
{} # override me to pass more variables into the terraform plan.
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
def asg_launch_config_name(asg_name)
|
|
245
|
-
asg_client = Aws::AutoScaling::Client.new(region: 'us-east-1')
|
|
246
|
-
group = asg_client.describe_auto_scaling_groups(auto_scaling_group_names: [asg_name]).auto_scaling_groups.first
|
|
247
|
-
group.try(:launch_configuration_name)
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
def env_variable_keys
|
|
251
|
-
{} # override me to pass environmental variables into the terraform plan
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
def shared_plan_variables
|
|
255
|
-
if File.exist?(shared_state_path)
|
|
256
|
-
output_variables(shared_state_path)
|
|
257
|
-
else
|
|
258
|
-
{}
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
def fetch_terraform_modules
|
|
263
|
-
system "terraform get -update=true #{config_directory}"
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
def current_tfstate
|
|
267
|
-
return @current_tfstate if defined?(@current_tfstate)
|
|
268
|
-
raw_conf = File.read(state_path)
|
|
269
|
-
@current_tfstate = JSON.parse(raw_conf)
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
def read_config_file(path)
|
|
273
|
-
File.new('config/' + path).read
|
|
274
|
-
template = ERB.new File.new("config/#{path}").read, nil, "%"
|
|
275
|
-
template.result(OpenStruct.new(options).instance_eval { binding })
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
def dynect
|
|
279
|
-
@dynect ||= DynectRest.new("controlshiftlabs", ENV['DYNECT_USERNAME'], ENV['DYNECT_PASSWORD'], "controlshiftlabs.com")
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
def dns_record_exists?(parent_node_fqdn, record)
|
|
283
|
-
dynect.node_list(nil, parent_node_fqdn).include?(record.fqdn)
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
private
|
|
287
|
-
|
|
288
|
-
def parse_key_value_variables(vars_string)
|
|
289
|
-
vars = {}
|
|
290
|
-
vars_string.split("\n").each do |string_var|
|
|
291
|
-
next if string_var.blank?
|
|
292
|
-
key, value = string_var.split("=")
|
|
293
|
-
vars[key.strip] = value.strip.gsub('"', '')
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
vars
|
|
297
|
-
end
|
|
298
|
-
end
|
|
299
|
-
end
|