APC PowerChute TM shutdown Dell EqualLogic Storage Array ソリューション By David Grehan, Sarah Jane Hannon 概要 PowerChute TM Network Shutdown は UPS Network Management Card と連動 しネットワーク経由で安全なシャットダウン を実施することにより 電源障害からシス テムのダメージを防ぎ データを保護しま す このアプリケーションノートでは APC PowerChute Network Shutdownを使用したDell EqualLogic Storage Arrayの安全なシャットダウンについて説明します 用途 ITサーバールーム データセンター リモートのオフィス 分散ネットワーク利点 ネットワークベースの安全なシャットダウン コマンドファイル実行 イベントログ 通信のセキュリティ ブラウザアクセス 冗長 UPS 構成対応 パラレルUPS 構成対応 HTTPS 通信 IPv6 サポート 本書の紹介電源障害の際に Dell EqualLogic Storage Arrayをシャットダウンする場合はこのアプリケーションノートを参考にしてください 本書の方法ではシュナイダーエレクトリックのUPS Switched Rack PDUおよびPowerChute Network Shutdownを使用します 本書では以下の内容について説明しています システム要件 基本設定 必要なスクリプト 設定
はじめに 必要なハードウェア Dell EqualLogic Storage Array サーバの消費電力に応じた容量の APC UPS ネットワークに接続し 最新のファームウェアをロードした APC Switched Rack PDU* APC UPS Network Management Card (UPS をネットワークに接続し PowerChute にステータスを送信するために必要 ) 必要なソフトウェア PowerChute Network Shutdown シャットダウンスクリプト実行用の Strawberry Perl (32 または 64 ビット版 ) 以下のサイトより入手可能です www.strawberryperl.com * 本書で説明する構成は AP7900 Switched Rack PDU にファームウェア rpduv3.7.4 (AOS 3.7.4) をロードして検証しました 基本設定 1 台の UPS より Dell EqualLogic Storage Array Switched Rack PDU およびシステム内の全てのサーバーに電力を供給します Storage Array および PDU のシャットダウンを実行するコントロールサーバー以外の 全てのサーバーを PDU に接続します コントロールサーバーは直接 UPS に接続します システム内の全てのサーバーに PowerChute Network Shutdown v4.1 をインストールしてください 2
必要なスクリプト 注 : 本書記載のサンプルスクリプトは APC および Dell のテスト環境でテストを行っています 本番環境で使用する前に必ずテスト環境で検証を行い お客様の責任のもとで使用してください 1) Dell EqualLogic Storage Array をシャットダウンするスクリプト Dell EqualLogic スクリプトツールは Storage Array のファームウェアバージョンにより異なります スクリプトは EqualLogic サポートサイトよりダウンロード可能です (www.equallogic.com/support) ログインが必要です Windows & Linux 用のホストスクリプトツールは トップバナーのダウンロードセクションで PS シリーズを選択してください 次に 該当するファームウエアバージョンのダウンロードページをクリックしてください 2) APC Switched Rack PDU をオフにするスクリプト 32 ビットまたは 64 ビットの strawberry Perl バージョンを WEB からダウンロードしてください ( 無償 ログイン必要なし ) 本書では SNMP GET/SET コマンドを送信するために Net::SNMP モジュールを使用していますが その他の SNMP ツールも使用可能です このスクリプトは SNMP SET コマンドで PDU のコンセントの出力をオフにします PERL の設定および APC スクリプトの修正の手順 : 1) Strawberry PERLをインストール後 コマンドプロンプトを開き以下のコマンドを入力します : CPAN Net::SNMP 3
必要なスクリプト ( 続き )... 2) 付録にあるサンプルコードを参考に スクリプト delayed_pdu_off.pl を作成します PDU の IP アドレス以外はサンプルから変更する必要はありません お使いの PDU のアドレスを入力してください サンプルの PERL スクリプト以外のサードパーティの SNMP コマンドを使用して Rack PDU をオフにするコマンドを送信するには 以下のようにしてください a) SET コマンドを送る OID:.1.3.6.1.4.1.318.1.1.12.3.1.1.0 b) SET コマンドのシンタックスは INTEGER, 6 (delayedalloff) 3) 全てのサーバーがシャットダウンした後に Dell EqualLogic Storage Array および Rack PDU をシャットダウンするためのスクリプトを実行する.cmd ファイルを作成します もしくはサンプルスクリプトを使用します コマンドファイルは以下の内容を含む必要があります : 1. ping -n 180 127.0.0.1 2. cmd.exe /C perl C: eql_script eqlcliexec.pl -g <ip address> -a <login_name> -p <password> -f <shutdown_file> 3. ping -n 300 127.0.0.1 4. cmd.exe /C perl C: DELL_SNMP delayed_pdu_off.pl <shutdown_file> は実際に存在するテキストファイルのファイル名です (C: eql_script shutdown.txt 等 ) また このファイルには以下の行が含まれている必要があります Shutdown Yes 上記で示した遅延時間 ( 秒 ) を必要に応じて変更します 重要 : ここで示した値は説明のための一例で サーバーとストレージアレイを安全にシャットダウンするためには充分でない可能性があります 安全のために 余裕を見て時間を設定してください 安全なシャットダウンを実行するために充分な時間が設定されているか 本番環境で使用する前に必ずテスト環境で検証を行ってください 最初の遅延時間は スクリプトがストレージアレイのシャットダウンを実行する前に ストレージアレイに接続されている全てのサーバーが安全にシャットダウンするための時間です 注 : サンプルスクリプトは 遅延時間経過後に SNMP SET コマンドを送信して PDU をオフにします コンセントごとに時間差を設定することも可能です 4
設定 PowerChute の設定 管理サーバーは最後にシャットダウンします ストレージアレイと PDU をシャットダウンするスクリプトは 管理サーバー上で実行します スクリプト実行のためのコマンドファイルの起動は PowerChute Configure Shutdown のスクリーンで設定します ここで入力するコマンドファイル実行の所要時間には その他のすべてのサーバーとストレージアレイがシャットダウンするために必要な時間を入力してください 前のセクションで入力した遅延時間を考慮した時間を設定してください ここで入力する時間は PDU によって給電されているすべての機器が PDU よりも前にシャットダウンするように 十分な時間である必要があります 管理サーバー上の PowerChute エージェントのみが UPS をオフにするよう設定します 両方のスクリプトを実行するためのコマンドファイル Turn Off UPS を選択 サーバーとストレージアレイがシャットダウンするために必要な時間 5
設定 PowerChute の設定 管理サーバー以外のサーバーにインストールした PowerChute エージェントでは Configure Shutdown でコマンド実行を設定せず UPS はオフにしないよう設定を行ってください コマンドファイルの欄は空白のままにする Do Not Turn Off UPS を選択する 5
設定 PowerChute Shutdown Delays 管理サーバーを含む各サーバーを PowerChute からシャットダウンするため イベントの設定を行います 全てのサーバー上のイベントに対して 同じシャットダウン遅延時間を設定可能です コマンドファイルの実行が開始したら UPS オフの手順が開始します すべてのサーバー ストレージアレイ PDU 管理サーバーがシャットダウンする時間があるか UPS Low Battery duration が十分な時間かどうか確認してください これは Network Management Card ユーザーインターフェースの Configuration Shutdown タブで設定可能です UPS がオフになる前にすべての機器がシャットダウンするように 十分な時間を設定してください Force Negotiation を選択し すべての PowerChute エージェントに値が反映されるようにしてください 6
設定 PDU 遅延時間 サーバーとストレージアレイがシャットダウンした後で コマンドファイルは 2 つ目のスクリプトを実行し PDU の出力をオフにします PDU の各コンセントに対してオフになるまでの遅延時間を設定する必要があります 以下のスクリーンショットでは すべての PDU のコンセントは スクリプトの実行開始後 5 秒後にオフになります これ以外の値も設定可能ですが すべてのサーバーとストレージアレイはすでにオフになっていますので コンセントもオフにするよう推奨します UPS のシャットダウンシーケンスが終了したら PDU の出力が完全にオフになり その後 UPS もオフになります UPS への電力供給が開始したら Power On Delays の設定に従い PDU がオンになり その後コンセントが出力を開始します トラブルシュート コマンドファイル実行のトラブルシューティングを行う際は cmdfile.log を参照してください コンセントは直ちにストレージアレイへの給電を開始します ストレージアレイがオンラインになるまで十分な時間待機するよう その他のコンセントは Power On Delay が設定されています これにより ストレージアレイがオンラインになった後でサーバーがオンラインになります このファイルは C: Program Files APC PowerChute group1 フォルダにあります コマンドファイルと perl スクリプトが実行された時の出力が保存されています シャットダウンコマンドファイルが実行されるワーキングディレクトリは常に C: Program Files APC PowerChute group1 です 必要な場合は完全パスを使用してください 7
付録 rack PDU をシャットダウンするためのサンプル Perl スクリプト以下の行をコピー & ペーストして delay_pdu_off.plというファイル名のファイルに保存してください IPアドレス ( 赤字で記載 ) のみ変更してください #! /usr/local/bin/perl use strict; use warnings; use Net::SNMP; my $OID_PDUdeviceCommand = '.1.3.6.1.4.1.318.1.1.12.3.1.1.0'; my %host_data_off = ( '10.216.252.197' => '6', '10.216.252.198' => '6', ); for my $host (keys %host_data_off) { my ($session, $error) = Net::SNMP->session( -hostname => $host, -community => 'private', -nonblocking => 1, ); if (!defined $session) { printf "ERROR: Failed to create session for host '%s': %s. n", $host, $error; next; my $result = $session->get_request( -varbindlist => [ $OID_PDUdeviceCommand ], -callback => [ &get_callback, $host_data_off{$host ], ); if (!defined $result) { printf "ERROR: Failed to queue get request for host '%s': %s. n", $session->hostname(), $session->error(); # Now initiate the SNMP message exchange. snmp_dispatcher(); exit 0; 8
Sample Perl script to shut down rack PDU ( 続き )... sub get_callback() { my ($session, $location) = @_; my $result = $session->var_bind_list(); if (!defined $result) { printf "ERROR: Get request failed for host '%s': %s. n", $session->hostname(), $session->error(); return; printf "The result for host '%s' is %s. n", $session->hostname(), $result->{$oid_pdudevicecommand; $result = $session->set_request( -varbindlist => [ $OID_PDUdeviceCommand, INTEGER, $location, ], -callback => &set_callback, ); if (!defined $result) { printf "ERROR: Failed to queue set request for host '%s': %s. n", $session->hostname(), $session->error(); return; sub set_callback { my ($session) = @_; my $result = $session->var_bind_list(); if (defined $result) { printf "The result for host '%s' is '%s'. n", $session->hostname(), $result->{$oid_pdudevicecommand; else { printf "ERROR: Set request failed for host '%s': %s. n", $session->hostname(), $session->error(); return; 9