class Hashicorptools::Packer

Public Class Methods

exit_on_failure?() click to toggle source
# File lib/hashicorptools/packer.rb, line 11
def self.exit_on_failure?
  true
end

Public Instance Methods

boot() click to toggle source
# File lib/hashicorptools/packer.rb, line 68
def boot
  run_instances_resp = ec2.run_instances({
    image_id: current_ami('base-image').image_id,
    min_count: 1,
    max_count: 1,
    instance_type: "t2.micro"
  })

  ec2.create_tags({
    resources: run_instances_resp.instances.collect(&:instance_id),
    tags: [ {key: 'Name', value: "packer test boot #{tag_name}"},
            {key: 'environment', value: 'packer-development'},
            {key: 'temporary', value: 'kill me'}]
  })

  require 'byebug'
  byebug
end
build() click to toggle source
# File lib/hashicorptools/packer.rb, line 17
def build
  _build
end
clean() click to toggle source
# File lib/hashicorptools/packer.rb, line 45
def clean
  clean_amis
end
clean_snapshots() click to toggle source
# File lib/hashicorptools/packer.rb, line 50
def clean_snapshots
  snapshots = ec2.describe_snapshots({owner_ids: ['self']}).snapshots
  snapshots.each do |snapshot|
    match = snapshot.description.match(/Created by CreateImage\(.+\) for (ami-[0-9a-f]+) from vol-.+/)
    if match.nil?
      puts "Skipping #{snapshot.id} - #{snapshot.description}"
      next
    end

    ami_id = match[1]
    unless Aws::EC2::Image.new(ami_id, region: region).exists?
      puts "Removing obsolete snapshot #{snapshot.snapshot_id} - #{snapshot.description}"
      ec2.delete_snapshot({snapshot_id: snapshot.snapshot_id})
    end
  end
end
console() click to toggle source
# File lib/hashicorptools/packer.rb, line 32
def console
  require 'byebug'
  byebug
end
fix() click to toggle source
# File lib/hashicorptools/packer.rb, line 27
def fix
  system "packer fix #{ami_config_path}"
end
list() click to toggle source
# File lib/hashicorptools/packer.rb, line 38
def list
  amis_in_region(region).each do |ami|
    puts ami.image_id
  end
end
validate() click to toggle source
# File lib/hashicorptools/packer.rb, line 22
def validate
  system "packer validate #{ami_config_path}"
end

Protected Instance Methods

_build(settings_overrides={}) click to toggle source
# File lib/hashicorptools/packer.rb, line 89
def _build(settings_overrides={})
  settings_overrides.merge!({source_ami: source_ami_id, vpc_id: ami_building_vpc_id, subnet_id: ami_building_subnet_id, ami_tag: tag_name, cookbook_name: cookbook_name})

  if options[:debug]
    puts "[DEBUG] Executing 'packer build -debug #{variables(settings_overrides)} #{ami_config_path}'"
    system "packer build -debug \
      #{variables(settings_overrides)} \
      #{ami_config_path}" or exit(1)
  else
    system "packer build \
      #{variables(settings_overrides)} \
      #{ami_config_path}" or exit(1)
  end

  clean_amis
end
ami_building_subnet_id() click to toggle source
# File lib/hashicorptools/packer.rb, line 114
def ami_building_subnet_id
  ec2.describe_subnets({filters: [{name: "vpc-id", values: [ami_building_vpc_id]}]}).subnets.first.subnet_id
end
ami_building_vpc_id() click to toggle source
# File lib/hashicorptools/packer.rb, line 110
def ami_building_vpc_id
  vpc_with_name('ami-building').vpc_id
end
ami_config_path() click to toggle source
# File lib/hashicorptools/packer.rb, line 130
def ami_config_path
  File.expand_path('../ami_configs/standard-ami.json', __FILE__)
end
ami_regions() click to toggle source
# File lib/hashicorptools/packer.rb, line 156
def ami_regions
  ['us-east-1', 'eu-central-1']
end
amis_in_region(ami_region) click to toggle source
# File lib/hashicorptools/packer.rb, line 195
def amis_in_region(ami_region)
  images = regional_ec2_client(ami_region).describe_images({
    owners: ['self'],
    filters: [{name: 'tag:Name', values: [tag_name]}]
  }).images
  sort_by_created_at(images)
end
amis_in_use(client_region) click to toggle source
# File lib/hashicorptools/packer.rb, line 147
def amis_in_use(client_region)
  launch_configs = auto_scaling(client_region).describe_launch_configurations
  image_ids = launch_configs.data['launch_configurations'].collect{|lc| lc.image_id}.flatten

  ec2_reservations = regional_ec2_client(client_region).describe_instances
  image_ids << ec2_reservations.reservations.collect{|res| res.instances.collect{|r| r.image_id}}.flatten
  image_ids.flatten
end
auto_scaling(client_region=region) click to toggle source
# File lib/hashicorptools/packer.rb, line 138
def auto_scaling(client_region=region)
  @auto_scaling ||= Aws::AutoScaling::Client.new(region: client_region)
end
clean_amis() click to toggle source
# File lib/hashicorptools/packer.rb, line 160
def clean_amis
  ami_regions.each do |ami_region|
    clean_amis_for_region(ami_region)
  end
end
clean_amis_for_region(region_to_clean) click to toggle source
# File lib/hashicorptools/packer.rb, line 166
def clean_amis_for_region(region_to_clean)
  ami_ids = amis_in_region(region_to_clean).collect{|a| a.image_id}
  ami_ids_to_remove = ami_ids - amis_in_use(region_to_clean)
  potential_amis_to_remove = amis_in_region(region_to_clean)
  potential_amis_to_remove.keep_if {|a| ami_ids_to_remove.include?(a.image_id) }

  if potential_amis_to_remove.size > NUMBER_OF_AMIS_TO_KEEP
    amis_to_remove = potential_amis_to_remove[NUMBER_OF_AMIS_TO_KEEP..-1]
    amis_to_keep = potential_amis_to_remove[0..(NUMBER_OF_AMIS_TO_KEEP-1)]

    puts "Deregistering old AMIs in #{region_to_clean}..."
    amis_to_remove.each do |ami|
      ebs_mappings = ami.block_device_mappings
      puts "Deregistering #{ami.image_id}"
      regional_ec2_client(region_to_clean).deregister_image({
        image_id: ami.image_id
      })
      delete_ami_snapshots(ebs_mappings, snapshot_region: region_to_clean)
    end

    puts "Currently active AMIs..."
    amis_to_keep.each do |ami|
      puts ami.image_id
    end
  else
    puts "no AMIs to clean in #{region_to_clean}."
  end
end
cookbook_name() click to toggle source
# File lib/hashicorptools/packer.rb, line 126
def cookbook_name
  raise 'implement me'
end
delete_ami_snapshots(ebs_mappings, snapshot_region:) click to toggle source
# File lib/hashicorptools/packer.rb, line 203
def delete_ami_snapshots(ebs_mappings, snapshot_region:)
  ec2_client = regional_ec2_client(snapshot_region)

  ebs_mappings.each do |ebs_mapping|
    unless ebs_mapping.ebs.nil?
      puts "Deleting snapshot #{ebs_mapping.ebs.snapshot_id}"
      ec2_client.delete_snapshot({snapshot_id: ebs_mapping.ebs.snapshot_id})
    end
  end
end
format_variable(key, value) click to toggle source
# File lib/hashicorptools/packer.rb, line 118
def format_variable(key, value)
  "-var '#{key}=#{value}'"
end
region() click to toggle source
# File lib/hashicorptools/packer.rb, line 134
def region
  'us-east-1'
end
regional_ec2_client(client_region=region) click to toggle source
# File lib/hashicorptools/packer.rb, line 142
def regional_ec2_client(client_region=region)
  @_regional_ec2_clients = {} if @_regional_ec2_clients.nil?
  @_regional_ec2_clients[client_region] ||= Aws::EC2::Client.new(region: client_region)
end
source_ami_id() click to toggle source
# File lib/hashicorptools/packer.rb, line 106
def source_ami_id
  current_ami('base-image').image_id
end
tag_name() click to toggle source
# File lib/hashicorptools/packer.rb, line 122
def tag_name
  raise 'implement me'
end