Cisco UCS Manager と PowerTool のちょっとしたTips

vExpert Advent CalendarもWeek3に入り、皆さんのステキなエントリーが続いていますね!今回は「分散スイッチングと分散ルーティング」のシリーズは1回お休み?して、今回は閑話休題 的なTipsエントリーをば。

Cisco UCSサーバを統合管理する機能といえばUCS Managerです。実体は Fabric InterConnect (FI) のフラッシュメモリに格納されたプログラムであり、FIに接続されたブレードサーバやラックマウントサーバ、シャーシ、各モジュール、FI自身に対する管理機能を提供しています。

UCS Managerは標準のGUIおよびCLIを提供していますが、バックエンドの処理インターフェイスはすべてXML APIとなっていますので、やろうと思えば、XML APIをダイレクトに叩いて操作することも可能ですし、UCS Managerを叩くAPIを使ってアプリケーションやフロントエンドインターフェイスを別途実装してもらうことも可能です。

Cisco自身が提供しているUCS ManagerのAPIに対するツールとしては、PowerToolと呼ばれるPowerShellのCmdletモジュールやMicrosoft SystemCenterに対するプラグインモジュールなどがあります。これらのツールは、Ciscoのウェブサイトよりダウンロード頂くことが可能です。

PowerToolは、PowerShellを通じてUCS Managerを管理できるように、.NETネームスペースとUCSが標準で持つXML APIを変換するモジュール群といえます。PowerToolをWindowsインストールして "Get-Command -Module CiscoUcsPS | Measure-Object" *1で確認してみたところ、現行の1.01リリースでは1706個のCmdletを提供しているようです。UCS Managerの標準GUIを通じてできる操作をカウントすることは難しいのですが、おおよそすべての管理機能をPowerTool経由で操作できるといってよいかと思います。

…なんて書いてきましたが、まぁそうした細かいことはおいておいて、今回のエントリーはこのPowerToolを使った、ちょっとした使い勝手に関するTipsが今回のテーマです。

UCS Managerの標準GUIでは、管理されている各サーバは下記のようにツリー表示されます。

サーバの一覧を表示すれば、各サーバの詳細情報として、モデル名や搭載CPU、メモリサイズなどの情報も確認することが可能です。

こうした情報の取得はもちろんPowerToolを使っても可能で、Get-UcsBlade Cmdletを叩けば全情報をずらっと取得することができます。
たとえば、サーバの管理情報、モデル名、CPU情報、メモリサイズを取得したいと思った場合には、Get-UcsBladeや、Get-UcsComputeBoard、Get-UcsProcessorUnitなどのCmdletを使えばいいわけですが、それらの出力からSelectで必要な情報だけ抜き出して毎回確認するとか、めんどうですよね。

そんなわけで、ちょっとした情報の確認程度であればGUIの方が便利なわけですが、人間はわがままなもので、わざわざ左側のプルダウンメニューからServerを選択して右側の画面で詳細情報を表示して確認する、という一手間ですら面倒になってくるわけです…^_^;

なので、だったら右側のツリーメニューに最小限でも必要な情報を表示してしまえばいいではないか!ということで、使える機能がユーザラベルです。

この欄に情報を入力しておくと、ツリー表示にもその情報が表示されます。よって、この欄に情報を入力しておけばOK!めでたしめでたし!で済めば楽なんですが、1台や2台ぐらいならともかく、UCS Managerで管理されているたくさんのサーバの情報を1台ずつ確認して手入力していくなんてやってられるか!という声が聞こえてきます…。

じゃ、改めてPowerToolを活用しましょう、ということで、PowerToolを使ってこのユーザラベルに必要な情報を手軽に?書き込んでみたいと思います。

各サーバのユーザラベル情報の入力は、Set-UcsBlade Cmdletの -UsrLbl オプションで設定することができます。具体的には、こんな感じですね。

Set-UcsBlade -UsrLbl "Sample Text" -Force

UCS Manager管理下のブレードサーバ全台のユーザラベルにシリアル番号の情報を入れたければ、こんな感じでしょうか。そうそう、UCS Managerへのログインなどはスクリプトに含めてありませんので、下記コマンドを実行する前に、 "Connect-UCS" Cmdletで対象のUCS Managerに接続しておくことをお忘れなく。

foreach($ucsblade in Get-UcsBlade) {
    $serial = $ucsblade.Serial
    $ucsblade | Set-UcsBlade -UsrLbl $serial -Force
}

ここまでできれば、あとはそんなに難しい話じゃありません。下記サンプルではCisco UCSって文字列をモデル名から省略するとか、CPUモデルを省略表示するためにグチャグチャやってる*2とか、メモリサイズをGB単位にするとか、いろいろ整形関係もしてありますが、それらを除けばかなりシンプルなスクリプトで実装できます。

こんな感じでPowerShellスクリプトを書いて実行すれば、この通り!

foreach($ucsblade in Get-UcsBlade) {
    $model = ($ucsblade | Get-UcsCapability).Name -replace "Cisco UCS ", ""
    $long = $ucsblade | Get-UcsComputeBoard | Get-UcsProcessorUnit -Id 1 | select -ExpandProperty Model
    if($long -match 'Intel.*?([EXL\-57]+\s*\d{4}L*\b(\sv2)?)')
    {
        $cpu = $Matches[1] -replace '- ', "-"
    }
    else
    {
        $cpu = "unknown"
    }
    $mem = $ucsblade.TotalMemory / 1KB
    $custom_label = "$model / $cpu / $mem"
    $ucsblade | Set-UcsBlade -UsrLbl $custom_label -Force
}

ふむ、できました。便利ですね!ユーザラベルはシャーシ単位とかにも記述できますので、シャーシ単位でも搭載FEXモデルとか、ラックマウントの場所とか、何か有用な情報を書いておくと、より便利かもしれません。

本エントリーは、CiscoのCommunityサイトに掲載されている "UCS Inventory Based User Labels for Servers PowerShell Script" の情報を参考にしてお送りいたしましたー。

次回は、改めて「分散スイッチングと分散ルーティング」の最終回?をお届けしたいと思います。明日からは、 @interto さんの怒濤の連載シリーズが始まります。楽しみですね!

*1:Measure-ObjectはmeasureでもOKですね。

*2:現在、UCSはIntel CPUの搭載モデルしかないからこの程度で済んでますけどね…(^_^)v