Cómo crear una imagen personalizada en GCP con NGINX usando Packer (Guía paso a paso)
¿Qué es Packer?
Packer es una herramienta de HashiCorp que permite crear imágenes de máquina automatizadas para múltiples plataformas cloud usando código.
Cómo crear una imagen personalizada en GCP usando Packer
Cuando trabajamos en entornos cloud, instalar manualmente software en cada máquina virtual no es escalable ni reproducible. Aquí es donde entra la Infraestructura como Código (IaC).
En este tutorial aprenderás cómo usar Packer para crear una imagen personalizada en Google Cloud Platform.
El resultado será una imagen lista para desplegar servidores web de forma rápida, automatizada y repetible.
Si estás empezando en DevOps, cloud o automatización, este ejercicio es un excelente punto de partida.
Prerrequisitos
Debes tener:
- Proyecto creado en GCP
- API de Compute Engine habilitada
- Cuenta de servicio con permisos:
Compute Image AdminCompute Instance AdminService Account User
- Archivo JSON de credenciales descargado
- Packer instalado (
packer version)
Template de Packer explicado
Vamos a crear la siguiente estrctura de directorios y archivos:
packer-gcp/
│
├── main.pkr.hcl
├── packer.auto.pkrvars.hcl
└── variables.pkr.hcl
Procedemos a crear el archivo main.pkr.hcl, este define, en código, cómo Packer debe crear una imagen personalizada en GCP.
Es el template de construcción de Packer escrito en HCL (HashiCorp Configuration Language).
Ese archivo describe:
- Qué plugin usar
- En qué nube trabajar
- Qué imagen base tomar
- Qué configuración tendrá la VM temporal
- Qué software instalar
- Cómo se llamará la imagen final
Es, básicamente, la “receta” de la imagen.
packer {
required_plugins {
googlecompute = {
source = "github.com/hashicorp/googlecompute"
version = ">= 1.0.0"
}
}
}
source "googlecompute" "ubuntu" {
project_id = var.project_id
zone = var.zone
credentials_file = var.credentials_file
machine_type = "e2-micro"
source_image_family = "ubuntu-2204-lts"
ssh_username = "packer"
image_name = "nginx-image-{{timestamp}}"
image_family = "nginx-family"
disk_size = 10
disk_type = "pd-standard"
}
build {
sources = [
"source.googlecompute.ubuntu"
]
}
Creamos las variables.pkr.hcl
Define variables externas.
Permite que el template:
- Sea reutilizable
- No tenga datos sensibles hardcodeados
- Se pueda usar en diferentes proyectos
variable "project_id" {
type = string
}
variable "zone" {
type = string
default = "us-central1-a"
}
variable "credentials_file" {
type = string
}
Por ultimo creamos packer.auto.pkrvars.hcl para colocar el valor de las variables
project_id = "TU_PROJECT_ID"
credentials_file = "ruta/a/tu/credenciales.json"
Nota: Tambien puede colocar las credenciales de la siguiente forma cono variables de entorno:
Para Windows con PowerShell
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\keys\steadfast-sign-268019.json"
Para Linux
export GOOGLE_APPLICATION_CREDENTIALS="/home/USUARIO/keys\steadfast-sign-268019.json"
Construcción de la imagen
Procedemos a ejecutar
packer init .
Para que realice la instalación de los plugins necesarios:
Luego ejecutamos
packer validate .
Si los archivos hcl quedaron bien construidos, no nos debera de mostrar ningun error.
Por ultimo ejecutamos:
packer build .
Donde realizara la creacion de la imagen mostrando el siguiente log
PS C:\code\packer\packer-gcp> packer build .
learn-packer.googlecompute.ubuntu: output will be in this color.
==> learn-packer.googlecompute.ubuntu: Checking image does not exist...
==> learn-packer.googlecompute.ubuntu: Creating temporary RSA SSH key for instance...
==> learn-packer.googlecompute.ubuntu: no persistent disk to create
==> learn-packer.googlecompute.ubuntu: Using image: ubuntu-2204-jammy-v20260210
==> learn-packer.googlecompute.ubuntu: Creating instance...
==> learn-packer.googlecompute.ubuntu: Loading zone: us-central1-c
==> learn-packer.googlecompute.ubuntu: Loading machine type: e2-standard-2
==> learn-packer.googlecompute.ubuntu: Requesting instance creation...
==> learn-packer.googlecompute.ubuntu: Waiting for creation operation to complete...
==> learn-packer.googlecompute.ubuntu: Instance has been created!
==> learn-packer.googlecompute.ubuntu: Waiting for the instance to become running...
==> learn-packer.googlecompute.ubuntu: IP: 136.105.223.0
==> learn-packer.googlecompute.ubuntu: Using SSH communicator to connect: 136.105.223.0
==> learn-packer.googlecompute.ubuntu: Waiting for SSH to become available...
==> learn-packer.googlecompute.ubuntu: Connected to SSH!
==> learn-packer.googlecompute.ubuntu: Deleting instance...
==> learn-packer.googlecompute.ubuntu: Instance has been deleted!
==> learn-packer.googlecompute.ubuntu: Creating image...
==> learn-packer.googlecompute.ubuntu: Deleting disk...
==> learn-packer.googlecompute.ubuntu: Disk has been deleted!
Build 'learn-packer.googlecompute.ubuntu' finished after 2 minutes 29 seconds.
==> Wait completed after 2 minutes 29 seconds
==> Builds finished. The artifacts of successful builds are:
--> learn-packer.googlecompute.ubuntu: A disk image was created in the 'steadfast-sign-268019' project: ubuntu-2204-packer-1771262250
PS C:\code\packer\packer-gcp>
Al verificar en la consola de GCP en el listado de instancias, podemos ver que se esta creando la maquina virtual que usara packer para generar la imagen.
Cómo probar la imagen
Listado de imagenes
Para verificar la imagen vamos a ingresar a Compute Engine en la seccion de imagenes, donde veremos el listado de todas las imagenes.
Al buscar podemos ver la imagen que acabamos de crear desde packer:
Al dar click sobre el el nombre de la imagen podemos acceder al detalle de la misma
Crear una maquina virtual con la imagen
Nota: Puede segur los pasos en Crear una máquina virtual (VM) en (GCP) donde explicamos a detalle.
Cuando estamos en el paso se de seccionar el Sistema operativo y almacenamiento vamos a cambiar el disco de arranque donde buscamos la pestaña de imágenes personalizadas, en el selector de imagenes buscamos la imagen creada con packer como se muestra a continuación.
Con esto ya podemos segur con el proceso de crear la instancia con una imagen personalizada.