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.