Packer (2)

En esta lección se muestran más ejemplos de Packer con máquinas virtuales de VirtualBox.

Ejemplo 1: Actualización de la máquina virtual mediante comandos

Para actualizar la máquina virtual necesitamos:

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.

Plantilla de actualización de la máquina virtual (packer-2-1.json)

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:

Ejemplo 2: Instalación de VirtualBox Guest Additions mediante un script

Para instalar las VirtualBox Guest Additions en la máquina virtual necesitamos:

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

Plantilla de instalación de VirtualBox Guest Additions (packer-1-3.json)

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:

Ejemplo 3: Modificación final de la máquina virtual

Para modificar la máquina virtual necesitamos:

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.

Plantilla de modificación final de la máquina virtual (packer-2-3.json)

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:

Ejemplo 4: Instalación de Docker mediante un script

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).

Plantilla de instalación de Docker (packer-2-4.json)

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:

Ejemplo 5: Compresión de imagen OVA de Ubuntu

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.

Plantilla de compresión de la máquina virtual (packer-2-5.json)

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: