もっと簡単に!tmuxで複数のサーバにSSH接続して同じコマンドを一気に送る

tmuxで画面分割したり一斉にキー入力を送信したりする では、tmux上でコマンドを打つことで画面を分割したり、複数の画面に一斉に同じキー入力を実行できることを説明しました。

でも下準備が意外と面倒くさい

確かに一気に同じコマンド入力をできるのは便利だけれど、その下準備が少し面倒くさいですよね。
画面を分割したり、分割した画面を移動しながらSSH接続をして、最後に「set-window-option synchronize-panes on」とかいう長いコマンドを打たないといけません。

面倒くさいのでシェルスクリプトにする

面倒くさいことはスクリプト化します。

#!/bin/bash
tmux start-server
tmux new-session -d -n tmux-ssh-window -s tmux-ssh
for i in $*
do
    tmux split-window -v -t tmux-ssh-window
    tmux send-keys "ssh $i" C-m
    tmux select-layout -t tmux-ssh-window main-horizontal
done
tmux kill-pane -t 0
tmux select-window -t tmux-ssh-window
tmux select-pane -t 0
tmux select-layout -t tmux-ssh-window main-horizontal
tmux set-window-option synchronize-panes on
tmux attach-session -t tmux-ssh

雑ですが、こんな感じです。

使い方

tmux-sshとかテキトーに名前をつけて、実行します。引数として接続先のサーバのホスト名を指定します。(ユーザー名やポートなどの細かい設定は、~/.ssh/configに書いておくと楽です。)

./tmux-ssh web-server-1 web-server-2

指定されたサーバの数だけ画面を分割しながら、それぞれでSSHの接続を確立して、最後に全ての画面へのキー入力を同期します。

簡単な説明

tmux split-window -v -t tmux-ssh-window

画面を分割するコマンドです。

tmux send-keys "ssh $i" C-m

画面(ペイン)にコマンドを送るコマンドです。ここでssh接続をしています。

tmux select-layout -t tmux-ssh-window main-horizontal

分割された画面(ペイン)の配置を変えるコマンドです。main-horizontalは、下の図のような、ひとつだけ上に配置して残りを下に並べる配置です。

tmux select-pane -t 0

全てのペインの中の0番目のインデックスのものを選択します。この場合は、上の大きい領域を占めているペインに当たります。

tmux set-window-option synchronize-panes on

tmuxで画面分割したり一斉にキー入力を送信したりする でも書きましたが、入力されたキーを全てのペインに送るためのコマンドです。

Amazon Auto Scalingとの組み合わせ

Amazon Web Servicesには、Auto ScalingというWEBサーバを自動でスケールアウトさせる枠組みがあります。これは必要十分なWEBサーバ数を維持するという意味でとても便利なのですが、WEBサーバを立ち上げたり落としたりを繰り返すので、接続先のWEBサーバがころころ変わります。これを毎回WEBのManagement Consoleからホスト名を確認して一つずつ接続するというのは、あまりにも大変です。
そこで僕はAWS SDK for PHPを使ってオートスケールしているサーバの全てのホスト名を取得した上で、上のようなスクリプトで全てのサーバに一斉に接続できるようにしています。こういうことも簡単にできるのが、AWSのありがたいところです。

コメント

  1. […] これは「もっと簡単に!tmuxで複数のサーバにSSH接続して同じコマンドを一気に送る」に書いたのと同じようなプログラムを取り込みました。 […]

タイトルとURLをコピーしました