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