Terraform で NSX のオーバーレイ セグメントを作成して、クローン作成した vSphere の仮想マシンを接続してみます。
今回の環境
今回も、下記の NSX ラボを利用しています。
Terraform の NSX オーバーレイ セグメント作成には、下記投稿にある .tf ファイルを作成してあります。
作成した .tf ファイル
今回は、下記の Terraform Providier を利用しています。
- vmware/nsxt: NSX のセグメントを作成
- hashicorp/vsphere: vSphere を操作(仮想マシンを作成)
- hashicorp/time: 待機処理で利用
前回作成したファイルのうち、login.tf ファイルには vCenter Server へのログイン情報を追記しておきます。(9~14行)
今回は、下記のような .tf ファイルを追加作成してあります。
vm-with-nsx-segment.tf
- 仮想マシンの作成では、vsphere_virtual_machine リソースを利用します。
- 11~38行目: 仮想マシン作成の準備として、vSphere の各種インベントリ オブジェクトを取得しています。
- データセンタ: vsphere_datacenter
- クラスタ: vsphere_compute_cluster
- データストア: vsphere_datastore
- クローン元の仮想マシン: vsphere_virtual_machine
- 25~33行目: 前回に作成した NSX セグメントに対応する vSphere ポートグループを vsphere_network データソースで取得しています。セグメントは、作成時に指定したリソースの表示名(nsxt_policy_fixed_segment.segment1.display_name)をもとに取得。
- 40~71行目: 仮想マシン「vm05」をクローン作成して、前回作成した NSX セグメントに接続します。
- 61行目: 今回はリンク クローンで作成しています。
- 66行目: ゲスト OS のホスト名にも、vm05 を設定します。
- 73~76行目: DHCP で設定された IP アドレスを取得します。
クローン元 仮想マシンの準備
今回はリンク クローンを実行するので、クローン元にする仮想マシンに、スナップショットを作成しておきます。ちなみに、複数のスナップショットを作成してあるとエラーになります。
Terraform の実行
あらたに Terraform Providier を追加するため、terraform init を実行します。これで、hashicorp/vsphere と hashicorp/time がインストールされます。
$ terraform init
terraform plan → terraform apply を実行して、仮想マシンを作成します。
$ terraform apply -auto-approve
処理が問題なく成功すると、最後に DHCP で設定された IP アドレスが表示されます。
ちなみに、output の value を vsphere_virtual_machine.vm.default_ip_address にすると、1番目の IP アドレス(例では 172.16.3.100)を取得できます。
仮想マシンが作成、起動されて、NSX セグメントに接続されました。そして NSX DHCP でアドレスが設定されています。
ちなみに、本来であれば terraform apply を再実行しても何も起きないことが望ましいですが、現状では vsphere_virtual_machine リソースの ept_rvi_mode と hv_mode が変更されたように認識されてしまい、仮想マシン停止 → 再設定が実行されてしまいます。
仮想マシンと NSX セグメントを削除する場合は、terraform destroy を実行します。
$ terraform destroy -auto-approve
仮想マシン削除と NSX セグメント削除のタイミングがあわず、下記のようなエラーが表示されますが、この場合は terraform destroy を再実行すると成功します。
Error: Failed to delete Segment da8188bd-a4a8-4c2d-9739-0858804ebc75: Segment path=[/infra/tier-1s/t1-gw-21/segments/da8188bd-a4a8-4c2d-9739-0858804ebc75] has 1 VMs or VIFs attached. Disconnect all VMs and VIFs before deleting a segment. (code 503040)
以上、Terraform で仮想マシンを作成して NSX セグメントに接続してみる話でした。