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 --annotateUn 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.logEl 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 userdataCualquier 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 --rebootEso 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_dataEl 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.