マニュアルはこちらです
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がカスタマイズできたことが確認できました。

