このブログを検索

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


2026年2月27日金曜日

やってみよう Terrafrom で自動作成 その3 仮想マシンの作成とゲストOSのカスタマイズ(Linux)

今回は、vSphere を使って Ubuntu の仮想マシン展開時に、ゲストOSをカスタマイズする方法についてやっていこうと思います。

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

vSphere 側の準備
Terrafrom を実行する前に、展開する仮想マシンの元になるテンプレートを作成する必要があります。
今回は、前回同様に仮想マシンを作成してゲストOSに Ubuntu をインストールしたものを用意しました。
仮想マシンの展開にかかる時間を短くするためにリンククローンを使用したいので、スナップショットを1つだけ作成しておきます。

ここまでは前回と同じですが、Terrafromが仮想マシンを展開する際にゲストOSのカスタマイズを行うには、あらかじめ Cloud-init を有効にしておく必要があります。
Ubuntu の場合デフォルトでインストールされているので以下のコマンドを実行してから仮想マシンを停止しておきます。
sudo cloud-init clean --logs

前回使った作業用の端末で、今回展開する仮想マシン用のディレクトリを作成します。
そこに、前回作成したログイン用のtfファイルをコピーします。
前回使った仮想マシン作成用のtfファイルもコピーして変更を加えていきたいと思います。

カスタマイズする内容は以下です。
・ホスト名:test-vm03
・IPアドレス:192.168.1.100
・ログイン用のユーザーを作成:ubuntu
・ログイン時にメッセージを出す:Welcome! This VM was configured by cloud-init

記載内容は以下になります。

create-test-vm03.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
}

data "vsphere_network" "network" {
  name          = "vm-DPortGroup"
  datacenter_id = data.vsphere_datacenter.dc.id
}

data "vsphere_virtual_machine" "template" {
  name          = "ubuntu-cloud-init-tmp"
  datacenter_id = data.vsphere_datacenter.dc.id
}

resource "vsphere_virtual_machine" "vm" {
  name             = "test-vm-cloud-init"
  resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
  datastore_id     = data.vsphere_datastore.datastore.id

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

  wait_for_guest_ip_timeout = 0

  network_interface {
    network_id   = data.vsphere_network.network.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

#ここから先がOSのカスタマイズ内容になります
    customize {
      linux_options {
        host_name = "test-vm03"
        domain    = "snt-demo.lab"
      }

      network_interface {
        ipv4_address = "192.168.1.100"
        ipv4_netmask = 24
      }

      ipv4_gateway = "192.168.1.1"
    }
  }

  extra_config = {
    "guestinfo.userdata" = base64encode(<<EOT
#cloud-config
hostname: cloudinit-vm01

# ファイル作成
write_files:
  - path: /etc/motd
    permissions: '0644'
    content: |
      *****************************************
      Welcome! This VM was configured by cloud-init
      *****************************************

# ubuntuユーザーにパスワードを設定
users:
  - name: ubuntu
    plain_text_passwd: "Vmware1!"
    lock_passwd: false
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    groups: [adm, dialout, cdrom, floppy, sudo, audio, dip, video, plugdev, netdev, lxd]
    shell: /bin/bash
ssh_pwauth: True

# 起動時に一度だけ実行されるコマンドを利用してrootのホームにテキストを残す
runcmd:
  - echo "Hello from cloud-init at $(date)" >> /root/cloud-init.log
EOT
    )
    "guestinfo.userdata.encoding" = "base64"
  }
}
実際に実行してみます。
terraform init
terraform plan
terraform apply
無事に仮想マシンができて処理が完了すると、IPアドレスとホスト名が vSphere Client から確認できます。
コンソールを開いて作成したユーザーでログインしメッセージが表示されるか確認します。
ちゃんとcloud-initが動作してゲストOSがカスタマイズできたことが確認できました。