swarm exec: un comando, todos los clones


19 de abril de 2026

Hasta hoy, para ejecutar algo en todos los clones del enjambre habia que hacer SSH a cada uno por separado. Hoy eso se acabo.

$ swarm exec 'hostname'
=== aurin (local) ===
  aurin
=== macbook ===
  macbook
=== cohete ===
  cohete
=== vespino ===
  [fail] (apagado)

Un comando. Tres clones responden. El que esta apagado se salta. Sin configurar nada, sin scripts, sin Ansible.

Lo que habia antes

Cada clon del enjambre vivia en su burbuja de SSH. Si querias saber el disco de todos:

ssh aurin 'df -h /'
ssh root@cohete 'df -h /'
ssh macbook 'df -h /'     # Permission denied
ssh vespino 'df -h /'     # Connection refused

Cuatro comandos. Dos fallan. Cada uno con su usuario, su IP, su puerto. Un infierno para mantener mas de 2 maquinas.

Lo que hay ahora

swarm exec 'df -h / | tail -1'
=== aurin (local) ===
  /dev/nvme1n1p2  3,6T  1,2T  2,3T  33%
=== macbook ===
  /dev/nvme0n1p2  233G   45G  176G  21%
=== cohete ===
  /dev/sda2        75G   38G   34G  53%

Tres discos en un vistazo. ¿Servicios?

swarm exec 'systemctl is-active tailscaled syncthing'

¿Git?

swarm exec 'git -C ~/dotfiles log --oneline -1'

¿Quieres actualizar TODOS los clones a la vez?

swarm exec 'git -C ~/dotfiles pull --ff-only'

El problema que habia: SSH keys

swarm exec funcionaba para aurin y cohete pero macbook daba "Permission denied". La clave SSH de aurin no estaba autorizada en macbook. Cada vez que anadias un clon nuevo tenias que copiar keys manualmente.

La solucion: centralizar las pubkeys en modules/core/users.nix:

# modules/core/users.nix
openssh.authorizedKeys.keys = [
  "ssh-ed25519 AAAA...KY"    # aurin + macbook + vespino
  "ssh-ed25519 AAAA...Pj"    # retropix
];

Una lista. Todas las pubkeys del enjambre. Cada clon que haga rebuild las tiene automaticamente. swarm exec funciona en todos sin configuracion manual.

Clon nuevo → anade su pubkey aqui → rebuild → ya puede hablar con todos.

Como funciona swarm exec por dentro

swarm exec 'hostname && uptime'
       │
       ├── tailscale status --json
       │   → lista de peers con IPs mesh (100.64.0.x)
       │
       ├── para cada peer:
       │     ssh [email protected] 'hostname && uptime'
       │     timeout 5s, BatchMode=yes
       │     si falla → [fail], siguiente
       │
       └── para self (localhost):
             bash -c 'hostname && uptime'

No necesita conocer IPs, puertos, ni usuarios. Lee la lista de la mesh VPN (Tailscale/Headscale) y conecta via las IPs mesh. Si un clon esta en el campo, otro en un piso, otro en un VPS en Alemania — da igual. La colmena los conecta.

Otros subcomandos de swarm

swarm list              # ver clones UP/DOWN
swarm ssh macbook       # conectar a un clon
swarm ping cohete       # latencia via mesh
swarm status            # reporte completo
swarm ip aurin          # solo la IP mesh
swarm join              # unirse al enjambre

Pero swarm exec es el gordo. Con el puedes administrar el enjambre entero desde cualquier clon.

Usos reales

# Ver quien tiene la config desactualizada
swarm exec 'git -C ~/dotfiles log --oneline -1'

# Reiniciar syncthing en todos
swarm exec 'sudo systemctl restart syncthing'

# Espacio en disco de todo el enjambre
swarm exec 'df -h / | tail -1'

# Quien tiene tailscale activo
swarm exec 'tailscale status 2>/dev/null | head -1 || echo NO'

# Actualizar todos los clones
swarm exec 'cd ~/dotfiles && git pull --ff-only'

El coste de implementacion

El script swarm son 188 lineas de bash. Las authorizedkeys son 6 lineas de Nix. La VPN mesh ya existia. Total: ~200 lineas para administrar N maquinas con un solo comando.

Ansible necesita inventarios YAML, playbooks, roles, y un servidor de control. Puppet necesita un master. Salt necesita un master. Nosotros: un script bash y una mesh VPN.

Por que importa

Esto no es "comodidad". Es la diferencia entre "mantengo 5 maquinas" y "mantengo un enjambre". Cuando tienes que hacer algo en todas, no piensas en cada una — piensas en el enjambre como unidad.

swarm exec 'r' — todos hacen fetch, pull, rebuild. Un comando. Eso es Saddle Computing: tu entorno no esta en una maquina, esta en todas. Y las controlas como una.

Por el enjambre.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario