Repetitio est mater studiorumOld Latin proverb
If you periodically have to collect images of Linux-based operating systems for different virtualization environments or even clouds, or, especially, you use 
Vagrant , then you should look at the new tool from Mitchell Hashimoto (this is the creator of Vagrant) 
Packer .
Packer is a tool for creating identical OS images for different platforms from the same description.
')
Long ago, 
Patrick Deboise (this is the man who coined the term DevOps) wrote 
Veewee - a tool that allows you to automatically create an image for VirtualBox, KVM and VMWare.
Packer went further, and allows you to do the same for common cloud providers: 
Amazon , 
DigitalOcean , 
OpenStack and 
GCE . Also Packer allows you to create containers for 
Docker .
Immediately answer the main question - why it may be needed. Recently, the topic has been actively discussed.
unchanged server ( 
Immutable Server ). We even 
dedicated her to the release of the podcast Devops Deflop . The fact is that all configuration management systems do not allow controlling the “identicalness” of different machines to the end. Then the idea arose to create machines and never change their configuration. And if necessary, create them again with a new configuration.
Packer is exactly what makes it easy to create images of cars in automatic mode.
Let's make an image with Ubuntu 12.04 for VirtualBox to see how easy it is.
First, we need to put 
VirtaulBox and 
packer versions older than 0.5.1 . I am sure this step will not cause difficulties.
Next you need to create a configuration file for the packer, which should look something like this:
{ "provisioners": [ { "type": "shell", "scripts": [ "scripts/postinstall.sh" ], "override": { "virtualbox-iso": { "execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}'" } } } ], "builders": [ { "type": "virtualbox-iso", "boot_command": [ "<esc><esc><enter><wait>", "/install/vmlinuz noapic preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>", "debian-installer=en_US auto locale=en_US kbd-chooser/method=us <wait>", "hostname=ubuntu <wait>", "fb=false debconf/frontend=noninteractive <wait>", "keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false <wait>", "initrd=/install/initrd.gz -- <enter><wait>" ], "boot_wait": "4s", "disk_size": 51200, "guest_os_type": "Ubuntu_64", "http_directory": "http", "iso_checksum_type": "md5", "iso_url": "http://releases.ubuntu.com/precise/ubuntu-12.04.4-server-amd64.iso", "iso_checksum": "e83adb9af4ec0a039e6a5c6e145a34de", "ssh_username": "vagrant", "ssh_password": "vagrant", "ssh_port": 22, "http_directory" : ".", "http_port_min" : 9001, "http_port_max" : 9001, "ssh_wait_timeout": "10000s", "shutdown_command": "echo 'shutdown -P now' > shutdown.sh; echo 'vagrant'|sudo -S sh 'shutdown.sh'", "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso", "virtualbox_version_file": ".vbox_version", "vboxmanage": [ [ "modifyvm", "{{.Name}}", "--memory", "512" ], [ "modifyvm", "{{.Name}}", "--cpus", "1" ] ] } ], "post-processors": [ "vagrant" ] } 
It says that we take a standard Ubuntu image ( 
iso_url key), install it using a set of commands from 
preseed.cfg , and then execute the 
postinstall.sh script inside, which installs a chef and prepares the box for working with the vagrant. It makes no sense 
to bring all the files here, it's easier to see the 
repository on the githab (it contains all the necessary files in 
the packer folder ).
Next, execute the 
packer build ubuntu64.json , and carefully observe how the installer automatically puts Ubuntu.

If everything went well, then as a result you will have a file 
packer_virtualbox-iso_virtualbox.box - an image that can be used in Vagrant.
Learn more about Vagrant in 
our previous article . And on March 15, as always free of charge, the next 
DevOps Moscow community meeting will be held in the office of 
Parallels , which will be dedicated to the vagrant. If you sign up at 
meetup.com , then notifications about new meetings will come to you automatically.
We import our fresh box in Vagrant and initialize the clean Vagrant environment.
 vagrant box add from_packer packer_virtualbox-iso_virtualbox.box cd .. vagrant init 
After that we will fix one line in 
Vagrantfile , namely 
config.vm.box = "from_packer" (all this is in the test repository).
 vagrant up vagrant ssh Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.8.0-29-generic x86_64) * Documentation: https://help.ubuntu.com/ Last login: Sat Feb 8 18:01:24 2014 from 10.0.2.2 vagrant@ubuntu:~$ 
So, it is easy and simple, we have Ubunt 12.04 with the latest updates and installed the most recent chef.
With the help of simple actions, the 
postinstall.sh script can be replaced with any other script, as well as launching 
chef-solo , 
puppet apply, and 
much more .
With packer, the creation of new images for different environments is transformed from a complex and dreary job into a simple and repeatable process with a predictable result.
For an easy start, Chef has prepared a large number of packer templates for various Linux distributions and called them 
bento .
Do not forget that the current members of the crew of the 
Express 42 spaceship will land at Evil Martians on March 22 and 23 to 
brainwash everyone , namely, to tell and show how to use DevOps practices and tools in harmony with the Great Cosmos.
List of articles on the subject of the Packer in English, which seemed to me interesting.