データセンター業務では時に数百台あるサーバの設定を一つ一つ確認しなければならないことがあります。
作業内容はコマンドを2~3個実行し、結果をまとめる単純な作業です。
この作業を効率化できないかと調査したところ、TeraTermマクロが浮上しました。
今回はTeraTermのマクロでどの程度効率化を図れるか検証してみたので、
興味がありましたらご確認ください。
目次
要件
今回は下記の内容で作業依頼があったと想定してマクロを作成していきます。
- 現在開いているポートの確認
- 25番ポートでListenしているプロセスの確認
- OSの確認
- 確認内容をまとめる
成果物
これから紹介するマクロを使用することで、コマンドの出力結果をファイルに記録することができます。
マクロの内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
; サーバのログイン情報を記述したファイルのパスを記載 LIST = "path\to\input.txt" LOG = "path\to\output.txt" ; ファイルの読み込み fileopen fhandle LIST 0 while 1 ; ファイルを1行ずつ読み込み変数lineに代入 filereadln fhandle line ; 最終行まで読み込んだらwhile文から離脱 if result = 1 then break endif ; 1行をカンマ区切り strsplit line "," ; 結果は変数groupmatchstrに代入される ip = groupmatchstr1 username = groupmatchstr2 password = groupmatchstr3 ; ssh接続 conn = ip strconcat conn ":22 /ssh /2 /nosecuritywarning /auth=password /user=" strconcat conn username strconcat conn " /passwd=" strconcat conn password connect conn ; 0は改行コードなどエスケープしない、次の1は追記を表す logopen LOG 0 1 pause 1 ; コマンド実行 sendln "nmap localhost | grep -e PORT -e open" wait "$" pause 1 sendln "cat /etc/redhat-release" wait "$" pause 1 sendln "sudo ss -nltp | grep :25" sendln password wait "$" pause 2 ; " "$13$10 は空白と改行コードを表す logwrite " "#13#10 logwrite "=========================================="#13#10 sendln "exit" logclose pause 1 endwhile fileclose fhandle |
マクロの詳細
これから実行するTeraTermマクロの構成についてご説明します。
より詳細な機能を知りたい方はTeraTermのTTLコマンドリファレンスをご確認ください。
https://teratermproject.github.io/manual/5/ja/macro/command/index.html
サーバのログイン情報を用意
テスト用のサーバを2つ用意し、それぞれのログイン情報を記述したinput.txtを作成します。
※サーバIPとユーザ名とパスワードをカンマ区切りで分割していますので、パスワードにはカンマを含まない文字列で設定しました。
1 2 |
192.168.0.10,alma-user,w56RyGY3Y9Tm(n9Z 192.168.0.20,fedora-user,LU-aaQ!7Ang-_ncB |
ファイルを開く
1 |
fileopen fhandle LIST 0 |
fileopenでinput.txtを開きます。
繰り返しと離脱
1 2 3 4 5 |
while 1 filereadln fhandle line if result = 1 then break endif |
whileとendwhile間のコマンドを繰り返します。
input.txtの内容を1行ずつ読み込み、読み終わったらwhileから離脱するようにしています。
SSH接続
1 2 3 4 5 6 7 8 9 10 11 12 |
strsplit line "," ip = groupmatchstr1 username = groupmatchstr2 password = groupmatchstr3 conn = ip strconcat conn ":22 /ssh /2 /nosecuritywarning /auth=password /user=" strconcat conn username strconcat conn " /passwd=" strconcat conn password connect conn |
読み込んだ内容をstrsplitでカンマ区切りにし、connectでSSH接続を行っています。
ログを開く
1 2 |
logopen LOG 0 1 pause 1 |
logopenの最後の1は追記を表しています。
1 |
の最後の1は追記を意味しています。 |
コマンド実行
1 2 3 4 5 6 7 8 9 10 |
sendln "nmap localhost | grep -e PORT -e open" wait "$" pause 1 sendln "cat /etc/redhat-release" wait "$" pause 1 sendln "sudo ss -nltp | grep :25" sendln password wait "$" pause 2 |
要件を満たすためのコマンドを実行しています。
ログに区切り線を挿入
1 2 3 4 5 |
logwrite " "#13#10 logwrite "=========================================="#13#10 sendln "exit" logclose pause 1 |
logwriteでログに文字を挿入できます。
” “#13#10は空白と改行を表しており、サーバとサーバの間に===を区切り線として挿入しています。
まとめ
まだ改善の余地はありますが、要件を満たすような作業は自動化できました。
数百台のサーバを調査するとなると数人で手分けして作業するとことになりますが、
マクロを用いれば時間も人手も削減できますし、コピペを間違える可能性もありません。
個人的な見解としては複雑な処理を行うのは難しそうだなと感じました。
また、見ての通りTeraTermの画面に表示されている文字をそのままファイルに出力しているので
出力結果を整形ができたら尚良かったという印象です。
以上、TeraTermマクロの紹介でした。