Virtual machines running on in clouds are based on virtual machine images. Typically, a cloud will provide a selection of virtual machine images that can be modified by users. However, this is a complicated task that is best automated, especially when using multiple clouds.
Several tools exist in order to build virtual machine images. They can be classified in two categories depending on how they perform the image creation: full installation or bootstrap.
BoxGrinder creates appliances (virtual machines) from simple plain text appliance definition files for various virtual platforms. It is heavily linked to the Red Hat ecosystem: the only distributions supported for the builder (also called meta-appliance) are Fedora and RHEL/CentOS.
BoxGrinder can produce images for various platforms: Amazon EC2, KVM, VirtualBox, VMware. However, it appears to be limited to producing Fedora and RHEL/CentOS images. It allows to specify a list of packages to install, files to include in the image, and commands to run during post-installation.
A meta-appliance is available on EC2 to build images without having to install and configure BoxGrinder.
BoxGrinder first builds the image by creating an empty disk, formatting it, mounting it on the host and installing packages directly there. This allows to build images more quickly than a full install like veewee does. Post-install setup is performed by libguestfs. After being created, the image (in raw format) is converted to the final format (VirtualBox, VMware, etc.). Finally, the VM image can be copied to a remove location (SFTP, S3, etc.)
Ubuntu VMBuilder (bootstrap)
VMBuilder is a Python script that creates Ubuntu virtual machine images. It creates Ubuntu images using debootstrap. It can create images for Xen, KVM, VMware, and AMIs.
veewee (full installation)
veewee is a tool to make it easier to build vagrant boxes. It also supports KVM, VirtualBox, and VMware Fusion images.
veewee comes bundled with definitions to generate images using many different Linux distributions, including CentOS, Debian, Fedora, Ubuntu, etc. It also supports installation of several versions of Windows.
It creates images by downloading an install media (an ISO image) and booting a fresh virtual machine on it. The installation is scripted with keyboard input and kickstart/preseed files.
Finally, some additional sofware is installed in the virtual image: chef, puppet, virtual box guest tools. After that the image is ready to be used with vagrant.
Oz (full installation)
Oz can install various operating systems in virtual machines using the original installation tools. It supports many OS such as Fedora, Debian, Ubuntu, Windows, etc. It also allows the customization of VM images as a separate step. This is described in the Oz architecture documentation.