Creación de máquina virtual de Ubuntu 18.04 con Packer

¡Atención!Esta lección corresponde a la versión 1.5 de Packer y a una versión antigua de Ubuntu, que mantengo en los apuntes por si le pueden servir a alguien que todavía utilice Ubuntu 18.04 LTS, que Canonical mantendrá hasta abril de 2023 y bajo suscripción (gratuita para uso personal) hasta abril de 2028. En su lugar, aconsejo consultar las lecciones dedicadas a versiones más recientes de Ubuntu y Packer.


Hasta la versión Ubuntu Server 18.04.3, Canonical ofrecía dos versiones, con instaladores diferentes:

A partir de Ubuntu 18.04.4, publicada en febrero de 2020, Canonical solo ofrece la versión Live Server. Por ello, la página de descarga oficial http://cdimage.ubuntu.com/releases/18.04/release/ de Ubuntu Server 18.04 LTS sólo ofrece la versión Live Server. La página de descarga de descarga de versiones antiguas http://old-releases.ubuntu.com/releases/18.04.3/ sí que ofrece la última versión con el instalador clásico.


Esta lección contiene ejemplos de plantillas para Packer 1.5, la herramienta de creación de máquinas virtuales, para versiones de Ubuntu con el instalador clásico.

Ejemplo 1: Creación de una máquina virtual de VirtualBox con Ubuntu Server 18.04.3 LTS (instalación manual)

Para crear la máquina virtual:

Si el proceso termina correctamente, Packer creará el directorio packer-1-1 y creará en él el fichero packer-1-1-ubuntu-18-04-3-server.ova.

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

Documentación de packer: Builders en VirtualBox

En una plantilla de packer, la sección que define la creación de la máquina se denomina constructor (en inglés builder).

Packer instala el sistema operativo en la máquina virtual reproduciendo el proceso manual que realizamos nosotros cuando instalamos el sistema operativo en una máquina virtual.

Así, la plantilla de creación de una máquina virtual e instalación de un sistema operativo contiene tanto la descripción de la máquina virtual que queremos como las entradas de teclado a realizar para la instalación del sistema operativo.

Para obtener las entradas de teclado es necesario primero hacer una instalación manual y anotar cuidadosamente las opciones elegidas y también cronometrar lo que tarda en realizarse cada uno de los pasos de la instalación, ya que en la plantilla debemos indicar también el tiempo que packer debe esperar entre entrada y entrada de teclado. Si el tiempo de espera es demasiado corto, packer enviará las pulsaciones de teclado demasiado pronto y la instalación no se realizará correctamente.

En la lección Instalación de Ubuntu se muestra un ejemplo de instalación de Ubuntu Server 18.04.3 LTS. La página muestra los sucesivos pasos del proceso de instalación y las entradas de teclado y tiempos de espera correspondientes. Por precaución, el tiempo de espera indicado a packer debería ser siempre algo superior al cronometrado.

En caso de que los tiempos de ejecución sean mayores que los tiempos de espera, Packer enviará las pulsaciones antes de tiempo y la instalación no podrá completarse correctamente. Se aconseja seguir con atención la instalación que realiza Packer e identificar el paso en que se produce el problema y es necesario aumentar el tiempo.

En particular hay un paso de la instalación en la que se descargan ficheros de Internet, por lo que la duración de este paso puede variar bastante, en función de la conexión a Internet disponible y del estado de carga de los servidores de Ubuntu. El tiempo de espera de este paso se encuentra en la línea 34 de la plantilla propuesta a continuación. Puede ser necesario aumentar los 40s propuestos a 90s o más.

Si la instalación no se está realizando correctamente, pulse Ctrl+c en la ventana de Símbolo de sistema para interrumpirla. Packer cerrará en su caso la ventana de VirtualBox y borrará los archivos temporales creados. Si por cualquier motivo Packer no puede cerrar la ventana de VirtualBox, ciérrela manualmente y borre los ficheros temporales que hayan quedado en la carpeta de VirtualBox (en Windows, C:\Users\NombreUsuario\VirtualBox VMs).

Esta podría ser la plantilla de creación de la máquina virtual con Ubuntu:

{
  "builders": [
    {
      "type": "virtualbox-iso",
      "guest_os_type": "Ubuntu_64",
      "iso_url": "ubuntu-18.04.3-server-amd64.iso",
      "iso_checksum": "7d8e0055d663bffa27c1718685085626cb59346e7626ba3d3f476322271f573e",
      "iso_checksum_type": "sha256",
      "disk_size": "25000",
      "vboxmanage": [
        ["modifyvm", "{{.Name}}", "--memory", "1024"],
        ["modifyvm", "{{.Name}}", "--vram", "64"]
      ],
      "boot_wait": "10s",
      "boot_command": [
        "<down><down><wait5><enter><wait5>",
        "<enter><wait10>",
        "<enter><wait5>",
        "<enter><wait5>",
        "<enter><wait5>",
        "<down><down><down><down><down><wait5><enter><wait60s>",
        "<tab><wait5><enter><wait5>",
        "mclibre<tab><wait5><enter><wait5>",
        "<tab><wait5><enter><wait5>",
        "mclibre<tab><spacebar><tab><wait5><enter><wait5>",
        "mclibre<tab><spacebar><tab><wait5><enter><wait5>",
        "<left><wait5><enter><wait5>",
        "<enter><wait10>",
        "<enter><wait5>",
        "<enter><wait5>",
        "<left><wait5><enter><wait10>",
        "<tab><wait5><enter><wait10>",
        "<left><wait5><enter><wait90s>",
        "<tab><wait5><enter><wait40s>",
        "<enter><wait10>",
        "<down><down><down><down><down><down><spacebar><wait5><tab><enter><wait3m30s>",
        "<enter><wait40s>",
        "<enter><wait40s>"
      ],
      "ssh_username": "mclibre",
      "ssh_password": "mclibre",
      "shutdown_command": "echo 'mclibre' | sudo -S shutdown -P now",
      "output_directory": "packer-1-1",
      "vm_name": "packer-1-1-ubuntu-18-04-3-server",
      "format": "ova"
    }
  ]
}

Comentarios:

Ejemplo 2: Creación de una máquina virtual de VirtualBox con Ubuntu Server 18.04.3 LTS (instalación desatendida, preseed)

Para crear la máquina virtual:

Si el proceso termina correctamente, Packer creará el directorio packer-1-2 y creará en él el fichero packer-1-2-ubuntu-18-04-3-server.ova.

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

Esta podría ser la plantilla de creación de la máquina virtual con Ubuntu:

¡Atención!Este ejemplo está en elaboración.

{
  "builders": [
    {
      "type": "virtualbox-iso",
      "guest_os_type": "Ubuntu_64",
      "iso_url": "ubuntu-18.04.3-server-amd64.iso",
      "iso_checksum": "7d8e0055d663bffa27c1718685085626cb59346e7626ba3d3f476322271f573e",
      "iso_checksum_type": "sha256",
      "disk_size": "25000",
      "vboxmanage": [
        ["modifyvm", "{{.Name}}", "--memory", "1024"],
        ["modifyvm", "{{.Name}}", "--vram", "64"]
      ],
      "boot_wait": "10s",
      "boot_command": [
        "<enter><wait><f6><esc><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
        "<bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
        "<bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
        "<bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
        " auto<wait>",
        " console-setup/ask_detect=false<wait>",
        " console-setup/layoutcode=es<wait>",
        " debconf/frontend=noninteractive<wait>",
        " debian-installer=es_ES<wait>",
        " fb=false<wait>",
        " initrd=/install/initrd.gz<wait>",
        " keyboard-configuration/layoutcode=es",
        " locale=es_ES<wait>",
        " netcfg/get_domain=vm<wait>",
        " netcfg/get_hostname=ubuntu<wait>",
        " grub-installer/bootdev=/dev/sda<wait>",
        " noapic<wait>",
        " preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed-1-2.cfg<wait>",
        " -- <wait>",
        "<enter><wait>"
    ],
      "http_directory": "http",
      "ssh_username": "mclibre",
      "ssh_password": "mclibre",
      "ssh_wait_timeout": "3600s",
      "shutdown_command": "echo 'mclibre' | sudo -S shutdown -P now",
      "output_directory": "packer-1-2",
      "vm_name": "packer-1-2-ubuntu-18-04-3-server",
      "format": "ova"
    }
  ]
}

Este podría el fichero de configuración de la instalación desatendida, que debe guardarse en la carpeta http con el nombre preseed-1-2.cfg:

### fuente: https://help.ubuntu.com/lts/installation-guide/example-preseed.txt
### Localization
d-i debian-installer/locale string es_ES

### Keyboard selection.
# Disable automatic (interactive) keymap detection.
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/modelcode string pc105
d-i keyboard-configuration/xkb-keymap select es

### Network configuration
d-i netcfg/choose_interface select auto
# To set a different link detection timeout (default is 3 seconds).
# Values are interpreted as seconds.
d-i netcfg/link_wait_timeout string 10
# If you have a slow dhcp server and the installer times out waiting for
# it, this might be useful.
d-i netcfg/dhcp_timeout string 60
d-i netcfg/dhcpv6_timeout string 60
# If you want to force a hostname, regardless of what either the DHCP
# server returns or what the reverse DNS entry for the IP is, uncomment
# and adjust the following line.
d-i netcfg/hostname string ubuntu
# Disable that annoying WEP key dialog.
d-i netcfg/wireless_wep string

### Account setup
# To create a normal user account.
d-i passwd/user-fullname string mclibre.org
d-i passwd/username string mclibre
# Normal user's password, either in clear text
d-i passwd/user-password password mclibre
d-i passwd/user-password-again password mclibre
# The installer will warn about weak passwords. If you are sure you know
# what you're doing and want to override it, uncomment this.
d-i user-setup/allow-password-weak boolean true

### Clock and time zone setup
# Controls whether or not the hardware clock is set to UTC.
d-i clock-setup/utc boolean true
# You may set this to any valid setting for $TZ; see the contents of
# /usr/share/zoneinfo/ for valid values.
d-i time/zone string Europe/Madrid
# Controls whether to use NTP to set the clock during the install
d-i clock-setup/ntp boolean true

### Partitioning
d-i partman-auto/method string lvm
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
# For LVM partitioning, you can select how much of the volume group to use
# for logical volumes.
d-i partman-auto-lvm/guided_size string max
# You can choose one of the three predefined partitioning recipes:
# - atomic: all files in one partition
# - home:   separate /home partition
# - multi:  separate /home, /var, and /tmp partitions
d-i partman-auto/choose_recipe select atomic
# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

### Base system installation
### Apt setup
# You can choose to install restricted and universe software, or to install
# software from the backports repository.
#d-i apt-setup/restricted boolean true
d-i apt-setup/universe boolean true
#d-i apt-setup/backports boolean true
# Uncomment this if you don't want to use a network mirror.
# d-i apt-setup/use_mirror boolean false
d-i mirror/http/proxy string

### Package selection
tasksel tasksel/first multiselect ubuntu-server
#tasksel tasksel/first multiselect ubuntu-desktop
#tasksel tasksel/first multiselect lamp-server, print-server
#tasksel tasksel/first multiselect kubuntu-desktop
# Individual additional packages to install
d-i pkgsel/include string openssh-server build-essential
# Whether to upgrade packages after debootstrap.
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select none
# Barto. para descargar el soporte completo del idioma
# https://askubuntu.com/questions/129651/how-do-i-configure-a-preseed-to-skip-the-language-support-question
d-i pkgsel/install-language-support boolean true
# Policy for applying updates. May be "none" (no automatic updates),
# "unattended-upgrades" (install security updates automatically), or
# "landscape" (manage system with Landscape).
d-i pkgsel/update-policy select none

### Boot loader installation
# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine.
d-i grub-installer/only_debian boolean true

### Finishing up the installation
# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note

Otros detalles

Opción de configuración guest_os_type

La opción de configuración guest_os_type puede tomar el valor other, pero según la documentación de Packer, el rendimiento de VirtualBox puede ser mucho mayor si se especifica el sistema operativo que queremos instalar. La lista completa de valores se puede obtener con el comando de VirtualBox:

  VBoxManage list ostypes