hashicorptools 0.0.7 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d826c8e7a72e6a5229d4b7650689ea65b751319a
4
- data.tar.gz: b28dba48ac700d728f46dda423e4342707564cc6
2
+ SHA256:
3
+ metadata.gz: 75178f2878dffffbcca566e4ed6fa81c9cc612f55b601adf82a5a31da8492e74
4
+ data.tar.gz: 47fef27c27f49f242188b474872ef4b57128e8998e9a277de2c19f6752a74759
5
5
  SHA512:
6
- metadata.gz: de41ed4cbae046e4a308553be81156a095a70c39a243b0f5c6c554180e3922917740b4b62b0fec5adbf9207348fb727d31ccd78fcf46a052eb1eb7a4b153b35d
7
- data.tar.gz: 937d599532610b2870238e9529fc213690ffd76497def92dcbd1da25e8b0557828cca3a6ca927723c0614cb891bb99d2222302e16e8ab170d4cd4df91ef2cd41
6
+ metadata.gz: 75d5ca009f079b41864ec1e5d66b1d6a2e88dcbab943ee2aff7f7cb869a41e667ef32483c0de2c865fe885f5c9d726c6c32122d79a3f7077fa7eec418de111de
7
+ data.tar.gz: d346e24bc5ae25eb45e9406894701d96095d75eec0b40838cd85e647943b6c21a019913a21bb4ba51f9426d9bfa56fbee0cd0b80e90bf0b2bf73b75d62f24996
@@ -0,0 +1 @@
1
+ hashicorptools
@@ -0,0 +1 @@
1
+ ruby-2.6.6
@@ -1,3 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "2.2.5"
3
+ - "2.6.6"
4
+ # TravisCI uses Bundler 1 by default, but we want Bundler 2
5
+ # https://docs.travis-ci.com/user/languages/ruby/#bundler-20
6
+ before_install:
7
+ - gem install bundler
data/Gemfile CHANGED
@@ -3,21 +3,19 @@ source "http://rubygems.org"
3
3
  # try to slowly migrate to v2 of the aws api
4
4
  gem 'aws-sdk', '~> 2'
5
5
 
6
- gem 'dynect_rest'
6
+ gem 'dynect_rest', '= 0.4.6'
7
7
 
8
- gem 'aws-sdk-v1'
9
- gem 'dotenv'
10
- gem 'thor'
11
- gem 'activesupport'
12
- gem 'byebug'
13
- gem 'git'
8
+ gem 'aws-sdk-v1', '~> 1.67'
9
+ gem 'dotenv', '~> 2.2', '>= 2.2.1'
10
+ gem 'thor', '= 0.20.0'
11
+ gem 'activesupport', '~> 5.1', '>= 5.1.4'
12
+ gem 'byebug', '~> 10.0', '>= 10.0.2'
13
+ gem 'git', '~> 1.3'
14
14
 
15
- # Add dependencies to develop your gem here.
16
- # Include everything needed to run rake, tests, features, etc.
17
15
  group :development do
18
- gem "rspec", "~> 2.8.0"
19
- gem "rdoc", "~> 3.12"
20
- gem "bundler", "~> 1.0"
21
- gem "jeweler", "~> 2.0.1"
22
- gem "simplecov", ">= 0"
16
+ gem 'rspec', '~> 3.7'
17
+ gem 'rdoc', '~> 3.12'
18
+ gem 'bundler', '~> 2.0'
19
+ gem 'juwelier', '~> 2.4', '>= 2.4.7'
20
+ gem 'simplecov', '>= 0'
23
21
  end
data/README.md CHANGED
@@ -11,8 +11,7 @@ Wraps the packer product from hashicorp with standard configuration.
11
11
 
12
12
  ## terraform wrapper
13
13
 
14
- Wraps the terraform product from hashicorp with standard conventions for encrypting tfstate and segmenting production
15
- and staging environments.
14
+ Wraps the terraform product from hashicorp with segmented production and staging environments.
16
15
 
17
16
 
18
17
  Copyright (c) 2015 ChangeSprout Inc. See LICENSE for
data/Rakefile CHANGED
@@ -11,8 +11,8 @@ rescue Bundler::BundlerError => e
11
11
  end
12
12
  require 'rake'
13
13
 
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
14
+ require 'juwelier'
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
18
  gem.homepage = "http://github.com/woodhull/hashicorptools"
@@ -21,10 +21,10 @@ Jeweler::Tasks.new do |gem|
21
21
  gem.description = %Q{Wrappers for terraform and packer}
22
22
  gem.email = "systems@controlshiftlabs.com"
23
23
  gem.authors = ["Nathan Woodhull"]
24
- gem.executables = ['ec2_host']
24
+ gem.executables = ['ec2_host']
25
25
  # dependencies defined in Gemfile
26
26
  end
27
- Jeweler::RubygemsDotOrgTasks.new
27
+ Juwelier::RubygemsDotOrgTasks.new
28
28
 
29
29
  require 'rspec/core'
30
30
  require 'rspec/core/rake_task'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.3.0
@@ -1,98 +1,98 @@
1
- # Generated by jeweler
1
+ # Generated by juwelier
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
3
+ # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: hashicorptools 0.0.7 ruby lib
5
+ # stub: hashicorptools 0.3.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
- s.name = "hashicorptools"
9
- s.version = "0.0.7"
8
+ s.name = "hashicorptools".freeze
9
+ s.version = "0.3.0"
10
10
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["Nathan Woodhull"]
14
- s.date = "2016-08-22"
15
- s.description = "Wrappers for terraform and packer"
16
- s.email = "systems@controlshiftlabs.com"
17
- s.executables = ["ec2_host"]
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Nathan Woodhull".freeze]
14
+ s.date = "2020-06-18"
15
+ s.description = "Wrappers for terraform and packer".freeze
16
+ s.email = "systems@controlshiftlabs.com".freeze
17
+ s.executables = ["ec2_host".freeze]
18
18
  s.extra_rdoc_files = [
19
19
  "LICENSE",
20
20
  "README.md"
21
21
  ]
22
22
  s.files = [
23
+ ".ruby-gemset",
24
+ ".ruby-version",
23
25
  ".travis.yml",
24
26
  "Gemfile",
25
- "Gemfile.lock",
26
27
  "LICENSE",
27
28
  "README.md",
28
29
  "Rakefile",
29
30
  "VERSION",
30
31
  "bin/ec2_host",
31
- "data/standard-ami.json",
32
32
  "hashicorptools.gemspec",
33
33
  "lib/hashicorptools.rb",
34
+ "lib/hashicorptools/ami_configs/standard-ami.json",
34
35
  "lib/hashicorptools/auto_scaling_group.rb",
35
36
  "lib/hashicorptools/code_deploy.rb",
36
37
  "lib/hashicorptools/ec2_utilities.rb",
37
38
  "lib/hashicorptools/host.rb",
38
39
  "lib/hashicorptools/packer.rb",
39
- "lib/hashicorptools/terraform.rb",
40
40
  "lib/hashicorptools/update_launch_configuration.rb",
41
41
  "lib/hashicorptools/variables.rb",
42
42
  "spec/hashicorptools_spec.rb",
43
43
  "spec/spec_helper.rb"
44
44
  ]
45
- s.homepage = "http://github.com/woodhull/hashicorptools"
46
- s.licenses = ["MIT"]
47
- s.rubygems_version = "2.4.8"
48
- s.summary = "Wrappers for terraform and packer"
45
+ s.homepage = "http://github.com/woodhull/hashicorptools".freeze
46
+ s.licenses = ["MIT".freeze]
47
+ s.rubygems_version = "3.0.3".freeze
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
52
 
53
53
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
- s.add_runtime_dependency(%q<aws-sdk>, ["~> 2"])
55
- s.add_runtime_dependency(%q<dynect_rest>, [">= 0"])
56
- s.add_runtime_dependency(%q<aws-sdk-v1>, [">= 0"])
57
- s.add_runtime_dependency(%q<dotenv>, [">= 0"])
58
- s.add_runtime_dependency(%q<thor>, [">= 0"])
59
- s.add_runtime_dependency(%q<activesupport>, [">= 0"])
60
- s.add_runtime_dependency(%q<byebug>, [">= 0"])
61
- s.add_runtime_dependency(%q<git>, [">= 0"])
62
- s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
63
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
64
- s.add_development_dependency(%q<bundler>, ["~> 1.0"])
65
- s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
66
- s.add_development_dependency(%q<simplecov>, [">= 0"])
54
+ s.add_runtime_dependency(%q<aws-sdk>.freeze, ["~> 2"])
55
+ s.add_runtime_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
56
+ s.add_runtime_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
57
+ s.add_runtime_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
58
+ s.add_runtime_dependency(%q<thor>.freeze, ["= 0.20.0"])
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"])
61
+ s.add_runtime_dependency(%q<git>.freeze, ["~> 1.3"])
62
+ s.add_development_dependency(%q<rspec>.freeze, ["~> 3.7"])
63
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
64
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 2.0"])
65
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
66
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
67
67
  else
68
- s.add_dependency(%q<aws-sdk>, ["~> 2"])
69
- s.add_dependency(%q<dynect_rest>, [">= 0"])
70
- s.add_dependency(%q<aws-sdk-v1>, [">= 0"])
71
- s.add_dependency(%q<dotenv>, [">= 0"])
72
- s.add_dependency(%q<thor>, [">= 0"])
73
- s.add_dependency(%q<activesupport>, [">= 0"])
74
- s.add_dependency(%q<byebug>, [">= 0"])
75
- s.add_dependency(%q<git>, [">= 0"])
76
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
77
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
78
- s.add_dependency(%q<bundler>, ["~> 1.0"])
79
- s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
80
- s.add_dependency(%q<simplecov>, [">= 0"])
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
81
  end
82
82
  else
83
- s.add_dependency(%q<aws-sdk>, ["~> 2"])
84
- s.add_dependency(%q<dynect_rest>, [">= 0"])
85
- s.add_dependency(%q<aws-sdk-v1>, [">= 0"])
86
- s.add_dependency(%q<dotenv>, [">= 0"])
87
- s.add_dependency(%q<thor>, [">= 0"])
88
- s.add_dependency(%q<activesupport>, [">= 0"])
89
- s.add_dependency(%q<byebug>, [">= 0"])
90
- s.add_dependency(%q<git>, [">= 0"])
91
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
92
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
93
- s.add_dependency(%q<bundler>, ["~> 1.0"])
94
- s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
95
- s.add_dependency(%q<simplecov>, [">= 0"])
83
+ s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
84
+ s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
85
+ s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
86
+ s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
87
+ s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
88
+ s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
89
+ s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
90
+ s.add_dependency(%q<git>.freeze, ["~> 1.3"])
91
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
92
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
93
+ s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
94
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
95
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
96
96
  end
97
97
  end
98
98
 
@@ -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'
@@ -0,0 +1,60 @@
1
+ {
2
+ "builders": [
3
+ {
4
+ "access_key": "{{user `aws_access_key`}}",
5
+ "ami_name": "{{user `ami_tag`}} {{timestamp}}",
6
+ "associate_public_ip_address": true,
7
+ "ena_support": true,
8
+ "instance_type": "c5.large",
9
+ "launch_block_device_mappings": [
10
+ {
11
+ "delete_on_termination": true,
12
+ "device_name": "/dev/sda1",
13
+ "volume_size": 8,
14
+ "volume_type": "gp2"
15
+ }
16
+ ],
17
+ "region": "us-east-1",
18
+ "ami_regions": ["us-east-1", "eu-central-1"],
19
+ "run_tags": {
20
+ "kind": "packer",
21
+ "role": "AMI builder"
22
+ },
23
+ "secret_key": "{{user `aws_secret_key`}}",
24
+ "source_ami": "{{user `source_ami`}}",
25
+ "ssh_interface": "public_ip",
26
+ "ssh_username": "ubuntu",
27
+ "subnet_id": "{{user `subnet_id`}}",
28
+ "tags": {
29
+ "Name": "{{user `ami_tag`}}",
30
+ "created_at": "{{isotime}}",
31
+ "parent_ami": "{{user `source_ami`}}"
32
+ },
33
+ "type": "amazon-ebs",
34
+ "vpc_id": "{{user `vpc_id`}}"
35
+ }
36
+ ],
37
+ "post-processors": [],
38
+ "provisioners": [
39
+ {
40
+ "cookbook_paths": [
41
+ "cookbooks",
42
+ "site-cookbooks"
43
+ ],
44
+ "run_list": [
45
+ "{{user `cookbook_name`}}"
46
+ ],
47
+ "skip_install": true,
48
+ "type": "chef-solo"
49
+ }
50
+ ],
51
+ "variables": {
52
+ "ami_tag": "",
53
+ "aws_access_key": "",
54
+ "aws_secret_key": "",
55
+ "cookbook_name": "",
56
+ "source_ami": "",
57
+ "subnet_id": "",
58
+ "vpc_id": ""
59
+ }
60
+ }
@@ -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|
@@ -24,12 +24,13 @@ module Hashicorptools
24
24
  end
25
25
 
26
26
  puts "waiting for scaling events to finish"
27
- groups.each do |group|
28
- wait_for_activities_to_complete(group)
27
+ wait_for_activities_to_complete(group)
28
+ puts "all scaling activities finished."
29
+
30
+ if desired_instances > 0
31
+ wait_until_instances_ready
32
+ puts "all #{desired_instances} instances ready."
29
33
  end
30
- puts "all #{desired_instances} scaling activities successful."
31
- wait_until_instances_ready
32
- puts "all #{desired_instances} instances ready."
33
34
  end
34
35
 
35
36
  def wait_until_instances_ready
@@ -89,6 +90,15 @@ module Hashicorptools
89
90
  end
90
91
  end
91
92
 
93
+ def verify_all_instances_using_correct_ami
94
+ launch_configuration = Aws::AutoScaling::LaunchConfiguration.new(name: group.launch_configuration_name, client: autoscaling)
95
+ image_id = launch_configuration.image_id
96
+ group.instances.each do |i|
97
+ instance = Aws::EC2::Instance.new(i.instance_id, client: ec2)
98
+ raise "#{i.instance_id} has the incorrect AMI, not #{image_id} from current LaunchConfig" if instance.image_id != image_id
99
+ end
100
+ end
101
+
92
102
  private
93
103
 
94
104
  def wait_for_activities_to_complete(group)
@@ -105,15 +115,15 @@ module Hashicorptools
105
115
  end
106
116
 
107
117
  def autoscaling
108
- @autoscaling ||= Aws::AutoScaling::Client.new(region: 'us-east-1')
118
+ @autoscaling ||= Aws::AutoScaling::Client.new(region: region)
109
119
  end
110
120
 
111
121
  def ec2
112
- @ec2 ||= Aws::EC2::Client.new(region: 'us-east-1')
122
+ @ec2 ||= Aws::EC2::Client.new(region: region)
113
123
  end
114
124
 
115
125
  def elb
116
- @elb ||= Aws::ElasticLoadBalancing::Client.new(region: 'us-east-1')
126
+ @elb ||= Aws::ElasticLoadBalancing::Client.new(region: region)
117
127
  end
118
128
 
119
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, default: 'master'
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=#{ENV['AWS_REGION']}#/deployments/#{response.deployment_id}"
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
@@ -5,17 +5,19 @@ module Hashicorptools
5
5
  end
6
6
 
7
7
  def amis(tag = tag_name)
8
- sort_by_created_at( ec2.images.with_owner('self').tagged(tag).to_a, tag )
8
+ sort_by_created_at( ec2.images.with_owner('self').with_tag('Name', tag).to_a )
9
9
  end
10
10
 
11
11
  def ec2
12
+ return @_ec2 unless @_ec2.nil?
13
+
12
14
  reg = if self.methods.include?(:region)
13
15
  self.region
14
16
  else
15
17
  'us-east-1'
16
18
  end
17
19
 
18
- AWS::EC2.new(region: reg)
20
+ @_ec2 = AWS::EC2.new(region: reg)
19
21
  end
20
22
 
21
23
  def vpc_with_name(name)
@@ -28,16 +30,8 @@ module Hashicorptools
28
30
  igs.first
29
31
  end
30
32
 
31
- def image_created_at(image, tag= tag_name)
32
- if image
33
- image.tags.to_h[tag].to_i
34
- else
35
- 0
36
- end
37
- end
38
-
39
- def sort_by_created_at(collection, tag = tag_name)
40
- collection.sort{|a, b| self.image_created_at(b, tag) <=> self.image_created_at(a, tag) }
33
+ def sort_by_created_at(collection)
34
+ collection.sort{|a, b| b.creation_date <=> a.creation_date }
41
35
  end
42
36
  end
43
37
  end