Terry : Packer

What is Packer?

Packer is an open source tool for creating identical machine images for multiple platforms from a single source configuration. Packer is lightweight, runs on every major operating system, and is highly performant, creating machine images for multiple platforms in parallel. Packer does not replace configuration management like Chef or Puppet. In fact, when building images, Packer is able to use tools like Chef or Puppet to install software onto the image.

A machine image is a single static unit that contains a pre-configured operating system and installed software which is used to quickly create new running machines. Machine image formats change for each platform. Some examples include AMIs for EC2, VMDK/VMX files for VMware, OVF exports for VirtualBox, etc.

Advantages of Using Packer

  • Super fast infrastructure deployment
    Packer images allow you to launch completely provisioned and configured machines in seconds, rather than several minutes or hours. This benefits not only production, but development as well, since development virtual machines can also be launched in seconds, without waiting for a typically much longer provisioning time.
  • Multi-provider portability
    Because Packer creates identical images for multiple platforms, you can run production in AWS, staging/QA in a private cloud like OpenStack, and development in desktop virtualization solutions such as VMware or VirtualBox. Each environment is running an identical machine image, giving ultimate portability.
  • Improved stability
    Packer installs and configures all the software for a machine at the time the image is built. If there are bugs in these scripts, they'll be caught early, rather than several minutes after a machine is launched.
  • Greater testability
    After a machine image is built, that machine image can be quickly launched and smoke tested to verify that things appear to be working. If they are, you can be confident that any other machines launched from that image will function properly.

Supported Platforms

  • Amazon EC2 (AMI)
    Both EBS-backed and instance-store AMIs within EC2, optionally distributed to multiple regions.
  • Digital Ocean
    Snapshots for DigitalOcean that can be used to start a pre-configured DigitalOcean instance of any size.
  • Docker
    Snapshots for Docker that can be used to start a pre-configured Docker instance.
  • Google Compute Engine
    Snapshots for Google Compute Engine that can be used to start a pre-configured Google Compute Engine instance.
  • OpenStack
    Images for OpenStack that can be used to start pre-configured OpenStack servers.
  • QEMU
    Images for KVM or Xen that can be used to start pre-configured KVM or Xen instances.
  • VirtualBox (OVF)
    Exported virtual machines for VirtualBox, including virtual machine metadata such as RAM, CPUs, etc. These virtual machines are portable and can be started on any platform VirtualBox runs on.
  • VMware (VMX)
    Exported virtual machines for VMware that can be run within any desktop products such as Fusion, Player, or Workstation, as well as server products such as vSphere.

Install Packer

Download the binaries from here http://www.packer.io/downloads.html

For example, Linux amd64 -> 0.5.2_linux_amd64.zip

Unzip it to /path/to/packer

Run to verify

$ ./packer
usage: packer [--version] [--help] <command> [<args>]
Available commands are:
    build       build image(s) from template
    fix         fixes templates from old versions of packer
    inspect     see components of a template
    validate    check that a template is valid
Globally recognized options:
    -machine-readable    Machine-readable output format.
terry@tesla:/tmp/ramfs/bento/packer$ ./packer --version
Packer v0.5.2
terry@tesla:/tmp/ramfs/bento/packer$

Get the Packer Templates

Checkout Opscode bento reposiotry from GitHub

git clone https://github.com/opscode/bento.git

Copy the packer binaries into bento/packer

rsync -av --progress --stats /path/to/packer/ /path/to/bento/packer/ 

Get Started

To override a mirror

packer build -var 'mirror=http://ftp.iinet.net.au/debian/debian-cd/7.6.0/amd64/iso-cd/' debian-7.6.0-amd64.json

Build a Debian 7.4 i386

 $ ./packer build -only=virtualbox-iso debian-7.4-i386.json
virtualbox-iso output will be in this color.
==> virtualbox-iso: Downloading or copying Guest additions checksums
    virtualbox-iso: Downloading or copying: http://download.virtualbox.org/virtualbox/4.3.8/SHA256SUMS
==> virtualbox-iso: Downloading or copying Guest additions
    virtualbox-iso: Downloading or copying: http://download.virtualbox.org/virtualbox/4.3.8/VBoxGuestAdditions_4.3.8.iso
    virtualbox-iso: Download progress: 23%
    virtualbox-iso: Download progress: 59%
    virtualbox-iso: Download progress: 92%
==> virtualbox-iso: Downloading or copying ISO
    virtualbox-iso: Downloading or copying: http://cdimage.debian.org/debian-cd/7.4.0/i386/iso-cd/debian-7.4.0-i386-CD-1.iso
    virtualbox-iso: Download progress: 0%
    virtualbox-iso: Download progress: 2%
    virtualbox-iso: Download progress: 5%
    virtualbox-iso: Download progress: 9%
    virtualbox-iso: Download progress: 12%
    virtualbox-iso: Download progress: 16%
    virtualbox-iso: Download progress: 19%
    virtualbox-iso: Download progress: 23%
    virtualbox-iso: Download progress: 26%
    virtualbox-iso: Download progress: 30%
    virtualbox-iso: Download progress: 33%
    virtualbox-iso: Download progress: 36%
    virtualbox-iso: Download progress: 40%
    virtualbox-iso: Download progress: 43%
    virtualbox-iso: Download progress: 47%
    virtualbox-iso: Download progress: 50%
    virtualbox-iso: Download progress: 54%
    virtualbox-iso: Download progress: 57%
    virtualbox-iso: Download progress: 61%
    virtualbox-iso: Download progress: 64%
    virtualbox-iso: Download progress: 68%
    virtualbox-iso: Download progress: 71%
    virtualbox-iso: Download progress: 75%
    virtualbox-iso: Download progress: 78%
    virtualbox-iso: Download progress: 82%
    virtualbox-iso: Download progress: 85%
    virtualbox-iso: Download progress: 89%
    virtualbox-iso: Download progress: 92%
    virtualbox-iso: Download progress: 96%
    virtualbox-iso: Download progress: 99%
==> virtualbox-iso: Starting HTTP server on port 8162
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Creating forwarded port mapping for SSH (host port 3509)
==> virtualbox-iso: Executing custom VBoxManage commands...
    virtualbox-iso: Executing: modifyvm packer-debian-7.4-i386 --memory 384
    virtualbox-iso: Executing: modifyvm packer-debian-7.4-i386 --cpus 1
==> virtualbox-iso: Starting the virtual machine...
==> virtualbox-iso: Waiting 10s for boot...
==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Waiting for SSH to become available...
==> virtualbox-iso: Connected to SSH!
==> virtualbox-iso: Uploading VirtualBox version info (4.3.8)
==> virtualbox-iso: Uploading VirtualBox guest additions ISO...
==> virtualbox-iso: Provisioning with shell script: scripts/debian/update.sh
    virtualbox-iso:
    virtualbox-iso: We trust you have received the usual lecture from the local System
    virtualbox-iso: Administrator. It usually boils down to these three things:
    virtualbox-iso:
    virtualbox-iso: #1) Respect the privacy of others.
    virtualbox-iso: #2) Think before you type.
    virtualbox-iso: #3) With great power comes great responsibility.
    virtualbox-iso:
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy Release.gpg
    virtualbox-iso: Hit http://security.debian.org wheezy/updates Release.gpg
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy-updates Release.gpg
    virtualbox-iso: Hit http://security.debian.org wheezy/updates Release
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy Release
    virtualbox-iso: Hit http://security.debian.org wheezy/updates/main Sources
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy-updates Release
    virtualbox-iso: Hit http://security.debian.org wheezy/updates/main i386 Packages
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy/main Sources
    virtualbox-iso: Hit http://security.debian.org wheezy/updates/main Translation-en
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy/main i386 Packages
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy/main Translation-en
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy-updates/main Sources
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy-updates/main i386 Packages/DiffIndex
    virtualbox-iso: Hit http://mirrors.kernel.org wheezy-updates/main Translation-en/DiffIndex
    virtualbox-iso: Reading package lists... Done
    virtualbox-iso: Reading package lists... Done
    virtualbox-iso: Building dependency tree
    virtualbox-iso: Reading state information... Done
    virtualbox-iso: 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
==> virtualbox-iso: Provisioning with shell script: scripts/common/sshd.sh
    virtualbox-iso: [sudo] password for vagrant:
==> virtualbox-iso: Provisioning with shell script: scripts/debian/networking.sh
    virtualbox-iso: [sudo] password for vagrant: rm: cannot remove `/etc/udev/rules.d/70-persistent-net.rules': No such file or directory
==> virtualbox-iso: Provisioning with shell script: scripts/debian/sudoers.sh
    virtualbox-iso: [sudo] password for vagrant:
==> virtualbox-iso: Provisioning with shell script: scripts/common/vagrant.sh
    virtualbox-iso: --2014-02-27 06:26:29--  https://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub
    virtualbox-iso: Resolving github.com (github.com)... 192.30.252.129
    virtualbox-iso: Connecting to github.com (github.com)|192.30.252.129|:443... connected.
    virtualbox-iso: HTTP request sent, awaiting response... 302 Found
    virtualbox-iso: Location: https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub [following]
    virtualbox-iso: --2014-02-27 06:26:31--  https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
    virtualbox-iso: Resolving raw.github.com (raw.github.com)... 103.245.222.133
    virtualbox-iso: Connecting to raw.github.com (raw.github.com)|103.245.222.133|:443... connected.
    virtualbox-iso: HTTP request sent, awaiting response... 200 OK
    virtualbox-iso: Length: 409 [text/plain]
    virtualbox-iso: Saving to: `/home/vagrant/.ssh/authorized_keys'
    virtualbox-iso:
    virtualbox-iso: 100% 409         --.-K/s   in 0s
    virtualbox-iso:
    virtualbox-iso: 2014-02-27 06:26:31 (3.38 MB/s) - `/home/vagrant/.ssh/authorized_keys' saved [409/409]
    virtualbox-iso:
==> virtualbox-iso: Provisioning with shell script: scripts/common/vmtools.sh
    virtualbox-iso: mount: block device /home/vagrant/VBoxGuestAdditions_4.3.8.iso is write-protected, mounting read-only
    virtualbox-iso: Verifying archive integrity... All good.
    virtualbox-iso: Uncompressing VirtualBox 4.3.8 Guest Additions for Linux............
    virtualbox-iso: VirtualBox Guest Additions installer
    virtualbox-iso: Copying additional installer modules ...
    virtualbox-iso: Installing additional modules ...
    virtualbox-iso: Removing existing VirtualBox DKMS kernel modules ...done.
    virtualbox-iso: Removing existing VirtualBox non-DKMS kernel modules ...done.
    virtualbox-iso: Building the VirtualBox Guest Additions kernel modules ...done.
    virtualbox-iso: Doing non-kernel setup of the Guest Additions ...done.
    virtualbox-iso: Starting the VirtualBox Guest Additions ...done.
    virtualbox-iso: Installing the Window System drivers
    virtualbox-iso: Could not find the X.Org or XFree86 Window System, skipping.
==> virtualbox-iso: Provisioning with shell script: scripts/common/chef.sh
    virtualbox-iso: Building a box without Chef
==> virtualbox-iso: Provisioning with shell script: scripts/debian/cleanup.sh
    virtualbox-iso: Reading package lists... Done
    virtualbox-iso: Building dependency tree
    virtualbox-iso: Reading state information... Done
    virtualbox-iso: 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
==> virtualbox-iso: Provisioning with shell script: scripts/common/minimize.sh
    virtualbox-iso:
    virtualbox-iso: Message from syslogd@packer-debian-7 at Feb 27 06:28:03 ...
    virtualbox-iso: kernel:[  122.668588] Process vminfo (pid: 5037, ti=d7808000 task=d49935e0 task.ti=d39de000)
    virtualbox-iso:
    virtualbox-iso: Message from syslogd@packer-debian-7 at Feb 27 06:28:03 ...
    virtualbox-iso: kernel:[  122.668588] Stack:
    virtualbox-iso:
    virtualbox-iso: Message from syslogd@packer-debian-7 at Feb 27 06:28:03 ...
    virtualbox-iso: kernel:[  122.668588] Call Trace:
    virtualbox-iso:
    virtualbox-iso: Message from syslogd@packer-debian-7 at Feb 27 06:28:03 ...
    virtualbox-iso: kernel:[  122.668588]  <IRQ>
    virtualbox-iso:
    virtualbox-iso: Message from syslogd@packer-debian-7 at Feb 27 06:28:03 ...
    virtualbox-iso: kernel:[  122.668588] Code: 24 8b 54 24 04 83 c4 08 5b 5e c3 90 90 3e 0f ab 02 19 c0 c3 9c 58 8d 74 26 00 c3 50 9d 8d 74 26 00 c3 fa 90 8d 74 26 00 c3 fb 90 <8d> 74 26 00 c3 3e 80 60 04 fd c3 c7 00 00 00 00 00 c7 40 04 00
    virtualbox-iso: dd: writing `/EMPTY': No space left on device
    virtualbox-iso: 38409+0 records in
    virtualbox-iso: 38408+0 records out
    virtualbox-iso: 40273756160 bytes (40 GB) copied, 313.606 s, 128 MB/s
==> virtualbox-iso: Gracefully halting virtual machine...
    virtualbox-iso: 
    virtualbox-iso: Broadcast message from root@packer-debian-7 (Thu Feb 27 06:32:20 2014):
    virtualbox-iso:
    virtualbox-iso: The system is going down for system halt NOW!
==> virtualbox-iso: Preparing to export machine...
    virtualbox-iso: Deleting forwarded port mapping for SSH (host port 3509)
==> virtualbox-iso: Exporting virtual machine...
==> virtualbox-iso: Unregistering and deleting virtual machine...
==> virtualbox-iso: Running post-processor: vagrant
==> virtualbox-iso (vagrant): Creating Vagrant box for 'virtualbox' provider
    virtualbox-iso (vagrant): Copying from artifact: packer-debian-7.4-i386-virtualbox/packer-debian-7.4-i386-disk1.vmdk
    virtualbox-iso (vagrant): Copying from artifact: packer-debian-7.4-i386-virtualbox/packer-debian-7.4-i386.ovf
    virtualbox-iso (vagrant): Renaming the OVF to box.ovf...
    virtualbox-iso (vagrant): Compressing: Vagrantfile
    virtualbox-iso (vagrant): Compressing: box.ovf
    virtualbox-iso (vagrant): Compressing: metadata.json
    virtualbox-iso (vagrant): Compressing: packer-debian-7.4-i386-disk1.vmdk
Build 'virtualbox-iso' finished.
==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: 'virtualbox' provider box: ../builds/virtualbox/opscode_debian-7.4-i386_chef-provisionerless.box

Done! Congratulations! The box is in the ../builds directory, ready to cook!

NOTE: Install ISO images are stored in packer_cache directory under bento/packer.

Reference

https://github.com/opscode/bento

http://packer.io

Packer Documentation