仮想スイッチのポートグループ情報取得方法について

今回作成したツールを使うことで、以下の情報を取得することが出来ます。

  • 各仮想スイッチ (以下、vSW) にぶら下がっているポートグループの一覧取得
  • 各ポートグループのトラフィックシェーピング情報取得

例えば、UTM サービスを仮想マシンで提供している場合に、トラフィックシェーピングを使ってサービス種類によってトラフィック制限をかけることがあります。

トラフィックシェーピング情報は、vCenter でも確認可能ですが、vCenter だと一覧化して表示してくれないため、個々のポートグループを一つ一つクリックして確認しないと行けません。

そこで、このツールを使えば、各 vSW の下にある各ポートグループの設定情報を一覧化して取得することが出来ます。

vSphere SDK for Perl のデフォルトアプリケーションについて

vSphere SDK for Perl には、デフォルトで提供しているツールが色々入っていますが、ポートグループ情報を取得するようなツールは入ってないので、そういった場合には、自作するしかありません。

一応、ツールは、2つ作成したんですが、情報取得目的としては、結果的にどちらとも使えますが、違いは、出力される 各 vSW 内の ポートグループの順番が vCenter 上で見たときと同じ並びになっているかどうか です。

1つ目のツールは、作ってみたら 各 vSW 内のポートグループがうまくソートされず、それを改良して作ったのが、2つ目のツールです。

1つ目のツールは、記録として残しておきたかったので、そのまま公開します。

1つ目のツール (オススメしない)

最初に作ったバージョンです。

vSW の順番は、ソートされてますが、各 vSW にぶら下がっているポートグループリストは、ソートされずバラバラになっています。

記録のために残してるだけなので、あまりオススメはしません。

#!/usr/bin/perl -w
#
# 使い方
#   
# ./vsw_info.pl --server <VCENTER_IP> --vihost <ESX_HOST_IP_or_FQDN>
#

use strict;
use warnings;
use VMware::VIRuntime;
 
use FindBin;
use lib "$FindBin::Bin/../";
 
my %opts = (
    'vihost' => {
        type => "=s",
        help => "The name of the ESX host to interrogate, not required if connecting "
              . "directly to the ESX host",
        required => 0
    }
);
 
Opts::add_options(%opts);
Opts::parse();
Opts::validate();


Util::connect();


my $vihost;
my $host;
 
if ( Opts::option_is_set('vihost') && Opts::get_option('vihost') ne "" ) {
    $vihost = Opts::get_option('vihost');
} else {
    $vihost = Opts::get_option('server');
}

eval {
    $host = Vim::find_entity_view(
        #### HostSyste : Managed Object Types (mo_ref)
        view_type => 'HostSystem',
        filter => { 'name' => qr/($vihost)/i }
    );
};
 
if ( $@ ) {
    Util::trace(0, "Host not found or host name ambiguous");
    Util::trace(0, $@);
    Util::disconnect;
    exit;
}


#### networkSystem と networkInfo 取得しておく
my $networkSystem = Vim::get_view(mo_ref => $host->configManager->networkSystem);
my $networkInfo = $networkSystem->networkInfo;

#### 各 Port Group の Traffic Shaping 情報配列を、HASH に保存
#### key   : Port Group の key
#### value : 各 Port Group の Traffic Shaping 情報配列
####
#### ここでは、HASH を作成するだけ
my $nwInfo_portgroups = $networkInfo->portgroup;

my %portgroupShapingInfoHash = ();

foreach ( @$nwInfo_portgroups ) {
    my $vswitchName = $_->spec->vswitchName;

    my $portgroupKey = $_->key;

    my $shapingPolicy = $_->computedPolicy->shapingPolicy;

    my $enabled = $shapingPolicy->enabled;
    my $averageBandwidth = 0;
    my $peakBandwidth = 0;
    my $burstSize = 0;

    #### トラフィックシェーピングが有効になっているときだけ値を取得
    ####     平均バンド幅   : キロビット /秒
    ####     ピークバンド幅 : キロビット /秒
    ####     バーストサイズ : キロバイト
    if ( $enabled == 1) {
        $averageBandwidth = $shapingPolicy->averageBandwidth / 1000;
        $peakBandwidth = $shapingPolicy->peakBandwidth / 1000;
        $burstSize = $shapingPolicy->burstSize / 1024;
    }

    #### key value(配列)HASH 作成
    #### HASH キーに 各ポートグループの Shaping 情報(配列)を追加していく(HASH に配列格納)
    my @shapingInfo = ( $vswitchName, $portgroupKey, $enabled, $averageBandwidth, $peakBandwidth, $burstSize );

    #### HASH に配列を格納する際には、レファランス「\」を付けてセットするか、
    #### HASH を「@」で囲んでセットする
#   $portgroupShapingInfoHash{$portgroupKey} = \@shapingInfo;
#   @{$portgroupShapingInfoHash{$portgroupKey}} = @shapingInfo;

    #### 後で、vSW 順にソートするため、最後に vSwitch1 ように vSW 番号を付けるような形でキーを作成
    #### ex) key-vim.host.PortGroup-My-Port-Group-Name----vSwitch1
    my $sort_key = "$portgroupKey" . "----" . "$vswitchName";
    @{$portgroupShapingInfoHash{$sort_key}} = @shapingInfo;

=pot
    #### DEBUG
    print "sort_key : $sort_key\n";

    print "vswitchName : $shapingInfo[0]\n";
    print "portgroupKey : $shapingInfo[1]\n";

    print "enabled : $shapingInfo[2]\n";
    print "averageBandwidth : $shapingInfo[3]\n";
    print "peakBandwidth : $shapingInfo[4]\n";
    print "burstSize : $shapingInfo[5]\n";
    print "\n";
=cut
}


#### 事前に作成しておいた「$sort_key」を vSW 番号順にソートして処理する
#### 「$sort_key」の最後に「----vSWitch1」のような形でスイッチ番号が付いているので、その番号を取って、比較しながらソートする。
#foreach my $key ( sort keys %portgroupShapingInfoHash ) {
foreach my $key ( sort {(split(/----vSwitch/,$a))[1] <=> (split(/vSwitch/,$b))[1]} keys(%portgroupShapingInfoHash) ) {
    my @shapingInfo = @{$portgroupShapingInfoHash{$key}};

    print "vswitchName : $shapingInfo[0]\n";
    print "portgroupKey : $shapingInfo[1]\n";
    print "enabled : $shapingInfo[2]\n";
    print "averageBandwidth : $shapingInfo[3]\n";
    print "peakBandwidth : $shapingInfo[4]\n";
    print "burstSize : $shapingInfo[5]\n";

    print "--------\n";
}


Util::disconnect();

2つ目のツール (オススメ)

1つ目のツールを少し改良して作ったバージョンです。

出力結果は、vCenter 上で見たときのポートグループ順番を維持するようになります。

こちらを使ってください。

#!/usr/bin/perl -w
#
# 使い方
#   
# ./vsw_info.pl --server <VCENTER_IP> --vihost <ESX_HOST_IP_or_FQDN>
#

use strict;
use warnings;
use VMware::VIRuntime;
 
use FindBin;
use lib "$FindBin::Bin/../";
 
my %opts = (
    'vihost' => {
        type => "=s",
        help => "The name of the ESX host to interrogate, not required if connecting "
              . "directly to the ESX host",
        required => 0
    }
);

Opts::add_options(%opts);
Opts::parse();
Opts::validate();


Util::connect();


my $vihost;
my $host;
 
if ( Opts::option_is_set('vihost') && Opts::get_option('vihost') ne "" ) {
    $vihost = Opts::get_option('vihost');
} else {
    $vihost = Opts::get_option('server');
}
 
eval {
    $host = Vim::find_entity_view(
        view_type => 'HostSystem',                 #### Managed Object Types (mo_ref)
        filter => { 'name' => qr/($vihost)/i }
    );
};
 
if ( $@ ) {
    Util::trace(0, "Host not found or host name ambiguous");
    Util::trace(0, $@);
    Util::disconnect;
    exit;
}

#### networkSystem と networkInfo 取得しておく
my $networkSystem = Vim::get_view(mo_ref => $host->configManager->networkSystem);
my $networkInfo = $networkSystem->networkInfo;

#### 各 Port Group の Traffic Shaping 情報配列を、HASH に保存
#### key   : Port Group の key
#### value : 各 Port Group の Traffic Shaping 情報配列
####
#### ここでは、HASH を作成するだけ
my $nwInfo_portgroup = $networkInfo->portgroup;

my %portgroupShapingInfoHash = ();

foreach ( @$nwInfo_portgroup ) {
    my $vswitchName = $_->spec->vswitchName;
    my $portgroupKey = $_->key;
    my $shapingPolicy = $_->computedPolicy->shapingPolicy;

    my $enabled = $shapingPolicy->enabled;
    my $averageBandwidth = 0;
    my $peakBandwidth = 0;
    my $burstSize = 0;

    #### トラフィックシェーピングが有効になっているときだけ値を取得
    ####     平均バンド幅   : キロビット /秒
    ####     ピークバンド幅 : キロビット /秒
    ####     バーストサイズ : キロバイト
    if ( $enabled == 1) {
        $averageBandwidth = $shapingPolicy->averageBandwidth / 1000;
        $peakBandwidth = $shapingPolicy->peakBandwidth / 1000;
        $burstSize = $shapingPolicy->burstSize / 1024;
    }

    #### HASH キーに 各ポートグループの Shaping 情報(配列)を追加していく(HASH に配列格納)
    my @shapingInfo = ( $vswitchName, $portgroupKey, $enabled, $averageBandwidth, $peakBandwidth, $burstSize );
    @{$portgroupShapingInfoHash{$portgroupKey}} = @shapingInfo;
}


#### $nwInfo_vswitch を使うと各 vSW と vSW 内の Port Group 名(portgroupKey)を、
#### vCenter で見た時と同じ順番で取得できる。
#### ただし、各 Port Group 内の詳細設定内容は、取得できない。(戻り値が portgroupKey の文字列のみだから)
####
#### なので、ここで取得した portgroupKey を、
#### 上の処理で事前に作成しておいた HASH 配列の key として使うことで、
#### 各ポートグループの Shaping 情報を取得する。
my $nwInfo_vswitch = $networkInfo->vswitch;

foreach ( @$nwInfo_vswitch ) {
#   my $nwInfo_vswitch_name = $_->name;
    my $nwInfo_vswitch_portgroup = $_->portgroup;

#   print "nwInfo_vswitch_name : $nwInfo_vswitch_name\n";

    foreach my $portgroup_key ( @$nwInfo_vswitch_portgroup ) {
        my @shapingInfo = @{$portgroupShapingInfoHash{$portgroup_key}};
        
        print "vswitchName : $shapingInfo[0]\n";
        print "portgroupKey : $shapingInfo[1]\n";
        print "enabled : $shapingInfo[2]\n";
        print "averageBandwidth : $shapingInfo[3]\n";
        print "peakBandwidth : $shapingInfo[4]\n";
        print "burstSize : $shapingInfo[5]\n";

        print "--------\n";
    }
}


Util::disconnect();

使用例

使い方を簡単に紹介します。

以下のような vSW があるとします。

vSwitch3 は、Test_01 ~ Test_05 まで5つのポートグループを持っています。

vCenter vSwitch と PortGroup

ポートグループ Test_01 ~ Test_03 は、何も設定せずに、Test_04 と Test_05 に以下の設定をします。

ポートグループ Test_04 トラフィックシェーピング設定

項目 設定値 単位
平均バンド幅 100000 キロビット/秒
ピークバンド幅 100000 キロビット/秒
バーストサイズ 102400 キロバイト
PortGroup Test_04 Traffic Shaping 設定

ポートグループ Test_05 トラフィックシェーピング設定

項目 設定値 単位
平均バンド幅 200000 キロビット/秒
ピークバンド幅 200000 キロビット/秒
バーストサイズ 204800 キロバイト
PortGroup Test_05 Traffic Shaping 設定

ツールを実行して、トラフィックシェーピング情報取得

後は、ツールを実行して 各 vSW ポートグループのトラフィックシェーピング情報を取得します。

オプション 設定値 備考
--url https://VCENTER_IP/sdk/webService 対象 vCenter の FQDN or IP
--vihost ESX_HOST_IP 対象 ESXi ホストの FQDN or IP
--username VCENTER_USER_NAME 管理者権限を持つ vCenter ユーザ
--password VCENTER_USER_PASSWORD vCenter ユーザのパスワード
トラフィックシェーピング情報取得
# ./vsw_info.pl --url https://10.10.100.5/sdk/webService --vihost 10.10.200.101 --username vSphereSDK --password vSphereSDK123

・・・

vswitchName : vSwitch3
portgroupKey : key-vim.host.PortGroup-Test_01
enabled : 0
averageBandwidth : 0
peakBandwidth : 0
burstSize : 0
--------
vswitchName : vSwitch3
portgroupKey : key-vim.host.PortGroup-Test_02
enabled : 0
averageBandwidth : 0
peakBandwidth : 0
burstSize : 0
--------
vswitchName : vSwitch3
portgroupKey : key-vim.host.PortGroup-Test_03
enabled : 0
averageBandwidth : 0
peakBandwidth : 0
burstSize : 0
--------
vswitchName : vSwitch3
portgroupKey : key-vim.host.PortGroup-Test_04
enabled : 1
averageBandwidth : 100000
peakBandwidth : 100000
burstSize : 102400
--------
vswitchName : vSwitch3
portgroupKey : key-vim.host.PortGroup-Test_05
enabled : 1
averageBandwidth : 200000
peakBandwidth : 200000
burstSize : 204800
--------

問題なく、取得できました。

後は、取得した情報を使って、ウェブページに表示させるなど、環境に合わせて使ってください。

以上、vSphere SDK for Perl : 各仮想スイッチのポートグループ情報取得 でした。