このブログを検索

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


ラベル Terraform の投稿を表示しています。 すべての投稿を表示
ラベル Terraform の投稿を表示しています。 すべての投稿を表示

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 すると一発で全部消えてしまうのでその点はご注意ください。

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がカスタマイズできたことが確認できました。

2026年1月30日金曜日

やってみよう Terrafrom で自動作成 その2 仮想マシンの作成(Linux)

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

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

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

vSphere の構成としては以下のような感じで初期状態です。


tfファイルの作成。

1.Terrafrom を導入したマシンにログインします。
ここでは Ubuntu を使用しています。

2.作業用のディレクトリを作成します。

3.Terrafrom が 何を使ってどの環境にログインできるようにするための tfファイルを作成します。
 1つの tfファイルに全部書いてもいいんですが、このログインに使う情報は別の仮想マシンを作りたいとき
 などに使いまわしができたほうが楽なので私はファイルを分けています。

このファイルに記載する内容は以下のようになります。

vSphere-login.tf
terraform {
  required_providers {
    vsphere = {
      source  = "hashicorp/vsphere"
      version = "~> 2.5"
    }
  }
}

provider "vsphere" {
  user           = "administrator@vsphere.local"
  password       = "Vmware1!Vmware1!"
  vsphere_server = "vc01.snt-demo.lab"

  allow_unverified_ssl = true
}
ここには2つの内容が書かれています。
以下の部分は、Terraformが各製品を扱う際に使用するプロバイダーというプラグインを、利用する製品に合わせて指定しています。
今回使う製品が vSphere なので hashicorp/vsphere になっています。
terraform {
  required_providers {
    vsphere = {
      source  = "hashicorp/vsphere"
      version = "~> 2.5"
    }
  }
}
以下の部分は vCenter へのログイン情報になります。
allow_unverified_ssl = true は自己証明書を使っているので、証明書の検証をスキップするために入れています。
provider "vsphere" {
  user           = "administrator@vsphere.local"
  password       = "Vmware1!Vmware1!"
  vsphere_server = "vc01.snt-demo.lab"

  allow_unverified_ssl = true
}
これで、Terrafrom が vSphere の製品を扱うことを理解して、接続先である vCenter とログインするためのアカウントおよびパスワードを知っている状態となります。

3.仮想マシン展開用のtfファイルの作成
 次に仮想マシンを展開する部分です。
 今回は仮想マシン以外のリソースは作成しません。

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

create-test-vm01.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-tmp"
  datacenter_id = data.vsphere_datacenter.dc.id
}

#作成するリソースの内容
resource "vsphere_virtual_machine" "vm" {
  name             = "test-vm01"
  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 = data.vsphere_virtual_machine.template.firmware

  network_interface {
    network_id   = data.vsphere_network.network.id
    adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
  }
  
  # DHCPがない環境のためIPアドレス設定の確認を無視
  wait_for_guest_ip_timeout  = 0
  wait_for_guest_net_timeout = 0


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

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

クローン元と同じでいい場合は data.vsphere_virtual_machine.template でテンプレートマシンを指定し、guest_id や firmware など参照させたい内容をくっつけるとテンプレートマシンの情報を使ってくれます。
テンプレートマシンとは異なる設定にしたい仮想マシン名やCPUやメモリといった値は直接書き込んで指定しています。

4.terrafromコマンドの実行  作成したtfファイルから仮想マシンの作成を行っていきます。 4-1.tfファイルを作成したディレクトリで初期化処理

以下のコマンドを実行します。
terraform init
4-2.tfファイルの確認

以下のコマンドを実行して apply 可能か確認します。
terraform plan
4-3.仮想マシンの展開

以下のコマンドを実行して仮想マシンを展開します。
terraform apply
実行していいか確認されるので yes を入力します。
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes
成功すると以下のようにメッセージが出力されます
vsphere_virtual_machine.vm: Creating...
vsphere_virtual_machine.vm: Creation complete after 9s [id=421723e4-5f72-d210-9a4f-d503258be315]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

4-4.作成物の削除

作成したものを削除するときは以下のコマンドで削除します。
terraform destroy
こちらも実行していいか確認されるので yes を入力します。
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

vsphere_virtual_machine.vm: Destroying... [id=421723e4-5f72-d210-9a4f-d503258be315]
vsphere_virtual_machine.vm: Still destroying... [id=421723e4-5f72-d210-9a4f-d503258be315, 10s elapsed]
vsphere_virtual_machine.vm: Destruction complete after 14s

Destroy complete! Resources: 1 destroyed.

これで仮想マシンの作成と削除ができるようになりました。
次回は、作成する仮想マシンのゲストOSをカスタマイズする方法についてやっていきたいと思います。

2025年12月26日金曜日

やってみよう Terrafrom で自動作成 その1 Terrafrom についてと環境構築

今回から、Terrafrom を使用した仮想マシンの作成や仮想マシンが使う各種リソースの作成についてなどをやっていきたいと思います。
まず Terrafrom とは何かについて説明します。

Terraform とは?

Terraform(テラフォーム)は、HashiCorp社が開発したオープンソースの「インフラ構成管理ツール」です。
この言葉だけだとイメージが付きずらいと思いますが、サーバーやネットワーク、ストレージなどのインフラを、コード(Terrafrom用の定義ファイル『.tfファイル』)で定義し、自動的に作成・変更・削除できるようにします。

これを Infrastructure as Code(IaC:インフラのコード化) と呼び、Terraformを使うことで次のようなメリットがあります。

・ 手作業の設定を減らせる(ミスが減り、作業が速くなる)
・ 同じ環境を何度でも再現できる(再現性・安定性の向上)
・ 変更内容を可視化できる(変更前に「何が変わるか」を確認できる)

Terraformは、AWSやAzure、Google Cloudなどのクラウド環境だけでなく、VMware vSphereやNutanixなどのオンプレミス環境にも対応しており、幅広い環境で「インフラの自動構築」を実現できます。

似たようなコード化を行うツールとしては Docker や kubernetes があり、それぞれアプリの実装環境構築をコード、運用のコード化を行うものです。
Terrafrom はインフラ環境(仮想マシン)の構築をコード化して自動作成します。
なので、ああいったものの仲間として使う場面なんかを想像してもらうとイメージはしやすいかもしれません。

Terrafrom の導入について

作業用のサーバー(Ubuntu)にTerraformを導入する手順になります。
Ubuntu にログイン後、root になります。

sudo su -
バイナリのダウンロードを行います。
wget https://releases.hashicorp.com/terraform/1.11.4/terraform_1.11.4_linux_amd64.zip
ファイルを解凍します。
unzip terraform_1.11.4_linux_amd64.zip
コマンドをパスの通ったところに配置します。
mv terraform /usr/local/bin
バージョン確認のコマンドを実行して出力されるか確認します。
terraform version
Terrafrom の使い方
Terrafrom は拡張子が.tfになっているファイルを読み込んで動作します。
この tfファイルには、どんな材料(データセンター、クラスター、ネットワーク等)を使って、何を作るのか(仮想マシン等)を書いておきます。
ここの書き方は実際に仮想マシンやリソースを作成する手順の中で説明しますので今は割愛します。

コマンドを実行したディレクトリ内にある .tfファイルを全部読み込むため、複数の仮想マシンを一度に管理したい場合は同じ tfファイルに記載して大丈夫ですが、削除のタイミングを仮想マシン毎に分けたい場合はディレクトリを分けて tfファイルを作成する必要があるのでその点は注意が必要です。

tfファイルを作成し終わった後は、Terrafrom のコマンドでリソースの作成を行うのですがよく使うのは以下のコマンドです。

init
Terraformが使うプラグインのダウンロードを行います。
初めて実行する際や、プロバイダーのバージョンを変更した場合などに実行します。

plan
tfファイルに記述されている内容で予行演習を行い問題がないかなどをチェックします。
実際に変更を加えることはありません。

apply
実際に tfファイルの内容を反映させます。

destroy
作成したリソースをすべて削除します。
Terrafrom で作成したリソースを vSphere Client などで直接消してしまうと、Terrafrom としては存在すると認識したままになってしまうので、削除の際は必ず destroy を使用してください。

では、次回から仮想マシンの作成を行っていきたいと思います。