swarm exec: un comando, todos los clones
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 refusedCuatro 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 enjambrePero 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.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario