{{indexmenu_n>40}} ## Effectuer une opération sur l'ensemble des machines ### Motivation On a parfois besoin d'effectuer la même opération sur toutes les machines : installer un paquet, le configurer, redémarrer un service, etc. Se connecter un à un aux machines est assez pénible, fastidieux, et plus propice aux erreurs. De plus, on utilise pas Ansible, qui permettrait de résoudre le problème assez facilement. Je te propose ici une solution simple pour automatiser la connexion à toutes les machines, et taper une seule fois les commandes. Il existe plein d'autres solutions : `pssh`, `cssh`, etc. Libre à toi de choisir celle qui te convient ! ### Terminator et layout personnalisé [Terminator](https://doc.ubuntu-fr.org/terminator) est un terminal virtuel qui a pour particularité de pouvoir scinder la fenêtre en plusieurs sous-terminaux, de créer des groupes de terminaux où les commandes sont répliquées, et est très personnalisable. En général, il suffit d'installer le paquet `terminator` sur ta machine. La configuration se trouve dans le fichier `~/.config/terminator/config`, mais est aussi accessible via un clic droit → préférences dans le terminal. #### Configurer le layout Ouvre un terminal, puis utilise une combinaison des raccourcis `Ctrl+Shift+o` et `Ctrl+Shift+e` pour ouvrir des sous terminaux, jusqu'à ce que la disposition te convienne et qu'il y en ait aucun que de machines (à ce jour, 8 : `alice`, `bob`, `caribou`, `pica01`, `pica02`, `pica01-test`, `monitoring`, `media`). C'est rare de devoir toucher simultanément aux machines physiques et aux machines virtuelles. Exemple : {{ :technique:tips:terminator_split.png?800 |}} Ensuite, on se rend dans les paramètre de `Layout`, et on en rajoute un nouveau. Terminator va automatiquement récupérer la configuration des terminaux ouverts, et l'intégrer dans le nouveau profil, il n'y a rien à faire. Si d'autres instances de Terminator sont ouvertes, elles seront également prises en compte, il vaut mieux les fermer. Exemple : {{ :technique:tips:terminator_new_layout.png?400 |}} On renomme le profil (exemple `picasoft`), et on appuie sur `save`. On retrouve bien les 7 terminaux. Pour chacun d'entre eux, on va indiquer la commande à exécuter, en l'occurrence une connexion SSH sur les machines. Exemple : {{ :technique:tips:terminator_custom_command.png?600 |}} Ne pas cliquer sur `save` ! \\ « **If you use the Save button** in the Layouts after spending time setting the items below, **you will lose these stored values (custom command, working directory)**. First get the layout right, then edit these within the Layouts tab of the Preferences Window. You do not need to use the Save button to keep these settings. There is potential to improve this behaviour, as it is a little unintuitive. » *[Source](https://terminator-gtk3.readthedocs.io/en/latest/layouts.html)* On change la machine pour chaque terminal, puis on ferme. Pour charger le layout, il y a deux solutions : * Lancer `terminator`, clique droit → Layout → picasoft * Lancer `terminator -l picasoft` Un Ctrl+C fermera tout simplement le terminal, car la commande `ssh` est alors terminée. Si tu versionnes tes fichiers de configuration, n'hésite pas à rajouter celui de Terminator, ainsi tu profiteras de ce layout sur toutes tes machines :-D ### Envoyer des commandes à tous les terminaux Normalement, à ce stade, on te demande de rentrer la *passphrase* de ta clé SSH. Pour éviter de la rentrer 7 fois, on va utiliser une fonctionnalité très pratique de Terminator : le **broadcast**. Chaque lettre est reproduite sur l'ensemble des terminaux. Pour l'activer, clique sur l'icône de terminaux dans la barre de titre d'un des terminaux, puis choisis `Broadcast all`. {{ :technique:tips:terminator_broadcastt.png |}} Il est aussi possible de mettre tous les terminaux dans un groupe (`Group All in Tab`) puis de broadcaster pour ce groupe uniquement. Sinon, le broadcast sera effectif dans tous les autres terminaux ouverts, même dans une autre fenêtre. Maintenant, tu peux rentrer ta passphrase et tester la puissance de cette configuration en lançant une commande sur toutes les machines, par exemple `hostname` : {{ :technique:tips:terminator_hostname.png?800 |}} ### Un grand pouvoir... C'est **très** dangereux de lancer des commandes sur l'ensemble des machines de production, simultanément. Assure-toi d'avoir bien vérifié et de suivre les recommendations qui suivent. * Assure toi que toutes les machines tournent sur le même OS, c'est plus sûr. Ici, tout est en Debian 10, ça le fait. * Utilise [[technique:tips:tmux|tmux]] pour éviter qu'une interruption de la connexion SSH ne vienne tout casser * Regarde les logs de chaque commande tapée pour l'ensemble des fenêtres. Si une des commandes foire et que tu ne t'en rends pas compte, ça peut vite aller à la catastrophe, notamment lors de mises à jour... * S'il y a une erreur sur l'une des fenêtres, désactive le broadcast et règle le problème sur la fenêtre en question Toute commande en `sudo` doit être vérifiée mille fois. :-D