複数のサーバを利用しての性能評価をよく行うのですが、複数のサーバでの性能評価だと、各サーバの端末を操作して各サーバで色々なログとってきたり設定値変えてまた実験したり…となかなか骨の折れる作業になります。
そのため、一度自分で簡単に実験をしてみたあとは自動化スクリプトを書いて放置!しているのですが、そのときよく利用するものを今後の自分のためにもメモしてみます。
パスワード認証なしのssh接続
複数のサーバ間でログのやりとり等していると、毎回パスワード入力するのがかなり面倒です。後述のsshでのコマンド実行のときにも便利ですし、実験に利用するサーバは基本的にパス無しsshにしちゃいます。
方法は簡単で、以下のとおり。
#接続元サーバにて、以下のコマンドを実行
$ ssh-keygen
$ cat id_rsa.pub >> authorized_key
#接続先サーバへ作成したid_rsaを持って行き、以下のコマンドを実行ログアウト時にはeval `ssh-agent -k`を忘れずに!プロセスが残っちゃいます。
$ eval `ssh-agent`
$ ssh-add id_rsa
この方法では端末ごとに同じ処理を行う必要があり、さらに端末分だけssh-agentが乱立するという問題があります。気になる場合は、プロセスを使いまわすスクリプトを書くか利用するかしたほうがいいかもしれません。
sshでコマンド実行
sshってなんとなくログインするためのコマンドっていう印象がつよいんですが、ログイン先のサーバでコマンド実行もできるんですよね。前述のパスワード認証なしでのssh接続が可能になると、シェルスクリプトにsshでのコマンド実行命令を書き連ねるだけで自動化できて便利です。
方法は以下のとおり。
$ ssh USER@HOST_NAME "実行するコマンド"sshって入力を待ってしまうので、バックグラウンドで動かしたい場合には以下の方法が必要になります。
$ ssh -n USER@HOST_NAME "COMMAND < /dev/null > /dev/null 2> /dev/null &"色々調べてみたところ、-fオプションを付けてもできるのかな?今度やってみよう。
$ ssh -f USER@HOST_NAME "COMMAND"expect
対話型のプログラムをログイン先サーバで自動で動かしたいとなると、sshのコマンド実行では微妙です。こういう場合はexpectを使います。
expectを使ったシェルスクリプトは以下のとおりです。
#!/bin/bash # expectコマンドの前にしたい処理 expect -c " set timeout -1 spawn ssh USER@HOST_NAME expect \"Enter passphrase for key\" send \"PASSWORD\n\" expect \"Last login\" send \"COMMAND\n\" : " # expectコマンドの後にしたい処理
#!/usr/bin/expect set timeout -1 spawn ssh USER@HOST_NAME expect "Enter passphrase for key" send "PASSWORD\n" expect "Last login" send "COMMAND\n" interactexpectコマンドは、実行するコマンドをspawnの後に書き、その後のexpectに書かれている文字列の出力を待った後、sendに書かれている文字列を入力する形になります。 これで対話型プログラムの自動処理が可能になります。 また、最初のset timeoutはタイムアウト時間を設定できます。-1で無限待ちします。 expectだけなら後者を、他の命令も必要であれば前者を利用するとよいです。
さいごに
私が性能実験を自動化する際に主に利用するものを挙げてみました。
シェルスクリプトを本などで体系的に勉強したことがまだないので、もっと便利な方法がありそうな気がします…。
何か見つけたら、追記します。