このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2026年3月31日火曜日

やってみよう Terrafrom で自動作成 その4 複数のリソースを一度に作成してみる

今回は、vSphere を使って ネットワークやフォルダ等の複数のリソースを一度に作成してみようと思います。

マニュアルはこちらです
https://registry.terraform.io/providers/hashicorp/vsphere/latest/docs

リソースプール、フォルダ、ネットワークを作成してそれを利用する仮想マシンを展開しようと思います。
作業前の状態は以下です。
vSphere 側の準備
仮想マシン展開用のテンプレートになる仮想マシンを用意します。
今回はこのシリーズの「その2」で使用したUbuntuを使用したいと思います。

では、今回もこのTerraform実行ののディレクトリを作成し、そこに作成済みのログイン用のtfファイルをコピーしてください。
今回ですが、各リソース毎にtfファイルを作成して管理しやすくしようと思います。
そのため、共通で使う既存リソースを記載したdata.tfを用意し参照するようにします。

data.tf
# データセンターの取得
data "vsphere_datacenter" "dc" {
  name = "DC01"
}

# データストアの取得
data "vsphere_datastore" "datastore" {
  name          = "nfs01"
  datacenter_id = data.vsphere_datacenter.dc.id
}

# クラスタの取得
data "vsphere_compute_cluster" "cluster" {
  name          = "CL01"
  datacenter_id = data.vsphere_datacenter.dc.id
}

# テンプレートVMの取得
data "vsphere_virtual_machine" "template" {
  name          = "ubuntu-tmp"
  datacenter_id = data.vsphere_datacenter.dc.id
}

# vCenter上の分散スイッチの取得
data "vsphere_distributed_virtual_switch" "dvs" {
  name          = "DSwitch" 
  datacenter_id = data.vsphere_datacenter.dc.id
}
では、各リソース毎のtfファイルを作成していきましょう
・リソースプールのtfファイ名:resource_pool.tf
・フォルダのtfファイ名:vm_folder.tf
・ネットワークのtfファイ名:vm_network.tf
・仮想マシンのtfファイ名:test_vm04.tf

resource_pool.tf
resource "vsphere_resource_pool" "rp" {
  name                    = "Terraform-rp"
  parent_resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
  
  # CPU/メモリのリソース設定(必要に応じて変更可能。デフォルトは制限なし)
  cpu_share_level    = "normal"
  memory_share_level = "normal"
}

vm_folder.tf
resource "vsphere_folder" "vm_folder" {
  path          = "Terraform-vm"
  type          = "vm"
  datacenter_id = data.vsphere_datacenter.dc.id
}

vm_network.tf
resource "vsphere_distributed_port_group" "pg" {
  name                            = "Terraform-vm-nw"
  distributed_virtual_switch_uuid = data.vsphere_distributed_virtual_switch.dvs.id

  # VLAN ID 
  vlan_id = 100
}

test_vm04.tf
resource "vsphere_virtual_machine" "vm" {
  name             = "test-vm-04"
  
  # 作成したリソースプール "Terraform-rp" を指定
  resource_pool_id = vsphere_resource_pool.rp.id
  
  # 作成したフォルダ "Terraform-vm" を指定
  folder           = vsphere_folder.vm_folder.path
  
  datastore_id     = data.vsphere_datastore.datastore.id

  num_cpus = 2
  memory   = 2048
  guest_id = data.vsphere_virtual_machine.template.guest_id
  firmware = data.vsphere_virtual_machine.template.firmware

  wait_for_guest_net_timeout = 0 #ネットワーク設定をしていないので確認をキャンセル

  network_interface {
    # 作成した分散ポートグループ "Terraform-vm-nw" を指定
    network_id   = vsphere_distributed_port_group.pg.id
    adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
  }

  disk {
    label            = "disk0"
    size             = data.vsphere_virtual_machine.template.disks.0.size
    eagerly_scrub    = false
    thin_provisioned = true
  }

  clone {
    template_uuid = data.vsphere_virtual_machine.template.id
    linked_clone  = true    
  }
}

実際に実行してみます。
terraform init
terraform plan
terraform apply
以下のように各リソースが作成されていることが確認できたので成功です。
この様に、各tfファイルを揃えておくと terraform apply で一度に作ってくれます。
ちなみ、terraform destroy すると一発で全部消えてしまうのでその点はご注意ください。