hashicorptools 0.0.7 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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