Base de conocimientos

Haga el trabajo del primer arranque con cloud-init

Adjunte un documento de user-data al pedido y la instancia llegará con su usuario, su clave, sus paquetes y su cortafuegos ya configurados.

Qué se ejecuta y cuándo

Cada imagen Linux incluye cloud-init. En el primer arranque lee el user-data adjunto a tu pedido, lo aplica una vez y escribe un marcador para que no vuelva a ejecutarse nunca. Todo eso ocurre antes de que pudieras haber escrito nada, que es el objetivo: la ventana entre que una instancia existe y está configurada es la ventana que no deberías tener.

Valida el documento antes de pedir. El comprobador de esquema detecta el error de indentación que de otro modo te costaría una reconstrucción:

cloud-init schema --config-file user-data.yaml --annotate

Un user-data que hace lo útil

#cloud-config
hostname: edge-01
fqdn: edge-01.example.com
timezone: UTC

users:
  - name: deploy
    groups: [sudo]
    shell: /bin/bash
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3Nza... deploy@laptop

ssh_pwauth: false
disable_root: true

package_update: true
package_upgrade: true
packages:
  - nftables
  - vnstat
  - mtr-tiny

write_files:
  - path: /etc/ssh/sshd_config.d/10-local.conf
    permissions: "0644"
    content: |
      PermitRootLogin no
      PasswordAuthentication no
      AllowUsers deploy

runcmd:
  - [systemctl, enable, --now, nftables]
  - [systemctl, restart, ssh]

La primera línea no es un comentario ni es opcional. Sin #cloud-config el documento se ignora en silencio y la instancia arranca como si no hubieras adjuntado nada.

En AlmaLinux, groups: [sudo] se convierte en groups: [wheel] y el servicio que hay que reiniciar es sshd. Todo lo demás es idéntico.

Verlo funcionar

cloud-init status --long
journalctl -u cloud-final -b
less /var/log/cloud-init-output.log

El journal te dice qué etapa falló. cloud-init-output.log contiene la salida real de tus entradas runcmd, que es donde estará el motivo.

No pongas secretos en él

El user-data permanece legible desde dentro de la instancia durante toda su vida:

cloud-init query userdata

Cualquier cosa que haya allí está disponible para cualquier proceso que alcance root, y para cualquiera que restaure una instantánea del disco. Úsalo para instalar una credencial que obtenga el secreto, no para llevar el secreto.

Probar sin gastar una instancia

cloud-init clean --logs --reboot

Eso elimina el marcador, los registros y la fuente de datos en caché, y luego reinicia en un primer arranque limpio. Ejecútalo en una instancia desechable. Ejecútalo en producción y descubrirás lo que hace tu runcmd la segunda vez, que rara vez es lo que hizo la primera.

Dónde parar

cloud-init es para el arranque y no tiene idea de en qué estado debería estar la máquina mañana. Úsalo para llegar al punto donde tu herramienta real pueda tomar el relevo: una clave, una red, un agente. Para ahí. Sesenta líneas es un user-data saludable, y seiscientas es un sistema de gestión de configuración sin forma de converger.

cloud-init query -a
cloud-init query ds.meta_data

El ID de instancia, el código de sitio, el hostname y las direcciones asignadas en el arranque viven allí, que es lo que un script necesita cuando tiene que registrarse en algún lugar y aún no sabe dónde se ha despertado.

Listo cuando tú lo estés

Elige una ciudad. Elige un tamaño. Paga con monedas.

Sin fórmulas sobre quién eres, sin esperar a que un humano te apruebe, sin llamada telefónica para verificar nada. La factura se liquida y las credenciales llegan a tu bandeja de entrada.