Packer (1)

Esta lección es una introducción al uso de packer, la herramienta de creación de máquinas virtuales. Packer permite crear máquinas virtuales para muchos sistemas de virtualización e instalar y configurar en ellas el sistema operativo que queramos. Como ejemplo, se explica cómo crear una máquina virtual de VirtualBox en la que se instala el sistema operativo Ubuntu Server.

Las plantillas de packer admiten muchas posibilidades, que se detallan en la documentación oficial de packer.

En esta lección Packer(1) veremos dos ejemplos de creación de máquinas virtuales:

Una de las ventajas de preparar primero la imagen básica es ahorrarnos la instalación del sistema operativo en cada prueba de instalación de aplicaciones. La instalación es un proceso que puede tardar más de 10 minutos y que sólo necesitaremos hacer una vez.

Requisitos

Para poder llevar a cabo los ejemplos comentados en esta página:

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

Packer puede instalar 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 22.04.2 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 el paso de la instalación 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 35 de la plantilla propuesta a continuación y el valor propuesto de 600s en principio debería ser más que suficiente.

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


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-22-04-2-server.ova.

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

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

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

# https://www.packer.io/docs/templates/hcl_templates/blocks/source

source "virtualbox-iso" "mclibre-1-1" {
  guest_os_type = "Ubuntu_64"
  iso_url       = "ubuntu-22.04.2-live-server-amd64.iso"
  iso_checksum  = "sha256:5e38b55d57d94ff029719342357325ed3bda38fa80054f9330dc789cd2d43931"
  disk_size     = "25000"
  vboxmanage = [
    ["modifyvm", "{{ .Name }}", "--memory", "1024"],
    ["modifyvm", "{{ .Name }}", "--vram", "64"],
    ["modifyvm", "{{ .Name }}", "--graphicscontroller", "vmsvga"]
  ]
  boot_wait = "10s"
  boot_command = [
    "<enter><wait60>",
    "<down><down><wait3><enter><wait2>",
    "<enter><wait2>",
    "<enter><wait2>",
    "<enter><wait2>",
    "<enter><wait2>",
    "<enter><wait2>",
    "<down><down><down><down><down><wait3><enter><wait2>",
    "<enter><wait2>",
    "<down><wait3><enter><wait2>",
    "mclibre<enter><wait2>",
    "ubuntu<enter><wait2>",
    "mclibre<enter><wait2>",
    "mclibre<enter><wait2>",
    "mclibre<enter><wait2>",
    "<enter><wait2>",
    "<enter><wait2>",
    "<spacebar><down><down><wait3><enter><wait3>",
    "<enter><wait15>",
    "<end><down><wait3><enter><wait600>",
    "<down><down><enter><wait20>",
    "<enter><wait40>"
  ]
  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-22-04-2-server"
  format           = "ova"
}

# https://www.packer.io/docs/templates/hcl_templates/blocks/build

build {
  sources = ["source.virtualbox-iso.mclibre-1-1"]
}

Comentarios:

Ejemplo 2: Creación de una máquina virtual de VirtualBox con Ubuntu Server 20.04 LTS (instalación automática o desatendida)

¡Atención! No he conseguido crear con Packer una máquina virtual con versiones posteriores a la versión Ubuntu 20.04 original (ni siquiera con las versiones 20.04.1 y sucesivas). El problema es que una vez realizada la instalación, Packer no consigue conectarse mediante SSH con contraseña por lo que cancela la creación de la imagen. Por eso este ejemplo utiliza la versión Ubuntu 20.04 en vez de la versión Ubuntu 22.04 del ejemplo anterior.

Ubuntu permite realizar instalaciones automáticas (también llamadas desatendidas), en las que el usuario no tiene que ir eligiendo opciones de un menú interactivo, sino que puede detallar sus elecciones en un fichero para su aplicación de forma automática. Antes de Ubuntu 20.04, Ubuntu utilizaba el sistema de instalación automática de Debian preseeding, pero a partir de Ubuntu 20.04, Ubuntu utiliza su propio sistema .

Packer puede también instalar el sistema operativo en la máquina virtual poniendo en marcha una instalación automática. En este caso además de la plantilla de Packer se necesitará la configuración a aplicar en la instalación automática. En este caso, la configuración deseada se describe en un fichero de texto user-data con formato YAML, al que la máquina virtual accede a través de un servidor web que implementa Packer.

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-20-04-server.ova.

Nota: Este ejemplo está basado en un ejemplo de Nick Charlton.

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:

{
  "builders": [
    {
      "type": "virtualbox-iso",
      "guest_os_type": "Ubuntu_64",
      "iso_url": "ubuntu-20.04-live-server-amd64.iso",
      "iso_checksum": "CAF3FD69C77C439F162E2BA6040E9C320C4FF0D69AAD1340A514319A9264DF9F",
      "iso_checksum_type": "sha256",
      "disk_size": "25000",
      "vboxmanage": [
        ["modifyvm", "{{.Name}}", "--memory", "1024"],
        ["modifyvm", "{{.Name}}", "--vram", "64"],
        ["modifyvm", "{{.Name}}", "--graphicscontroller", "vmsvga"]
      ],
      "boot_wait": "5s",
      "http_directory": "http",
      "boot_command": [
        "<enter><enter><f6><esc><wait> ",
        "autoinstall ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/",
        "<enter>"
      ],
      "ssh_username": "mclibre",
      "ssh_password": "mclibre",
      "ssh_handshake_attempts": "20",
      "shutdown_command": "echo 'mclibre' | sudo -S shutdown -P now",
      "output_directory": "packer-1-2",
      "vm_name": "packer-1-2-ubuntu-20-04-server",
      "format": "ova"
    }
  ]
}

Comentarios:


Documentación de los ficheros de configuración: Automated Server Installs Config File Reference.

Este podría el fichero de configuración de la instalación desatendida, que debe guardarse en la carpeta http con el nombre user-data:

#cloud-config
autoinstall:
  version: 1
  identity:
    realname: mclibre
    hostname: ubuntu
    password: '$6$mclibre$YiuRPSZM3ZXVe4UyIqv1dvy9rUjf5/LsGCkDyaex.WN45wzVTuRmW5QLuctuicGAFZIO2M3QR8NLdtQYatKTn1'
    username: mclibre
  locale: es_ES.UTF-8
  keyboard:
    layout: es
  network:
    network:
      version: 2
      ethernets:
        ens33: {dhcp4: true, dhcp-identifier: mac}
  ssh:
    install-server: true
  late-commands:
    - sed -i 's/^#*\(send dhcp-client-identifier\).*$/\1 = hardware;/' /target/etc/dhcp/dhclient.conf
    - 'sed -i "s/dhcp4: true/&\n      dhcp-identifier: mac/" /target/etc/netplan/00-installer-config.yaml'

Comentarios:

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