仮想スイッチ・ポートグループのトラフィックシェーピング情報を取得する方法について

サービスによっては、仮想スイッチ、または ポートグループにトラフィックシェーピング (トラフィック制限) をかけることがあります。

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

そこで、vSphere SDK for Perl を使えば、vCenter へ直接ログインすることなく、各 vSW の下にある各ポートグループの設定情報を一覧化して取得することが出来ます。

今回は、SDK for Perl を利用し、以下の情報を取得する方法についてご紹介します。

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

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

SDK for Perl でトラフィックシェーピング情報取得

まずは、トラフィックシェーピング情報を取得するツールの作成から。

#!/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 ポートグループのトラフィックシェーピング情報を取得します。

オプション設定値備考
--urlhttps://VCENTER_IP/sdk/webService対象 vCenter の FQDN or IP
--vihostESX_HOST_IP対象 ESXi ホストの FQDN or IP
--usernameVCENTER_USER_NAME管理者権限を持つ vCenter ユーザ
--passwordVCENTER_USER_PASSWORDvCenter ユーザのパスワード
トラフィックシェーピング情報取得
# ./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 : 各仮想スイッチのポートグループ情報取得 でした。