VCDB から MAC アドレスの一覧を SELECT してみる

Share on:

Table of contents

はじめに

vSphere の仮想マシンに固定 MAC アドレスを割り振る場合のベストプラクティスとして、事前にデータベースから MAC アドレスの一覧を参照して重複が無いことを確認しましょうといった KB が1月ごろに公開されていました。

Best practices for assigning static MAC address to a Virtual machine vNIC (82139)

Before assigning the static MAC address, refer the table MAC_ADDRESS table(select * from VPX_NIC) in the VCDB to make sure the there is no duplicate.(Irrespective of upper or lowercase)

個人的にはデータベースを覗き見るのはあまり行儀が良い行為ではない気がするのですが KB として出ているので vCenter Server 7.0 (vPostgres) で試してみます。

基本的にどのバージョンも同じ手順になると思いますが、もしかしたら vCenter Server のバージョンや種類(Windows or Appliance)、データベースの種類によっては SQL クエリの結果など異なる可能性もありますので、その場合は環境に合わせて適宜調整してもらえればと思います。

vCenter Server データベースに接続する

KB2147285 を参考に、VCSA の Bash シェル上から psql でデータベースに接続します。

vCenter Server Appliance 6.5/6.7/7.0 の組み込み vPostgres データベースとのやりとり (2147285)

1# /opt/vmware/vpostgres/11/bin/psql -d VCDB -U postgres
2psql.bin (11.8 (VMware Postgres 11.8.0-16519916 release))
3Type "help" for help.
4
5VCDB=#

MAC アドレスの一覧を SELECT する

冒頭の KB82139 の通り、vpx_nic テーブルから MAC アドレスを SELECT してみます。KB では SELECT * FROM vpx_nic となっていますが、全ての列を取得すると値が長すぎて表示が崩れたので mac_address 列だけ取得してみます。

 1VCDB=# SELECT mac_address FROM vpx_nic;
 2    mac_address
 3-------------------
 4 00:50:56:96:5e:f9
 5 00:50:56:96:97:ac
 6 00:50:56:96:a9:6f
 7 00:50:56:96:73:96
 8 00:50:56:96:2b:ef
 9 00:50:56:96:48:ad
10 00:50:56:96:df:e0
11 00:50:56:96:cc:c8
12 00:0c:29:11:6c:4e
13 00:0c:29:10:0d:23
14 00:50:56:96:b9:9a
15 00:50:56:96:db:6a
16 1c:69:7a:6e:ab:28
17 00:50:56:66:d2:d2
18 00:50:56:96:66:5e
19 00:50:56:96:54:90
20 00:50:56:96:65:a8
21(17 rows)

これだけだと味気ないので、仮想ポートが接続されているインベントリオブジェクトの名前も取ってみたいと思います。

vpx_nic のテーブル定義を見てみると、entity_id 列に vpx_entity テーブルの主キー(id 列)への外部キーとして制約が設定されています。vpx_entity テーブルにはインベントリ情報が含まれますが、テーブル定義を見てみると name 列からインベントリオブジェクトの名前が取得できそうです。

 1VCDB=# \d vpx_nic
 2                                             Table "vc.vpx_nic"
 3     Column      |          Type          | Collation | Nullable |                  Default
 4-----------------+------------------------+-----------+----------+-------------------------------------------
 5 entity_id       | bigint                 |           | not null |
 6 device_id       | integer                |           | not null |
 7 mac_address     | character varying(20)  |           |          |
 8 is_connected    | integer                |           |          |
 9 network_name    | character varying(255) |           |          |
10 dns_config      | text                   |           |          |
11 ip_config       | text                   |           |          |
12 net_bios_config | text                   |           |          |
13 surr_key        | integer                |           | not null | nextval('vpx_nic_surr_key_seq'::regclass)
14   ~略~
15Foreign-key constraints:
16    "fk_vpx_vn_ref_vpx_vm" FOREIGN KEY (entity_id) REFERENCES vpx_entity(id) ON DELETE CASCADE
17
18VCDB=# \d vpx_entity
19                        Table "vc.vpx_entity"
20  Column   |          Type          | Collation | Nullable | Default
21-----------+------------------------+-----------+----------+---------
22 id        | bigint                 |           | not null |
23 name      | character varying(255) |           | not null |
24 type_id   | integer                |           | not null |
25 parent_id | bigint                 |           |          |
26Indexes:
27    "pk_vpx_entity" PRIMARY KEY, btree (id)
28    ~略~

ということで、これらのテーブルを結合して SELECT してみました。なお、名前が esxi-01.tanzu.local (試した環境の ESXi 名) の行が2行ありますが、これらは GUI の情報と比較したところ VMkernel ポート(=ESXi の仮想ポート)の MAC アドレスでした。

 1VCDB=# SELECT name, device_id, mac_address FROM vpx_nic JOIN vpx_entity ON vpx_nic.entity_id = vpx_entity.id;
 2                     name                      | device_id |    mac_address
 3-----------------------------------------------+-----------+-------------------
 4 jangari-tkc-01-control-plane-sp8lp            |      4000 | 00:50:56:96:5e:f9
 5 jangari-tkc-01-workers-v5ctf-77dc5dc95c-dmvfk |      4000 | 00:50:56:96:97:ac
 6 SupervisorControlPlaneVM (1)                  |      4000 | 00:50:56:96:a9:6f
 7 SupervisorControlPlaneVM (1)                  |      4001 | 00:50:56:96:73:96
 8 jangari-tkc-01-workers-v5ctf-77dc5dc95c-79pwj |      4000 | 00:50:56:96:2b:ef
 9 SupervisorControlPlaneVM (2)                  |      4000 | 00:50:56:96:48:ad
10 SupervisorControlPlaneVM (2)                  |      4001 | 00:50:56:96:df:e0
11 CentOS8-Stream                                |      4000 | 00:50:56:96:cc:c8
12 vcsa.tanzu.local                              |      4000 | 00:0c:29:11:6c:4e
13 router.tanzu.local                            |      4000 | 00:0c:29:10:0d:23
14 router.tanzu.local                            |      4001 | 00:50:56:96:b9:9a
15 router.tanzu.local                            |      4002 | 00:50:56:96:db:6a
16 esxi-01.tanzu.local                           |      1000 | 1c:69:7a:6e:ab:28
17 esxi-01.tanzu.local                           |      1001 | 00:50:56:66:d2:d2
18 haproxy.tanzu.local                           |      4000 | 00:50:56:96:66:5e
19 haproxy.tanzu.local                           |      4001 | 00:50:56:96:54:90
20 haproxy.tanzu.local                           |      4002 | 00:50:56:96:65:a8
21(17 rows)

おわりに

KB82139 より固定 MAC アドレスの使用時は事前にデータベースから MAC アドレスに重複がないか確認しておきましょうとのことでしたので、実際に VCDB から MAC アドレスの一覧を参照してみました。

なお、以前から存在する以下の KB1024025 には MAC アドレスが競合した場合の対応について記載されています。

仮想マシンの作成時に、仮想マシンの MAC アドレスが競合するか、または重複 MAC アドレスが存在する (1024025)

こちらでも vpx_nic テーブルや vpx_entity テーブルを参照するような対応をしています。マニュアル「vSphere のネットワーク」と合わせて参照してみると vCenter Server の MAC アドレス管理について理解が深まるかなと思います。

MAC アドレスの管理 - VMware Docs