Faire du Cluster SSH avec tmux et tmuxinator

- Unix

Je suis devenu un huge fan de tmux qui permet de faire énormément de chose dans son terminal. J’en ai déjà parlé il y a quelques temps sur la Sheevaboite en vous présentant ma configuration (qui a bien changé depuis).
Aujourd’hui, je vais vous présenter une fonctionnalité que je viens de découvrir et que je regrette de ne découvrir que maintenant…

Connexions multiples en SSH ?

Ne vous est-il jamais arrivé de devoir accéder à plusieurs serveurs en même temps pour supprimer un fichier, monitorer des logs ou autre réaliser une action qui nécessitait de taper plusieurs fois les mêmes commandes dans différents terminaux ?
Les plus malins d’entre vous connaissent déjà ClusterSSH (ou CSSH pour les intimes) ou Fabric qui permet de justement se connecter à plusieurs serveurs et d’exécuter des commandes en ne les saisissant qu’une seule fois dans une petite fenêtre modale.

Si jamais vous utilisez tmux, vous allez pouvoir désinstaller ClusterSSH et si vous n’utilisez pas tmux voici encore une autre bonne raison de le faire.

Tmuxinator pour gérer les sessions

Avant de parler de tmux, voici Tmuxinator est un utilitaire développé en ruby qui permet de facilement gérer des configurations de sessions tmux. C’est tmuxinator qui devenir très utile pour démarrer une session tmux avec des configurations précises, par exemple ouvrir un pane avec une session SSH pour chaque serveurs.
Comme c’est développé en ruby, l’installation est triviale :

$> gem install tmuxinator

Une fois l’installation terminé, il faut configurer un peu son environnement pour y intégrer tmuxinator. Vérifier que les variables $EDITOR et $SHELL existent puis ajouter la ligne suivante dans votre environnement (dans votre fichier bashrc ou .zshrc) afin qu’elle soit exécutée au démarrage de votre shell :

# Si jamais vous n'avez pas défini $EDITOR et $SHELL, à adapter bien sur
export SHELL=/bin/zsh 
export EDITOR=vim

[[ -s $HOME/.tmuxinator/scripts/tmuxinator ]] && source $HOME/.tmuxinator/scripts/tmuxinator

Une fois la configuration terminée, on peux créer une configuration que l’on va appeler serveur :

$> tmuxinator open serveur

Si la configuration est ok, vous devriez avoir l’appli vim ouverte avec un fichier pré-configuré, mais nous allons le modifier pour l’exemple avec la configuration suivante. Nous allons ouvrir une session avec une seule fenêtre et 4 “panes” :

# ~/.tmuxinator/serveur.yml
# you can make as many tabs as you wish...

project_name: serveur_truc
project_root: ~/
tabs:
  - serveurs:
      layout: tiled
      panes:
        - ssh serveur01
        - ssh serveur02
        - ssh serveur03
        - ssh serveur04

Sauvez et quittez et vous pouvez maintenant ouvrir une session tmux nommé “serveur” avec la commande suivante :

$> tmuxinator start serveur

Et voilà !

Faire du CLusterSSH dans tmux

La configuration de tmuxinator est terminée, maintenant place à un peu de configuration de tmux. Tmux dispose d’un mode de synchronisation de la saisie qui permet de saisir une fois une commande et la voir s’afficher dans tous les panes. Voici la commande qui permet d’activer ce mode :

set-window-option synchronize-panes on

Ce qu’il faut faire, c’est mapper ce mode avec un raccourci et ca me semble pas mal de l’activer ce mode avec la touche s. Pour faire cela il faut ajouter les lignes suivantes dans votre fichier tmux.conf :

unbind s
bind s set -g synchronize-panes

Dorénavant, lorsque vous voudrez activer ce mode, il vous suffira de faire le raccourci CTR+x s pour voir vos commandes s’afficher dans tous les panes ouverts. Une fois que vous aurez terminé, il faudra bien entendu désactiver ce mode.

Conclusion

Ce petit tutorial vous a montré comment facilement mettre en place un clone de CSSH. Alors, vous n’avez pas forcément besoin de tmuxinator pour profiter du “mode CSSH” de tmux, mais c’est un confort agréable pour ouvrir tous les panes en une seule commande.
J’espère que cela vous aura donné envie de tester un peu tmuxr