新人君たちと本番環境の構築作業でデータセンターに入り。
構築したサーバから、既存の重要なサーバへの疎通確認を行うために、pingを何度も入力する予定とのこと。
作業時間の短縮や間違いの低減のために、この確認作業を纏めて行うツール(DOSバッチ)を作成した。
作業効率化のためにこのような自動化ができないかを考えてほしい、だとか、自動化を過信すると逆に大きなミス(ツールのバグで疎通確認できていなかった等)になる場合もあるので、作業効率と確実性のバランスをとることも大事と伝えた。
ツール概要
説明
- 複数のサーバに対して纏めてping疎通確認する。
- 入力となるテキストファイルに記載されたサーバに対してpingを実行する。各pingの実行結果をログファイルに出力する。
- このツールを共有フォルダに配置し、各サーバからこの共有フォルダ(\\で始まるパス: UNC)を開いて、本ツールを実行する想定です。ログファイルの場所がバラバラにならないよう、実行結果のログは本ツールと同じ共有フォルダ上に出力する設計になっています。
- pingの実行仕様は、実行回数: 1、タイムアウト: 1,000[ms]とする。
ダウンロード
下記からダウンロードできます。
tools. Contribute to nextdoorwith/tools development by creat…
フォルダ構成
- ping_all.bat: 本ツール本体
- ping_cmd.bat: 本ツールで使用するバッチ
- hosts.txt: 疎通確認対象となるサーバの一覧を定義するファイル
- log: ログファイルを格納するフォルダ
- ping_all_[HOSTNAME].log: ログファイル、[HOSTNAME]は実行時サーバ名
実行方法
エクスプローラでping_all.batをダブルクリックする。
または、コマンドプロンプトから実行する。
入力ファイル仕様
hosts.txtファイルに対象ホストを1行1つ定義する。
localhost
127.0.0.1
192.168.1.1出力ファイル仕様
ping_all_[HOSTNAME].logに次のように確認結果を出力する。
成功の場合は”OK”、失敗の場合は”**NG**”と出力する。(“NG”だと、ぱっと見、”OK”と誤認する可能性があるので、”*”を付けて桁数を変えることで目立つようにした。)
[19:14:19.22]: START
localhost: OK
127.0.0.1: OK
192.168.1.1: **NG**
[19:14:20.21]: ENDツールの実装内容
ツールのソースコードは次の通り。
hosts.txtの内容を1行づつ読み取っり、その内容を引数として、後述のping_cmd.batを実行する。
ファイル内容を1行づつ読み取るためにfor文を使った。空白を含むパス上のファイルも対象とできるよう”for /F %%f (“%DEST_HOST_FILE%”)”(30行目)と書いたが、空白で区切られた複数のトークンと認識されてしまった。これを回避するために、”for /F %%f in (‘type “%DEST_HOST_FILE%”‘)”とした。
@echo off
rem
rem 複数のサーバにpingを送信する。
rem 実行結果をログファイルに出力する。
rem
rem 【説明】
rem ・ネットワークパス(UNC)から実行できるよう絶対パス指定にしています。
rem (「UNC パスはサポートされません~」は無視して問題なし)
rem ・ping送信対象を定義したhosts.txtファイルを同じフォルダ配置してください。
rem
set MYNAME=%~n0
set BASE_DIR=%~dp0
set DEST_HOST_FILE=%BASE_DIR%hosts.txt
set PING_CMD=%BASE_DIR%ping_cmd.bat
set LOG_DIR=%BASE_DIR%log\
set LOG_FILE=%LOG_DIR%%MYNAME%_%COMPUTERNAME%.log
rem ログフォルダ作成
mkdir "%LOG_DIR%" > nul 2>&1
rem 開始メッセージ出力
echo 宛先ホストファイル : %DEST_HOST_FILE%
echo 実行結果の出力先 : %LOG_FILE%
rem 開始メッセージをログ出力
echo [%time%]: START > "%LOG_FILE%"
echo.>> "%LOG_FILE%"
rem 入力ファイルに定義されたホストに対してpingを実行
for /F %%f in ('type "%DEST_HOST_FILE%"') do (
call "%PING_CMD%" %%f >> "%LOG_FILE%" 2>&1
)
rem 終了メッセージをログ出力
echo.>> "%LOG_FILE%"
echo [%time%]: END >> "%LOG_FILE%"
pause引数で指定されたホストに対してpingを実行する。
実行時の出力に”(0% の損失)”が含まれている場合、成功と見なす。%は予約語なので%%とエスケープする必要がある。
@echo off
rem
rem pingを実行する。
rem
rem OKと見なす文字列
set OK_STR=(0%% の損失)
rem pingコマンドパス
set PING_CMD=ping
rem pingコマンドオプション
rem -n: 回数、-w タイムアウト[ms]
set PING_OPT=-n 1
set PING_OPT=%PING_OPT% -w 1000
set DEST=%1
rem 引数チェック
if "%DEST%"=="" (
echo 送信先を指定してください。 1>&2
exit /b 1
)
rem ping実行
%PING_CMD% %PING_OPT% %DEST% | find "%OK_STR%" > nul 2>&1
if %ERRORLEVEL% == 0 (
set RESULT=0
set RESULT_DISP=OK
) else (
set RESULT=1
set RESULT_DISP=**NG**
)
echo %DEST%: %RESULT_DISP%
exit /b %RESULT%