2013年5月30日木曜日

バッチでパッチ適用


対象OS
WindowsXP
Windows2003
Windows7
Windows2008



概要


システムの運用を行っていると、定常的なオペレーションとしてOS再起動に合わせた
パッチ適用を実施したい場面が出てくると思う。


良くも悪くも、Windows系のシステムの場合、
OS再起動を考慮していないシステムをあまり見たことが無いので
このような書き方をしてみましたが。。。


再起動ついでにパッチ適用もバッチ化して自動化してみようという計画です。
パッチをバッチ・・・とか狙ってる訳ではありません。


WindowsUpdateなどではなく、他にもMicrosoftからいくつか提供されていたと思うが
それらを使う訳ではなく、あくまでOS再起動をBaseとしたパッチ適用のバッチを考えてみてます。


パッチ適用バッチ


やっつけで作ったバッチなのでデバッグが足りないかもしれませんが、
以下のようなバッチを作ります。

引数なしの場合は手動実行だいう想定で、パッチのパスを指定するように作ってます。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

rem : パッチ保存パス指定
if "%1" == "" (
set /p PATDIR="パッチが保存されているパスを指定してください:"
) else (
rem : 対象のパッチを1つのフォルダにまとめておく。
set PATDIR=%1
)

rem : ログファイル名
set LOGFILE=INS_PATCH.log

rem : インストール時のチェック用ファイル
set PINS_CK_LIST=PTINSTCK.txt
if exist %PINS_CK_LIST% del /f /s /q %PINS_CK_LIST% >nul 2>&1

rem : インストール結果確認用ファイル
set PCK_LIST=PTCKLIST.txt
if exist %PCK_LIST% del /f /s /q %PCK_LIST% >nul 2>&1

rem : 戻り値
set ret=0


echo ========================================= >>%LOGFILE%
echo start: %date% %time% %COMPUTERNAME% >>%LOGFILE%
echo パッチ保存フォルダ ・・・ %PATDIR% >>%LOGFILE%
echo. >>%LOGFILE%
echo -- パッチ適用開始-- >>%LOGFILE%

for /F %%A in ('dir /b/a-d %PATDIR%') do (

rem : --- デバッグ字に有効にしてください("rem - "の削除) ---
rem :
rem - echo debug -- 対象ファイル -- %%A >>%LOGFILE% 2>&1
echo debug -- 対象ファイル -- %%A
rem - echo debug -- 実行コマンド:%PATDIR%\%%A /u /q /z >>%LOGFILE% 2>&1
rem :
rem : --------------------------------------

    rem : パッチ適用
    call %PATDIR%\%%A /u /q /z >>%LOGFILE% 2>&1
    if !errorlevel! == 1603 (
        echo  ★ %%A パッチ適用時にエラーが発生 >>%LOGFILE%
        echo %%A >> %PINS_CK_LIST%
    )

)


rem : -------------------------------------
rem : エラーチェック概要:
rem :     パッチからKBの番号を抜き出し、
rem :     「systeminfo」コマンドで対象ファイルがインストールされているか確認
rem :
rem :     ※マイクロソフトが出しているパッチのの命名規則が、
rem :     区切り文字 "-" かつ、2番目に "KB" が表示されることを想定している
rem : -------------------------------------

echo --インストールチェック >>%LOGFILE%

for /F "tokens=1-5 delims=-" %%a in ('dir /b/a-d %PATDIR%') do (

    rem : --- デバッグ字に有効にしてください("rem - "の削除) ---
    rem - echo debug -- echo エラーチェック: %%a %%b %%c %%d %%e >>%LOGFILE%
    echo debug -- echo エラーチェック: %%b
    rem : --------------------------------------

    rem : チェック処理
    systeminfo | find "%%b" >nul 2>&1
    if not !errorlevel! == 0 (
        echo  ★ %%b systeminfoの結果を参照ください >>%LOGFILE% 2>&1
        echo %%b>>%PCK_LIST%
    )
)


echo ----------- >>%LOGFILE%
echo 終了処理 >>%LOGFILE%
echo ----------- >>%LOGFILE%

if exist %PINS_CK_LIST% (
    echo ★インストールエラー >>%LOGFILE%
    echo 対象ファイルの再インストールを実施ください >>%LOGFILE%
    type %PINS_CK_LIST% >>%LOGFILE%
    set ret=1
)

if exist %PCK_LIST% (
    echo ★インストールチェックでエラー >>%LOGFILE%
    echo 対象ファイルの再インストールを実施ください >>%LOGFILE%
    type %PCK_LIST% >>%LOGFILE%
    set ret=1
)


if %ret% == 0 (
    echo 正常終了 >>%LOGFILE%
) else (
    echo 異常終了 >>%LOGFILE%
)

echo. >>%LOGFILE%
echo end: %date% %time% %COMPUTERNAME% >>%LOGFILE%
echo ========================================= >>%LOGFILE%


endlocal




ちょっとだけ解説

詳しく知らなかったんですが・・・
最近のパッチって・・・・UpdateだのHotfixだのコマンドが仕込んで合ったのですね。。。。
新しいものはほとんどUpdateみたいですが、オプションは以下です。

Update Hotfix 説明 バージョン(以降)
/help /? コマンド ライン ヘルプを表示 5.3.24.3 以降
/passive /u 無人セットアップ モード 5.3.24.3 以降
/quiet /q Quiet モードで実行します。無人モードと同じですが、
インストールの状況やエラー メッセージは表示されません。
5.3.24.3 以降 
/norestart /z インストールの完了時に再起動しません。 5.3.24.3 以降 
/warnrestart
再起動のタイマーを表示し(既定値は 30 秒)
/quiet または /passive スイッチと共に使用します。
6.1.22.0 以降
/forcerestart
インストールの完了後にコンピューターを再起動します。
シャットダウン時に開いているファイル、アプリケーションは強制終了
5.3.24.3 以降
romptrestart
再起動が必要な場合にユーザーにダイアログ ボックスを表示
/quiet スイッチと共に使用します。
6.1.22.0 以降
/forceappsclose /f コンピューターのシャットダウン時に他のプログラムを終了します。 5.4.15.0 以降 
/nobackup /n アンインストール用にファイルをバックアップしません。 6.1.22.0 以降 
/overwriteoem /o OEM ファイルを上書きするときに確認メッセージを表示しません。 6.1.22.0 以降 
/integrate:path /s 指定したパスにある Windows インストール ソース ファイルに
ソフトウェア更新プログラムを統合します。
:path
には、i386 フォルダーが格納されているフォルダーを指定します。
5.4.15.0 以降
/log:path
ログ ファイルを作成する場所を指定できます。 6.1.22.0 以降
/ER
拡張エラー報告を有効にします。 すべての
バージョン
/verbose /v 詳細ログを有効にします。インストール時に、
%Windir%
\CabBuild.log ファイルを作成し、コピーされるファイルの詳細を記録します。
このスイッチを使用すると、インストール処理の所要時間が増加することがあります。
5.3.24.3 以降 
/d:path
Windows Service Pack のインストール用のバックアップ ディレクトリを指定します
:path には、バックアップ ファイルの保存先のフォルダーを指定します。
既定のバックアップ場所は %Systemdrive%\$ntservicepackuninstall$ です。
5.3.16.5 以降
/extract[:path] /x セットアップを起動せずにファイルの展開のみを行います。
":path" が含まれていない場合、ファイルの展開先のフォルダーのパスを
入力するように求められます。":path" が使用されている場合には、
ファイルは指定されたフォルダーに展開されます。
5.3.24.3 以降 
/hotpatch:disable
ホットパッチ機能を無効にし、通常の更新プログラムとしてインストールします。 6.1.22.0 以降
(Windows 2003 専用)

/l インストールされているソフトウェア更新プログラムの一覧を表示します。

/m 無人モードで実行します。

/n アンインストール用にファイルをバックアップしません。

/y アンインストールを行います (/m または /q と共に使用する必要があります)。


このあたりを元にバッチ化してみてます。

仕込みかた



①パッチをダウンロードして、適用したいサーバから参照可能な共有フォルダに保存
②グループポリシー(gpedit.msc)のシャットダウンなどに仕込めばあとは再起動時に勝手にやってくれるはず。(スクリプトとパラメータを指定)




まとめ


「サーバに検証が完了したバッチファイルだけ適用する仕組みを作りたい」と思い
やっつけでスクリプトも作成してみました。
不具合があるかもしれませんが、自動化のアプローチのご参考までに。

0 件のコメント:

コメントを投稿