En esta lección se muestran más ejemplos de Packer con máquinas virtuales de VirtualBox.
Para actualizar la máquina virtual necesitamos:
packer build packer-2-1.json
Si el proceso termina correctamente, Packer creará el directorio packer-2-1 y creará en él el fichero packer-2-1-ubuntu-18-04-3-server.ova.
Documentación de packer: Shells provisioners
En una plantilla de packer, la sección que define la instalación y configuración de la máquina virtual se denomina proveedor (en inglés provisioner).
En la sección del constructores le indicamos a packer que utilice la imagen creada en el ejemplo anterior y el usuario creado en ella.
En la sección de proveedores le indicamos a packer que ejecute un par de comandos para actualizar el sistema.
Esta podría ser la plantilla de actualización de la máquina virtual:
{
"builders": [
{
"type": "virtualbox-ovf",
"source_path": "packer-1-1/packer-1-1-ubuntu-18-04-3-server.ova",
"guest_additions_mode": "disable",
"boot_wait": "30s",
"ssh_username": "mclibre",
"ssh_password": "mclibre",
"shutdown_command": "echo 'mclibre' | sudo -S shutdown -P now",
"output_directory": "packer-2-1",
"vm_name": "packer-2-1-ubuntu-18-04-3-server",
"format": "ova"
}
],
"provisioners": [
{
"type": "shell",
"execute_command": "echo 'mclibre' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
"inline": [
"apt update",
"DEBIAN_FRONTEND=noninteractive apt -yq full-upgrade"
]
}
]
}
Comentarios:
Para instalar las VirtualBox Guest Additions en la máquina virtual necesitamos:
packer build packer-2-2.json
Si el proceso termina correctamente, Packer creará el directorio packer-2-2 y creará en él el fichero packer-2-2-ubuntu-18-04-3-server.ova.
Nota: En Windows, Packer 1.2.3 requería que los scripts de shell tuvieran los finales de línea de Unix [packer issue 6151], pero desde Packer 1.3 ya no tiene esta limitación
Documentación de packer: Shells provisioners
En una plantilla de packer, la sección que define la instalación y configuración de la máquina virtual se denomina proveedor (en inglés provisioner).
En la sección del constructores le indicamos a packer que utilice la imagen creada en el ejemplo anterior y el usuario creado en ella.
En la sección de proveedores le indicamos a packer que ejecute un scripts con todos los comandos necesarios para actualizar el sistema e instalar las VirtualBox Guest Additions.
Esta podría ser la plantilla de instalación de Virtual Guest Additions:
{
"builders": [
{
"type": "virtualbox-ovf",
"source_path": "packer-1-1/packer-1-1-ubuntu-18-04-3-server.ova",
"guest_additions_mode": "disable",
"boot_wait": "30s",
"ssh_username": "mclibre",
"ssh_password": "mclibre",
"shutdown_command": "echo 'mclibre' | sudo -S shutdown -P now",
"output_directory": "packer-2-2",
"vm_name": "packer-2-2-ubuntu-18-04-3-server",
"format": "ova"
}
],
"provisioners": [
{
"type": "shell",
"execute_command": "echo 'mclibre' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
"script": "script-2-2.sh",
"pause_before": "10s"
}
]
}
Este podría ser el script script-2-2.sh de instalación de las VirtualBox Guest Additions (basado en las instrucciones que se comentan en la lección VirtualBox).
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt -yq full-upgrade
sudo DEBIAN_FRONTEND=noninteractive apt -yq install dkms build-essential linux-headers-4.15.0-70-generic
sudo mkdir /mnt/cdrom
sudo mount ~/VBoxGuestAdditions.iso /mnt/cdrom
sudo sh /mnt/cdrom/VBoxLinuxAdditions.run --nox11
sudo umount /mnt/cdrom
rm ~/VBoxGuestAdditions.iso
Comentario:
uname -a
Linux ubuntu 4.15.0-70-generic #79-Ubuntu SMP Tue Nov 12 ...
Para modificar la máquina virtual necesitamos:
packer build packer-2-3.json
Si el proceso termina correctamente, Packer creará el directorio packer-2-3 y creará en él el fichero packer-2-3-ubuntu-18-04-3-server.ova.
Documentación de packer: VirtualBox Builders
En una plantilla de packer, la sección que define la creación de la máquina se denomina constructor (en inglés builder).
En la sección del constructores le indicamos a packer que utilice la imagen creada en el ejemplo anterior y el usuario creado en ella.
Las modificaciones de la máquina virtual se pueden realizar con la propiedad vboxmanage o con la propiedad vboxmanage_post. En este ejemplo vamos a modificar el tipo de adaptador de red (de nat a bridged). Esta modificación debe realizarse con vboxmanage_post, ya que packer parece necesitar que el adaptador sea nat para poder realizar la conexión SSH con la que comprueba que la máquina es funcional (la comprobación se hace después de realizar las modificaciones de la máquina indicadas en vboxmanage pero antes de las indicadas en vboxmanage_post).
El nombre del adaptador dependerá de la tarjeta de red del ordenador en el que esté instalado VirtualBox.
Esta podría ser la plantilla de modificación final de la máquina virtual:
{
"builders": [
{
"type": "virtualbox-ovf",
"source_path": "packer-2-2/packer-2-2-ubuntu-18-04-3-server.ova",
"guest_additions_mode": "disable",
"boot_wait": "30s",
"ssh_username": "mclibre",
"ssh_password": "mclibre",
"shutdown_command": "echo 'mclibre' | sudo -S shutdown -P now",
"post_shutdown_delay": "120s",
"vboxmanage_post": [
["modifyvm", "{{.Name}}", "--nic1", "bridged"],
["modifyvm", "{{.Name}}", "--bridgeadapter1", "Realtek PCIe GBE Family Controller"]
],
"output_directory": "packer-2-3",
"vm_name": "packer-2-3-ubuntu-18-04-3-server",
"format": "ova"
}
]
}
Notas:
Docker está disponible en Ubuntu 18.04 desde junio de 2018. En este ejemplo se instala la versión más reciente de Docker mediante un script.
Este ejemplo trabaja a partir de la máquina virtual obtenida en la lección anterior y crea una nueva máquina virtual. Los pasos de instalación de Docker se realizan mediante un script y está basado en el ejercicio 1 de la lección de Docker (1).
Esta podría ser la plantilla de instalación de Docker:
{
"builders": [
{
"type": "virtualbox-ovf",
"source_path": "packer-1-1/packer-1-1-ubuntu-18-04-3-server.ova",
"guest_additions_mode": "disable",
"boot_wait": "30s",
"ssh_username": "mclibre",
"ssh_password": "mclibre",
"shutdown_command": "echo 'mclibre' | sudo -S shutdown -P now",
"output_directory": "packer-2-4",
"vm_name": "packer-2-4-ubuntu-18-04-3-server",
"format": "ova"
}
],
"provisioners": [
{
"type": "shell",
"execute_command": "echo 'mclibre' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
"script": "script-5.sh",
"pause_before": "10s"
}
]
}
Este podría ser el script de instalación de Docker (basado en las instrucciones que se comentan en la lección Docker. Ejercicios (1).
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt -yq full-upgrade
sudo DEBIAN_FRONTEND=noninteractive apt -yq install apt-transport-https ca-certificates curl software-properties-common
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88 > info-fingerprint.txt
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt -yq full-upgrade
sudo apt-cache policy docker-ce > info-policy.txt
sudo DEBIAN_FRONTEND=noninteractive apt -yq install docker-ce
Comentario:
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [desconocida] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
docker-ce:
Instalados: (ninguno)
Candidato: 5:19.03.5~3-0~ubuntu-bionic 500
Tabla de versión:
5:19.03.5~3-0~ubuntu-bionic 500
500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
...
La forma recomendada de comprimir una máquina virtual Ubuntu de VirtualBox es grabar ceros en las partes no utilizadas del disco mediante la utilidad zerofree y después exportar, clonar o compactar el disco con VirtualBox o la utilidad VBoxManage. Como la utilidad zerofree no funciona sobre unidades montadas, debemos arrancar la máquina virtual con un LiveCD de otra distribución y desde ahí aplicar zerofree a la partición de disco.
En este ejemplo de automatización con Packer, vamos a realizar la compresión utilizando la distribución SystemRescueCD.
Actualmente (enero de 2020), la última versión disponible de SystemRescueCD es la versión 6.0.4, publicada el 29 de diciembre de 2019. En cdlibre.org hay una sección dedicada a Utilidades de disco, desde la que se puede descargar la última versión disponible.
También puede descargar SystemRescueCD 6.0.4 de mclibre: SystemRescueCD 6.0.4 (29/12/19, 886 MB).
Los elementos necesarios para realizar la compresión son los siguientes:
Ejecute la plantilla para obtener la image OVA comprimida:
packer build packer-2-5.json
Si el proceso termina correctamente, Packer creará el directorio packer-2-5 y creará en él el fichero packer-2-5-ubuntu-18-04-3-server.ova.
Esta podría ser la plantilla de compresión de la máquina virtual:
{
"builders": [
{
"type": "virtualbox-ovf",
"source_path": "packer-2-2/packer-2-2-ubuntu-18-04-3-server.ova",
"guest_additions_mode": "disable",
"vboxmanage": [
["showvminfo", "{{.Name}}"],
["storageattach", "{{.Name}}", "--storagectl", "IDE Controller", "--port", "0", "--device", "1", "--type", "dvddrive", "--medium", "systemrescuecd-6.0.4.iso"],
["modifyvm", "{{.Name}}", "--boot1", "dvd", "--boot2", "disk", "--boot3", "none", "--boot4", "none"]
],
"boot_wait": "20s",
"boot_command": [
"<enter><wait40>",
"sudo zerofree -v /dev/mapper/ubuntu--vg-root<enter><wait50>"
],
"communicator": "none",
"shutdown_command": "",
"virtualbox_version_file": "",
"vboxmanage_post": [
["storageattach", "{{.Name}}", "--storagectl", "IDE Controller", "--port", "0", "--device", "1", "--type", "dvddrive", "--medium", "none"],
["modifyvm", "{{.Name}}", "--boot1", "disk", "--boot2", "dvd", "--boot3", "none", "--boot4", "none"]
],
"vm_name": "packer-2-5-ubuntu-18-04-3-server",
"output_directory": "packer-2-5",
"format": "ova"
}
]
}
Comentarios:
Nota: