vSphere SDK for Perl について

vSphere SDK for Perl を導入することによってコマンドベースで遠隔で vCenter 経由で 各ホスト、仮想マシン、データストア情報など様々な情報が取得できるようになります。

使い方によっては、運用が非常に楽になるので、是非、導入することを検討してみてください。

また、vSphere SDK for Perl 4.0 から vSphere コマンドラインインターフェースである vCLI がバンドルされるようになりました。

なので、vSphere SDK for Perl 5.x をインストールすることで、vCLI も使えるようになるので、別途、vCLI をインストールする必要はありません。

作業の流れは、以下の通りです。

  • RPM パッケージインストール
  • Perl モジュールインストール
  • UUID パッケージ作成、及びインストール
  • SDK for Perl ダウンロード
  • SDK for Perl インストール
  • SDK for Perl 5.1 インストールがうまく行かない場合の対処
  • バージョン確認
  • SDK for Perl 初期アプリケーションについて
  • 環境変数設定
  • コマンド実行テスト
  • SDK for Perl 5.5 でコマンド実行に失敗する場合の対処

Cloud Diagram クラウド構成図

vsphere-sdk-for-perl

RPM パッケージインストール

vSphere SDK for Perl をインストールする前に、必要なパッケージを事前にインストールしておきます。

RPM パッケージインストールRaw Code(S)Raw Code(T)
# yum -y install openssl-devel
# yum -y install perl-CPAN
# yum -y install gcc
# yum -y install libuuid-devel
# yum -y install libxml2-devel

Perl モジュールインストール

Perl 関連モジュールが足りないと SDK インストール時に以下のようなエラーで失敗します。

Perl 関連モジュールが足りないときのエラーメッセージ

Network is unavailable, please configure the network first otherwise please install the following modules manually for use by vSphere CLI:

UUID 0.03 or newer

Data::Dump 1.15 or newer

Archive::Zip 1.28 or newer

Class::MethodMaker 2.10 or newer

SOAP::Lite 0.710.08 or newer

XML::SAX 0.16 or newer

XML::NamespaceSupport 1.09 or newer

XML::LibXML::Common 0.13 or newer

XML::LibXML 1.63 or newer

cpan、または、yum でインストールする方法がありますが、yum だとリポジトリによっては、パッケージが存在しなかったり、最新版がインストールされない可能性があるので、Perl 関連モジュールは、全て cpan でインストールすることをオススメします。

環境によって表示されるモジュールリストは異なるかもしれませんが、少なくとも以下のモジュールが必要です。

SDK for Perl 5.1 の場合SDK for Perl 5.5 の場合
UUID 0.03 or newerCompress::Zlib 2.037 or newer
Data::Dump 1.15 or newerCompress::Raw::Zlib 2.037 or newer
Archive::Zip 1.28 or newerversion 0.78 or newer
Class::MethodMaker 2.10 or newerIO::Compress::Base 2.037 or newer
SOAP::Lite 0.710.08 or newerIO::Compress::Zlib::Constants 2.037 or newer
XML::SAX 0.16 or newerLWP::Protocol::https 5.805 or newer
XML::NamespaceSupport 1.09 or newer
XML::LibXML::Common 0.13 or newer
XML::LibXML 1.63 or newer

5.5 の場合には、5.1 の Perl モジュールに加えて 5.5 に必要な Perl モジュールをインストールする必要がありますが、5.1 / 5.5 区別しないで全てインストールしておいたほうが後々楽になるので、全てインストールしましょう。

ちなみに、UUID は、後で別途 RPM を作成してから個別インストールするため、まずは、UUID を除いた以下のモジュールを全てインストールします。

Perl モジュールインストールRaw Code(S)Raw Code(T)
# cpan Data::Dump
# cpan Archive::Zip
# cpan Class::MethodMaker
# cpan SOAP::Lite
# cpan XML::SAX
# cpan XML::NamespaceSupport
# cpan XML::LibXML::Common
# cpan XML::LibXML

# cpan Compress::Zlib
# cpan Compress::Raw::Zlib
# cpan version
# cpan IO::Compress::Base
# cpan IO::Compress::Zlib::Constants
# cpan LWP::Protocol::https

UUID パッケージ作成、及びインストール

perl-UUID は、RPM パッケージ化してからインストールします。

cpanUUID をインストールしようしたら何故かうまく行かず、少し苦戦したので、あきらめて RPM パッケージ化してインストールすることで解決しました。

Step 1. cpan2rpm ダウンロード、及びインストール

cpan2rpm ダウンロード、及びインストールRaw Code(S)Raw Code(T)
# wget http://jaist.dl.sourceforge.net/sourceforge/cpan2rpm/cpan2rpm-2.027-1.noarch.rpm

# rpm -ivh cpan2rpm-2.027-1.noarch.rpm

# rpm -qa | grep cpan2rpm
cpan2rpm-2.027-1.noarch

Step 2. cpan2rpm 実行時の Pod::Text エラー対策

cpan2rpm 実行時に Can't locate object method "interpolate" via package "Pod::Text" というエラーで失敗する場合があるため、事前にバックアップを取ってから /usr/bin/cpan2rpm 内に記述されている全ての Pod::TextPod::Parser に置き換えます。

Pod::Text エラー対策Raw Code(S)Raw Code(T)
# cp -p /usr/bin/cpan2rpm /usr/bin/cpan2rpm.org

# sed -i -e 's!Pod::Text!Pod::Parser!' /usr/bin/cpan2rpm

Step 3. rpmbuild ディレクトリ作成後、UUID パッケージを作成

rpmbuild ディレクトリ作成後、UUID パッケージを作成Raw Code(S)Raw Code(T)
# cpan2rpm --mk-rpm-dirs=/root/rpmbuild
# cpan2rpm --no-sign --requires=perl,libuuid --buildrequires=perl-ExtUtils-MakeMaker,libuuid-devel UUID

Step 4. UUID RPM パッケージをインストール

UUID RPM パッケージをインストールRaw Code(S)Raw Code(T)
# cd /root/rpmbuild/RPMS/x86_64/

# ls -l *.rpm

# rpm -ivh perl-UUID-0.05-1.x86_64.rpm

# rpm -qa | grep UUID
perl-UUID-0.05-1.x86_64

SDK for Perl ダウンロード

My VMware へ接続し、インストーラをダウンロードし、サーバにアップロードします。

私の環境は、CentOS 6.5(64bit) だったので、vSphere SDK for Perl - 64-bit Linux Installer をダウンロードしました。

vSphere SDK for Perl ダウンロード

SDK for Perl インストール

先ほどダウンロードしたファイルを解凍後、vmware-install.pl を実行してインストールします。

インストールするためには、プロキシサーバを指定しないとインストールに失敗しますが、プロキシを使ってない環境もあるので、インストール前にプロキシ関連ロジックをスキップするようにしてからインストールします。

SDK for Perl インストールRaw Code(S)Raw Code(T)
# tar xvzf VMware-vSphere-Perl-SDK-5.X.X-XXXXXX.x86_64.tar.gz
# cd vmware-vsphere-cli-distrib

# export http_proxy=http://127.0.0.1:0000
# export ftp_proxy=http://127.0.0.1:0000

# ./vmware-install.pl
---------------------------------------------------------------------------
ライセンスに合意するか確認を求められたら「yes」を入力します。
---------------------------------------------------------------------------
Do you accept? (yes/no) yes

---------------------------------------------------------------------------
ライセンスに合意した後に Perl モジュールの CPAN インストールが実行されます。
少し時間がかかるので、終わるまで待ちます。

Perlモジュールのインストールに成功すると
vSphere SDK for Perl のインストール先を求められます。

インストール先は、特に指定が無ければ、そのまま Enter を押してください。
---------------------------------------------------------------------------

In which directory do you want to install the executable files?
[/usr/bin]

	・・・

# 

SDK for Perl 5.1 インストールがうまく行かない場合の対処

SDK for Perl 5.1 をインストールする際に、プロキシ関連問題によってうまくいかない場合には、インストーラを編集し、ftpproxyhttpproxy 判定ロジックをコメントアウトしてからインストールしてみてください。

vmware-install.plRaw Code(S)Raw Code(T)
#    if ( !( $ftpproxy && $httpproxy)) {
#        uninstall_file($gInstallerMainDB);
#        exit 1;
#    }

上記のコードは、5.5 には存在しません。

バージョン確認

これで、一応、遠隔でコマンドを実行する準備はできました。

バージョン確認Raw Code(S)Raw Code(T)
# vmware-cmd --version
vSphere SDK for Perl version: 5.5
Script 'vmware-cmd' version: 5.5

後は、コマンドをもっと楽に使うための環境変数設定と実際にコマンドを実行してみるだけです。

SDK for Perl 初期アプリケーションについて

SDK for Perl をインストールすると /usr/lib/vmware-vcli/apps 配下にいくつかの Perl アプリケーションとサンプルデータが配置されるようになります。

ディレクトリ名アプリケーション / サンプルデータ
AppUtilHostUtil.pm
VMUtil.pm
XMLInputUtil.pm
generalconnect.pl
credstore_admin.pl
extractlog.pl
fileaccess.pl
vidiscovery.pl
viversion.pl
hostdsbrowse.pl
hostdiagnostics.pl
hostevacuate.pl
hostinfo.pl
hostops.pl
performanceviperformance.pl
sampledataguestinfo.xml
vmclone.xml
vmcreate.xml
vmreconfig.xml
schemaguestinfo.xsd
vmclone.xsd
vmcreate.xsd
vmreconfig.xsd
sessionload_session.pl
save_session.pl
vmguestinfo.pl
sharesmanager.pl
snapshotmanager.pl
vdiskcreate.pl
vmclone.pl
vmcontrol.pl
vmcreate.pl
vminfo.pl
vmmigrate.pl
vmreconfig.pl
vmregister.pl
vmsnapshot.pl
vmtemplate.pl

遠隔で仮想マシン設定を変更することも可能ですが、商用環境で動いている仮想マシンをコマンドベースで変更するのは少し怖かったので、私の場合には、主に情報収集目的で使っていて、全ての操作・作業は、vCenter 上で実施するようにしています。

プログラミングガイド、アプリケーションレファランス、各種ドキュメントは、以下を参照してください。

環境変数設定

Perl アプリケーションが入っているディレクトリパスを環境設定ファイルに登録して、コマンド実行時に絶対パスを指定しなくてもいいようにしておきます。

また、vmware-cmd を実行する際に、SSL 証明書のホスト名チェックを OFF にする必要があるので、PERL_LWP_SSL_VERIFY_HOSTNAME=0 を設定して無効にしてください。

以下のパスを /root/.bash_profile に追加し、現在、開いているターミナルに設定を適用します。

環境変数設定Raw Code(S)Raw Code(T)
# vi /root/.bash_profile

	・・・

export PATH=$PATH:/usr/lib/vmware-vcli/apps/general
export PATH=$PATH:/usr/lib/vmware-vcli/apps/host
export PATH=$PATH:/usr/lib/vmware-vcli/apps/performance
export PATH=$PATH:/usr/lib/vmware-vcli/apps/session
export PATH=$PATH:/usr/lib/vmware-vcli/apps/vm

export PERL_LWP_SSL_VERIFY_HOSTNAME=0

	・・・

# source /root/.bash_profile

あまりオススメはしませんが、PERL_LWP_SSL_VERIFY_HOSTNAME を環境変数として設定する代わりに、直接 vmware-cmd の中に書いてしまう方法もあります。

/usr/bin/vmware-cmdRaw Code(S)Raw Code(T)
#!/usr/bin/perl -w
#
# Copyright 2006 VMware, Inc.  All rights reserved.

use strict;
use warnings;

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;

	・・・

コマンド実行テスト

コマンドを実行するためには、vCenter、及び ESXi ホストへ接続可能な管理者権限を持つログインユーザ ID とパスワードが必要です。

以下を実行し、特定 ESXi ホスト上で稼動している仮想マシンの情報を取得してみましょう。

ESXi ホスト上の仮想マシン情報取得Raw Code(S)Raw Code(T)
# /usr/lib/vmware-vcli/apps/vm/vminfo.pl --url https://ESXi-IP-or-VCENTER-IP/sdk/webService --username [ID] --password [PW] --vmname VM-01

Information of Virtual Machine VM-01

Name:            VM-01
No. of CPU(s):           2
Memory Size:             4096
Virtual Disks:           1
Template:                0
vmPathName:              [DataStore-01] VM-01/VM-01.vmx
Guest OS:                CentOS 4/5/6 (64 ビット)
guestId:                 centos64Guest
Host name:               VM-01
IP Address:              10.100.100.100
VMware Tools:            VMware Tools is running and the version is current
Cpu usage:               0 MHz
Host memory usage:               4000 MB
Guest memory usage:              614 MB
Overall Status:          The entity is OK

接続先によるログイン ID 使い分けについて

・ ESXi ホストへの接続は、root ユーザしかログインできないので、上記のコマンドを試す場合には、root ユーザでログインしないと行けません。

・ 接続先が vCenter の場合には、管理者権限を持つユーザ ID でなければなりません。 そうしないとコマンド実行時に以下のエラーで失敗します。

Error: この操作の実行権限が拒否されました。

vCenter サーバにて SDK for Perl を実行するための専用ユーザを作成し、vSphere Client(または、Web Client)を使って vCenter へ接続して vCenter 権限タブにて管理者権限を与えておくと良いです。

SDK for Perl 5.5 でコマンド実行に失敗する場合の対処

SDK for Perl 5.5 の場合、コマンド実行結果、以下のエラーが出た場合には、さらに、以下のモジュールを cpan でインストールすると問題なく実行されるので、一回試してみてください。

SDK for Perl 5.5 コマンド実行エラー対策Raw Code(S)Raw Code(T)
# /usr/lib/vmware-vcli/apps/host/hostinfo.pl --url https://VCENTER-IP-ADDRESS/sdk/webService --username [ID] --password [PW]
SOAP request error - possibly a protocol issue: <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<RetrievePropertiesResponse xmlns="urn:vim25"><returnval><obj type="HostSystem">host-1656</obj></returnval><returnval><obj type="HostSystem">host-1660</obj></returnval><returnval><obj type="HostSystem">host-1185</obj></returnval><returnval><obj type="HostSystem">host-1243</obj></returnval><returnval><obj type="HostSystem">host-1318</obj></returnval><returnval><obj type="HostSystem">host-4145</obj></returnval><returnval><obj type="HostSystem">host-4761</obj></returnval><returnval><obj type="HostSystem">host-991</obj></returnval><returnval><obj type="HostSystem">

# cpan GAAS/libwww-perl-6.03.tar.gz
# cpan GAAS/Net-HTTP-6.03.tar.gz

終わりに

vSphere SDK for Perl は、単純に遠隔でコマンドを飛ばして結果を見るだけではなく、使い方によっては、運用が非常に楽になります。

私の場合には、社内向けのウェブサイトを構築し、その中に vSphere SDK for Perl を導入しました。

そして、毎日、全仮想マシンリストとスペク情報を取得し、前日との差分をチェックすることで、新規作成された仮想マシン、削除された仮想マシン、CPU・メモリ増減変動値などをウェブサイトへレポートとして登録して、いつでも観覧できるようにしています。

そうすることで、誰かが勝手に仮想マシンをいじったりスペックを上げたとき等、監視目的で使うこともできます。

また、特定期間内に仮想マシンがどれくらい増減したか確認しやすくなりました。

初期アプリケーション以外の機能については、PowerCLI を使うか自分で Perl スクリプトを書いて実装する必要があります。

たとえば、特定ホストの全ての仮想スイッチ一覧、各仮想スイッチにぶら下がっているポートグループ一覧とそのポートグループに設定されているトラフィックシェーフィング情報を取得したいときには、自分で Perl スクリプトを書いて機能を実装するしかありません。

ちなみに、PowerCLI もコマンドラインで色んなことが可能ですが、Windows 用なので、自由度があまりにも低く、私は好きじゃなかったので、使わないようにしています。

長くなりましたが、以上で vSphere SDK for Perl 導入方法を終わります。