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

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

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

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

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

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

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

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

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

vsw_info.pl
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/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(
        #### HostSystem : 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();

使用例

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

以下のような 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 ユーザのパスワード
トラフィックシェーピング情報取得
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# ./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 : 各仮想スイッチのポートグループ情報取得 でした。