Introducción
Todos los escritorios que has hecho hasta ahora salen de una plantilla, y la has elegido de una lista que ha escrito otra persona.
Esa lista es la de tu centro, es corta y es antigua.
Tarde o temprano un ejercicio necesitará algo que no está en ella: una Fedora cuando el centro solo tiene Ubuntu, una máquina con Docker ya instalado para que treinta alumnos no pasen diez minutos cada uno instalándolo, una imagen base con tu clave SSH ya incluida.
Una plantilla no tiene nada de mágico. Es un escritorio que alguien detuvo y congeló:
architecture-beta
service iso(disk)[ISO]
service desktop(server)[Desktop]
service template(database)[Template]
iso:R -- L:desktop
desktop:R -- L:template
Tres pasos, y esta página trata esos tres:
- meter una ISO de instalación en Isard: la biblioteca de medios;
- instalar un sistema operativo en un escritorio a partir de ella;
- promover ese escritorio a plantilla.
Y después, hacerlos todos con un solo comando.
La biblioteca de medios
Isard llama medio a una ISO subida, y cada cuenta tiene una biblioteca de ellos.
$ isard media
-- Media --
NAME STATUS SIZE OWNER
Fedora-Server-netinst-x86_64-44 Downloaded 1049M you
ubuntu-24.04.4-live-server Downloaded 3052M shared
shared significa que alguien de tu centro lo ha publicado para todos. you significa que lo has añadido tú y que cuenta para tu cuota.
Para añadir uno hace falta una URL, no un fichero:
$ isard media add ubuntu-24 --url https://releases.ubuntu.com/24.04/ubuntu-24.04.4-live-server-amd64.iso
✓ Media registered
✓ Media id: 2b8f61c4-...
✓ Downloaded: ubuntu-24
✓ Media 'ubuntu-24' ready (id: 2b8f61c4-...).
Lo descarga Isard, no tú. No hay ninguna forma de subir ficheros: le das a la plataforma una dirección https:// y su propio descargador se trae el fichero.
Eso es bueno con la conexión de un instituto, y es una limitación la primera vez que tienes una ISO en un pendrive y ningún sitio donde ponerla.
El comando espera por defecto y muestra el progreso. --no-wait vuelve inmediatamente, y luego con isard media puedes seguir su estado.
Borrar hace lo que esperas:
$ isard media delete ubuntu-24
⚠ About to delete media:
Name : ubuntu-24
ID : 2b8f61c4-...
State: Downloaded
Delete this media? [y/N] y
✓ Media deleted
A mano, en el navegador
Ahora que hay una ISO en la biblioteca, puedes arrancar un escritorio desde ella.
En la vista Medios, el icono de la fila genera un escritorio a partir de ese medio:

Abre el formulario de creación de siempre, salvo que el dispositivo de arranque es la ISO en lugar de una plantilla:

Para una Fedora Server, la configuración que importa es:
| Arranque | CD/DVD |
| Bus de disco | virtio |
| Disco | 100 GB |
| Red | Default y Wireguard VPN |
Arráncalo, abre el visor e instala el sistema operativo exactamente como lo harías en una máquina real.
Después (y este es el paso que la gente se salta) detén la máquina y edítala antes de hacer nada más:
| Arranque | Disco duro |
| Medio | Ninguno |
| Bus de disco | Por defecto |
Si te lo saltas, el firmware vuelve a encontrar la ISO de instalación en el siguiente arranque y te ofrece tan tranquilo reinstalar encima de lo que acabas de construir.
Promover
Ahora tienes un escritorio con un sistema operativo. Convertirlo en plantilla es un solo comando:
$ isard template promote fedora-base --name fedora-44-base -d 'Fedora 44 Server, docker preinstalled'
✓ Resolved desktop: fedora-base
✓ Template 'fedora-44-base' created.
Template ID : 5c1e9a07-...
Source : fedora-base (8d3a2f61-...)
Enabled : yes
Dos condiciones, y las dos las comprueba la plataforma, no la herramienta:
- el escritorio tiene que estar Stopped (detenido);
- su disco tiene que haberse escrito de verdad: un escritorio creado y nunca arrancado no es un origen válido.
--disabled crea la plantilla oculta, que es lo que quieres si vas a revisarla antes de que la use una clase.
Todo, en un fichero
Todo lo anterior son cuatro comandos, un formulario, una instalación y una promoción, con dos ocasiones de equivocarte con el orden de arranque.
isard build lo hace todo, descrito en un solo fichero YAML.
# ubuntu.yaml
image:
distro: ubuntu
variant: server
release: lts
template:
name: ubuntu-lts-base
description: Ubuntu LTS with docker and the class tooling
vcpus: 4
memory_gb: 8
disk_gb: 100
user:
name: isard
password_env: ISARD_TEMPLATE_PASSWORD
ssh_key: ~/.ssh/id_ed25519.pub
packages: [git, curl, docker.io]
run:
- systemctl enable --now docker
- usermod -aG docker isard
Mira el plan antes de dedicarle una tarde:
$ isard build ubuntu.yaml --dry-run
✓ Ubuntu 26.04.1 LTS Server (live-server)
Template : ubuntu-lts-base
Image : Ubuntu 26.04.1 LTS Server (live-server), 2.9 GB
URL : https://releases.ubuntu.com/resolute/ubuntu-26.04.1-live-server-amd64.iso
Hardware : 4 vCPU, 8 GB RAM, 100 GB disk
User : isard
Install : by hand in the viewer (user, password, SSH server)
Provision: hostname/locale/timezone, 3 package(s), 0 file(s), 2 command(s) over SSH
--dry-run solo consulta el índice de versiones del distribuidor: ninguna sesión, ninguna llamada a la API, ninguna descarga.
Es el comando que hay que ejecutar después de cada cambio en el fichero, porque una errata en una clave es un error, no un aviso:
$ isard build ubuntu.yaml --dry-run
error: ubuntu.yaml: unknown key in `profile`: pakages
Allowed: files, hostname, image, keyboard, locale, packages, run, template, timezone, user
Esa rigidez es deliberada. Una clave ignorada en silencio es una clave que descubres veinte minutos después de empezar una descarga de 3 GB.
Después ejecútalo:
$ isard build ubuntu.yaml
✓ Ubuntu 26.04.1 LTS Server (live-server)
...
URL: https://releases.ubuntu.com/resolute/ubuntu-26.04.1-live-server-amd64.iso
✓ No existing media — will register
✓ Media registered
✓ Media id: 7d41c2e8-...
✓ Downloaded: ubuntu-26.04.1-live-server-amd64
✓ Created ubuntu-lts-base (c0a9e7b2-...)
✓ Bastion armed (applies at the next boot)
✓ Bastion will log in as 'isard'
✓ Desktop starting
✓ ubuntu-lts-base is now Started
In the viewer, install the OS. Three things have to match; the rest is yours:
1. username isard
2. password una-contrasenya-llarga
3. SSH server tick "Install OpenSSH server" in the installer
Then shut the machine down — the build resumes by itself the moment it stops.
Nothing else is needed: hostname, locale, timezone, packages, your SSH key
and passwordless sudo are all applied automatically afterwards.
El único paso que es tuyo
El instalador del sistema operativo no se puede controlar desde fuera, y la construcción no finge lo contrario: te da el visor y espera.
Hay tres cosas que tienen que coincidir, y el resto es cosa tuya:
| qué | dónde | |
|---|---|---|
| 1 | el nombre de usuario de user.name |
la pantalla de cuenta del instalador |
| 2 | la contraseña de user.password |
la misma pantalla |
| 3 | un servidor SSH | Ubuntu: marca Install OpenSSH server. Fedora: elige el entorno Server |
Después apaga la máquina. No la reinicies.
La construcción espera a que el escritorio llegue a Stopped: no te pide nada, así que puedes irte y seguirá sin ti.
✓ ubuntu-lts-base is now Stopped
✓ Booting from disk
✓ Desktop starting
✓ ubuntu-lts-base is now Started
✓ SSH is up
Applying the profile over SSH:
==> hostname ubuntu-lts-base
==> timezone Europe/Madrid
==> account isard
==> authorising the SSH key for isard
==> installing 3 package(s)
...
==> systemctl enable --now docker
==> usermod -aG docker isard
==> provisioning complete
✓ Guest account 'isard' is ready
✓ Stop requested
✓ ubuntu-lts-base is now Stopped
✓ Bastion will log in as 'isard'
✓ Deleted 'ubuntu-26.04.1-live-server-amd64'
✓ Template 'ubuntu-lts-base' is ready.
Template ID : 4f6b0d1a-...
Guest user : isard
Create one : isard create my-box --template ubuntu-lts-base
El nombre de usuario y la contraseña importan porque el bastión entra en el sistema invitado con ellos, y así es como la construcción entra después para hacer el resto.
Si te equivocas en el instalador, la fase de configuración no puede iniciar sesión, y ese es el único fallo de este comando que te hace perder toda la instalación.
Cuando el SSH nunca responde
Casi siempre es que se pasó por alto la opción de OpenSSH en la pantalla del instalador.
La construcción sabe reconocerlo y, en lugar de agotar el tiempo de espera, muestra la solución y espera a que la ejecutes en la consola del propio escritorio:
$ curl -fsSL https://isard.xtec.dev/guest.sh | sudo sh -s isard mypassword
Es la misma línea de Bastión, y es corta a propósito: la consola en la que tienes que escribirla todavía no tiene el portapapeles operativo, y esa es una de las cosas que arregla.
Qué más puedes poner
| clave | qué |
|---|---|
hostname, timezone, locale, keyboard |
las aburridas, aplicadas por SSH |
packages |
una lista, instalada con el gestor de paquetes del sistema invitado |
run |
comandos de shell, en orden, como root |
files |
rutas y contenidos, escritos dentro del sistema invitado |
Y tres opciones que conviene conocer:
--keep-media |
deja la ISO en la biblioteca, para que la siguiente construcción de la misma versión no vuelva a descargar 3 GB |
--no-promote |
se detiene cuando la máquina está construida y configurada, y la deja como escritorio |
--no-viewer |
no abre ningún visor; abres tú la máquina |
Desatendida, a mano
isard build cubre el caso con el que te vas a encontrar de verdad.
Por debajo hay un camino de más bajo nivel que conviene saber que existe, porque es como una instalación pasa a ser totalmente desatendida, sin nadie delante del visor.
Tanto el instalador de Ubuntu como el de Fedora leen la configuración de un segundo CD, y lo encuentran por su etiqueta de volumen:
| etiqueta | fichero | lo lee | |
|---|---|---|---|
isard seed cidata |
CIDATA |
user-data |
cloud-init: autoinstall de Ubuntu |
isard seed oemdrv |
OEMDRV |
ks.cfg |
Anaconda: Fedora, RHEL, Rocky |
Ninguno de los dos necesita un argumento en la línea de comandos del kernel, y esa es la gracia: el formulario de hardware de Isard no tiene dónde ponerlo.
Así que construyes la pequeña ISO en local:
$ isard seed oemdrv --kickstart my-ks.cfg -o seed.iso
Wrote OEMDRV seed → seed.iso
Anaconda auto-loads ks.cfg from any volume labelled OEMDRV — no
kernel command-line tweak needed. Host the ISO, register via
`isard media add`, and attach alongside the Fedora installer ISO.
La publicas en algún sitio por HTTPS y pasas la URL:
$ isard template create --seed-url https://files.example.com/seed.iso
El instalador arranca, encuentra el segundo CD, lo lee e instala sin preguntar nada.
Ejercicios
EjercicioLee la biblioteca
Lista tus medios y di, para cada uno, si es tuyo o de tu centro.
Mostrar la solución
$ isard media
-- Media --
NAME STATUS SIZE OWNER
Fedora-Server-netinst-x86_64-44 Downloaded 1049M you
ubuntu-24.04.4-live-server Downloaded 3052M shared
La columna OWNER es la respuesta, y importa por dos motivos: un medio compartido no te gasta cuota, y no lo puedes borrar.
EjercicioUn perfil que falla barato
Escribe un perfil de construcción para una plantilla Fedora Server con git y htop, y compruébalo con --dry-run sin construir nada.
Después rompe una clave a propósito y vuelve a comprobarlo.
Mostrar la solución
# fedora.yaml
image:
distro: fedora
variant: server
release: latest
template:
name: fedora-class
vcpus: 2
memory_gb: 4
disk_gb: 50
user:
name: isard
password_env: ISARD_TEMPLATE_PASSWORD
packages: [git, htop]
$ isard build fedora.yaml --dry-run
✓ Fedora 44 Server (Net Install)
Template : fedora-class
Image : Fedora 44 Server (Net Install)
URL : https://download.fedoraproject.org/pub/fedora/linux/releases/44/Server/x86_64/iso/Fedora-Server-netinst-x86_64-44-1.7.iso
Hardware : 2 vCPU, 4 GB RAM, 50 GB disk
User : isard
Install : by hand in the viewer (user, password, SSH server)
Provision: hostname/locale/timezone, 2 package(s), 0 file(s), 0 command(s) over SSH
$ isard build fedora.yaml --dry-run # after renaming `packages` to `packge`
error: fedora.yaml: unknown key in `profile`: packge
Allowed: files, hostname, image, keyboard, locale, packages, run, template, timezone, user
La segunda ejecución es el ejercicio. Un perfil que está mal tiene que decirlo en dos segundos, no en veinte minutos.
EjercicioTres pasos a mano
Sin usar isard build, convierte un escritorio en plantilla.
Usa una máquina con la que ya hayas terminado.
Mostrar la solución
$ isard stop lab --wait
✓ Resolved desktop: lab (state: Started)
✓ lab → Stopping
✓ lab is now Stopped
$ isard template promote lab --name lab-base -d 'Class base image'
✓ Resolved desktop: lab
✓ Template 'lab-base' created.
Template ID : 0e7d3b52-...
Source : lab (6a19c4f0-...)
Enabled : yes
$ isard template --filter lab
-- Available Templates (filtered by 'lab') --
NAME DESCRIPTION OS
lab-base Class base image ubuntu
Y ahora mira qué dice isard list de lab:
$ isard list --name lab
No desktops found.
El escritorio ya no está. Lo ha consumido la promoción, y ese es el comportamiento que tienes que recordar de esta página.
EjercicioPor qué no compartir el disco sin más
Un compañero quiere la máquina que has construido. Podrías promoverla a plantilla, o podrías darle tus credenciales para que use la tuya.
Da dos motivos por los que la plantilla es la respuesta correcta.
Mostrar la solución
Dos cualesquiera de estos:
- Una plantilla es una copia. Diez personas tienen cada una su propia máquina y pueden romperla. Una máquina compartida es una persona trabajando y nueve mirando.
- Gasta cuota una vez por persona, no una sola vez. Una máquina compartida ocupa tu cuota para toda la clase.
- Es reproducible. Una máquina que has configurado a mano durante tres semanas no se puede reconstruir; una plantilla se puede volver a hacer a partir de un perfil.
- Nadie tiene que fiarse de nadie. Compartir unas credenciales es compartir una contraseña, y la cuenta es la tuya.
La última vale mucho más allá de esta página, y la tercera es el motivo por el que existe isard build.
Proyecto
Construye la máquina que tu clase va a usar de verdad.
- Escribe un perfil de construcción para un servidor Ubuntu LTS con las herramientas que necesita tu curso, por ejemplo
git,curl,docker.ioypython3. - Añade un paso
run:que añada el usuario al grupodocker, y una entradafiles:que escriba un/etc/motdcon el nombre de la plantilla y la fecha. - Compruébalo con
--dry-runhasta que no dé ningún error. - Constrúyelo con
--keep-media, para que una segunda construcción no vuelva a descargar la ISO. - Crea un escritorio a partir de la plantilla terminada y demuestra que
docker run hello-worldfunciona sinsudo.
Mostrar la solución
# class.yaml
image:
distro: ubuntu
variant: server
release: lts
template:
name: class-base
description: Ubuntu LTS with docker and python
vcpus: 4
memory_gb: 8
disk_gb: 100
user:
name: isard
password_env: ISARD_TEMPLATE_PASSWORD
ssh_key: ~/.ssh/id_ed25519.pub
hostname: class-base
timezone: Europe/Madrid
packages: [git, curl, docker.io, python3]
run:
- systemctl enable --now docker
- usermod -aG docker isard
files:
/etc/motd: |
class-base — Ubuntu LTS, docker + python
Built 2026-08-14 with `isard build`.
$ export ISARD_TEMPLATE_PASSWORD='una-contrasenya-llarga'
$ isard build class.yaml --dry-run
$ isard build class.yaml --keep-media
Después:
$ isard create demo --template class-base --yes
$ isard start demo --wait
$ isard ssh demo -- 'docker run --rm hello-world'
Hello from Docker!
docker run sin sudo es lo que demuestra que el usermod se ha ejecutado, y conviene comprobarlo en lugar de darlo por hecho: un cambio de grupo solo tiene efecto en un nuevo inicio de sesión, y este es un nuevo inicio de sesión.