#3 Terraformを使用して仮想マシンを作成する

前回の投稿では、Terraformから1台の仮想マシンを作成する方法について紹介しました。
最後となる今回は、複数の仮想マシンを一括で作成するサンプルコードについてご紹介します。

Terraformを使用して仮想マシンを作成する
#1 Terraformの概要とGen.2 FSRのAPIについて
#2 Terraformを使用した仮想マシン作成(前半)
#3 Terraformを使用した仮想マシン作成(後半)

サンプルコードのディレクトリ構成

ご紹介するサンプルコードは、次のディレクトリ構成で動作します。
サンプルコードをコピーするために、事前にディレクトリ構造と空の定義ファイルを準備してください。

Terraformは、カレントディレクトリに存在する定義ファイルを、全て読み込むという特徴があります。
そのため、配置した仮想マシンの定義ファイルの数だけ、一括で仮想マシンを作成できます。

また、別ディレクトリにある定義ファイルをモジュールとして呼び出せます。
サンプルコードでは、各バージョンのOSテンプレートを呼び出すコードをモジュール化しています。

サンプルコードの実装

事前に準備した各定義ファイルにサンプルコードを挿入していきます。

  1. terraform/module/win/上の「win-template.tf」に次のコードを挿入します。

    terraform {
      required_providers {
        vcd = {
          source = "vmware/vcd"
        }
      }
    }
     
    // Windows Server OSライブラリ
    data "vcd_catalog" "win_lib" {
      org  = "os-library"          
      name = "OSライセンス:Windows"
    }
     
    // Windows Server 2019テンプレート
    data "vcd_catalog_vapp_template" "win2019" {
      catalog_id = data.vcd_catalog.win_lib.id
      name = "Windows Server 2019 (1.3)"
    }
     
    // Windows Server 2022テンプレート
    data "vcd_catalog_vapp_template" "win2022" {
      catalog_id = data.vcd_catalog.win_lib.id
      name = "Windows Server 2022 (1.2)"
    }
    
  2. terraform/module/win/上の「output.tf」に次のコードを挿入します。

    // 外部からの呼び出しを可能にする
    output "win2019" {
        value = data.vcd_catalog_vapp_template.win2019.id
    }
     
    output "win2022" {
        value = data.vcd_catalog_vapp_template.win2022.id
    }
    
  3. terraform/module/rhel/上の「rhel-template.tf」に次のコードを挿入します。

    terraform {
      required_providers {
        vcd = {
          source = "vmware/vcd"
        }
      }
    }
       
    // Red Hat Enterprise Linux OSライブラリ
    data "vcd_catalog" "rhel_lib" {
      org  = "os-library"
      name = "OSライセンス:Red Hat Enterprise Linux"
    }
      
    // Red Hat Enterprise Linux 8 テンプレート
    data "vcd_catalog_vapp_template" "rhel8" {
      catalog_id = data.vcd_catalog.rhel_lib.id
      name = "Red Hat Enterprise Linux 8.4 (1.1)"
    }
      
    // Red Hat Enterprise Linux 9 テンプレート
    data "vcd_catalog_vapp_template" "rhel9" {
      catalog_id = data.vcd_catalog.rhel_lib.id
      name = "Red Hat Enterprise Linux 9.1 (1.0)"
    }
    
  4. terraform/module/rhel/上の「output.tf」に次のコードを挿入します。

    // 外部からの呼び出しを可能にする
    output "rhel8" {
        value = data.vcd_catalog_vapp_template.rhel8.id
    }
     
    output "rhel9" {
        value = data.vcd_catalog_vapp_template.rhel9.id
    }
    
  5. terraform/上の定義ファイル「main.tf」に以下のコードを挿入します。
    APIトークンなどは直接記述せず変数として定義しています。
    こうすることで、Terraform実行時にプロンプトから入力できるようになります。

    terraform {
      required_providers {
        vcd = {
          source = "vmware/vcd"
        }
      }
    }
      
    provider "vcd" {
      auth_type         = "api_token"
      api_token         = "${var.api-token}" // Terraform実行時に入力
      org               = "${var.org-vdc}" // Terraform実行時に入力
      vdc               = "${var.org-vdc}" // Terraform実行時に入力
      url               = "https://vcd14.gen2.p2.iijgio.jp/api"
      max_retry_timeout = 3
    }
      
    /*
    「OSライセンス:Windows」と「OSライセンス:Red Hat Enterprise Linux」いずれかの契約がない場合は下記の該当するモジュール呼び出し部分をコメントアウトして使用してください。
     契約がない場合OSライブラリにテンプレートが存在せず、コンパイルエラーになります。
    */
      
    module "win-template" { // Windowsテンプレートモジュールの呼び出し
      source = "./module/win"
    }
      
    module "rhel-template" { // Red Hat Enterprise Linuxテンプレートモジュールの呼び出し
      source = "./module/rhel"
    }
    
  6. terraform/上の「variable.tf」に次のコードを挿入します。

    // 外部入力する変数を定義
    
    variable "api-token" {
       
    }
     
    variable "org-vdc" {
        
    }
    
  7. Windows用のサンプルコードです。
    作成したい仮想マシンごとに、任意のファイル名で定義ファイルを作成します。
    コード内のコメントにて、【要変更】となっている箇所は要件に応じて適宜変更ください。

    // 仮想マシンの定義
    resource "vcd_vm" "vm01" { // 【要変更】Terraform内でリソース名が一意である必要があるため「vm01」のカ所は適宜変更
      name                   = "vm01" // 【要変更】仮想マシン名
      computer_name          = "vm01" // 【要変更】コンピュータ名
      vapp_template_id       = module.win-template.win2022 // 【要変更】右端のブロック(Win2022)のみ変更する。記入するOS種別は右から選択 「win2019 or win2022」
      cpus                   = 2 // 【要変更】仮想CPUの数
      cpu_cores              = 2 // 【要変更】ソケットあたりのコア数
      cpu_hot_add_enabled    = false // 【要変更】CPUホットアドの有効・無効
      memory                 = 4096 // 【要変更】メモリのサイズ(MB単位)
      memory_hot_add_enabled = false // 【要変更】メモリホットアドの有効・無効
      power_on               = false // 【要変更】電源の状態
      accept_all_eulas       = true // EULAに同意する(固定値)
      
    // NICの定義(IPアドレス割り当ては「固定-手動」)
      network {                                       
        name               = "xxxxxxxxxxx" // 【要変更】仮想マシンが接続するプライベートネットワークセグメントの名称
        type               = "org"
        ip_allocation_mode = "MANUAL"                 
        ip                 = "192.168.10.xxx" // 【要変更】割り当てたIPアドレスを入力
        is_primary         = true
      }
     
    // セカンダリNICが必要な場合のみ。不要な場合は削除かコメントアウト
       network {                                      
        name               = "xxxxxxxxxxx" // 【要変更】仮想マシンが接続するプライベートネットワークセグメントの名称
        type               = "org"
        ip_allocation_mode = "MANUAL"                
        ip                 = "192.168.20.xxx" // 【要変更】割り当てたIPアドレスを入力
      }
      
    // システムディスクのカスタマイズ
      override_template_disk {        
        bus_type        = "paravirtual" // 【要変更】各OSに応じて編集 win2019:sas、win2022:paravirtual
        size_in_mb      = "153600" // 【要変更】ディスク容量(MB単位)
        bus_number      = 0          
        unit_number     = 0         
        storage_profile = "basic" // 【要変更】ストレージポリシーを選択 bacic or standard
      }
      
    // ゲストOSのカスタマイズを定義
      customization {
        enabled    = true
        change_sid = true
        auto_generate_password = false //【要変更】パスワードを自動生成(trueの場合はadmin_passwordの項目を削除かコメントアウト)
        admin_password         = "xxxxxxxx" //【要変更】指定のパスワードを入力
      }
      
    }
    
  8. Red Hat Enterprise Linux用のサンプルコードです。
    作成したい仮想マシンごとに任意のファイル名で定義ファイルを作成します。
    コード内のコメントにて、【要変更】となっている箇所は要件に応じて適宜変更ください。

    
    // 仮想マシンの定義
    resource "vcd_vm" "vm01" { // 【要変更】Terraform内でリソース名が一意である必要があるため「vm01」のカ所は適宜変更
      name                   = "vm01" // 【要変更】仮想マシン名
      computer_name          = "vm01" // 【要変更】コンピュータ名
      vapp_template_id       = module.rhel-template.rhel9 // 【要変更】右端のブロック(rhel9)のみ変更する。記入するOS種別は右から選択 「rhel8 or rhel9」
      cpus                   = 2 // 【要変更】仮想CPUの数
      cpu_cores              = 2 // 【要変更】ソケットあたりのコア数
      cpu_hot_add_enabled    = false // 【要変更】CPUホットアドの有効・無効
      memory                 = 4096 // 【要変更】メモリのサイズ(MB単位)
      memory_hot_add_enabled = false // 【要変更】メモリホットアドの有効・無効
      power_on               = false // 【要変更】電源の状態
      accept_all_eulas       = true // EULAに同意する(固定値)
      
    // NICの定義(IPアドレス割り当ては「固定-手動」)
      network {                                       
        name               = "xxxxxxxxxxxx" // 【要変更】仮想マシンが接続するプライベートネットワークセグメントの名称
        type               = "org"
        ip_allocation_mode = "MANUAL"                 
        ip                 = "192.168.10.xxx" // 【要変更】割り当てたIPアドレスを入力
        is_primary         = true
      }
     
    // セカンダリNICが必要な場合のみ。不要な場合は削除かコメントアウト
       network {                                      
        name               = "xxxxxxxxxxxx" // 【要変更】仮想マシンが接続するプライベートネットワークセグメントの名称
        type               = "org"
        ip_allocation_mode = "MANUAL"                
        ip                 = "192.168.20.xxx" // 【要変更】割り当てたIPアドレスを入力
      }
     
    // rootボリュームのカスタマイズ
      override_template_disk {        
        bus_type        = "paravirtual" // Red Hat Enterprise Linuxの場合は「paravirtual」で固定
        size_in_mb      = "153600" // 【要変更】ディスク容量(MB単位)
        bus_number      = 0          
        unit_number     = 0         
        storage_profile = "basic" // 【要変更】ストレージポリシーを選択 bacic or standard
      }
      
    // ゲストOSのカスタマイズを定義
      customization {
        enabled    = true
        auto_generate_password = false //【要変更】パスワードを自動生成(trueの場合はadmin_passwordの項目を削除かコメントアウト)
        admin_password         = "xxxxxxxx" //【要変更】指定のパスワードを入力
      }
      
    }
    

サンプルコードを実行する

  1. terraform/に移動し、Terraformの初期化を行います。

    $terraform init                                      
    
  2. Terraformの実行計画を確認します。
    APIトークンやテナント識別情報を求められるので入力します。

    $terraform plan
    
    var.api-token
      Enter a value: //作成したapiトークンを入力
     
    var.org-vdc
      Enter a value: //svrssaで始まる組織名(org)を入力
    
  3. Terraformを実行して仮想マシンを作成します。
    再度、APIトークンやテナント識別情報を求められるので入力します。

    $terraform apply
    
    var.api-token
      Enter a value: //作成したapiトークンを入力
     
    var.org-vdc
      Enter a value: //svrssaで始まる組織名(org)を入力
    
  4. Terraformが実行され複数の仮想マシンが一括で作成されます。

    vcd_vapp.SampleVM: Creating...
    vcd_vapp.SampleVM: Creation complete after 5s [id=urn:vcloud:vapp:########]
    vcd_vapp_vm.SampleVM: Creating...
    vcd_vapp_vm.SampleVM: Still creating... [10s elapsed]
    vcd_vapp_vm.SampleVM: Still creating... [20s elapsed]
    vcd_vapp_vm.SampleVM: Still creating... [30s elapsed]
    vcd_vapp_vm.SampleVM: Still creating... [40s elapsed]
    vcd_vapp_vm.SampleVM: Still creating... [50s elapsed]
    vcd_vapp_vm.SampleVM: Creation complete after 53s [id=urn:vcloud:vm:########]
    

Terraformを使用した仮想マシン作成に関する投稿はこれで以上です。
仮想マシンの作成を自動化することで、作業時間の短縮や設定ミスの防止を実現できます。
ぜひお試しください。

執筆者
IIJ サービスプロダクト推進本部 サービス推進部 技術支援2課