前回の投稿では、Terraformから1台の仮想マシンを作成する方法について紹介しました。
最後となる今回は、複数の仮想マシンを一括で作成するサンプルコードについてご紹介します。
Terraformを使用して仮想マシンを作成する | #1 Terraformの概要とGen.2 FSRのAPIについて |
---|
#2 Terraformを使用した仮想マシン作成(前半) |
#3 Terraformを使用した仮想マシン作成(後半) |
ご紹介するサンプルコードは、次のディレクトリ構成で動作します。
サンプルコードをコピーするために、事前にディレクトリ構造と空の定義ファイルを準備してください。
Terraformは、カレントディレクトリに存在する定義ファイルを、全て読み込むという特徴があります。
そのため、配置した仮想マシンの定義ファイルの数だけ、一括で仮想マシンを作成できます。
また、別ディレクトリにある定義ファイルをモジュールとして呼び出せます。
サンプルコードでは、各バージョンのOSテンプレートを呼び出すコードをモジュール化しています。
事前に準備した各定義ファイルにサンプルコードを挿入していきます。
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)"
}
// 外部からの呼び出しを可能にする
output "win2019" {
value = data.vcd_catalog_vapp_template.win2019.id
}
output "win2022" {
value = data.vcd_catalog_vapp_template.win2022.id
}
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)"
}
// 外部からの呼び出しを可能にする
output "rhel8" {
value = data.vcd_catalog_vapp_template.rhel8.id
}
output "rhel9" {
value = data.vcd_catalog_vapp_template.rhel9.id
}
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"
}
// 外部入力する変数を定義
variable "api-token" {
}
variable "org-vdc" {
}
// 仮想マシンの定義
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" //【要変更】指定のパスワードを入力
}
}
// 仮想マシンの定義
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" //【要変更】指定のパスワードを入力
}
}
$terraform init
$terraform plan
var.api-token
Enter a value: //作成したapiトークンを入力
var.org-vdc
Enter a value: //svrssaで始まる組織名(org)を入力
$terraform apply
var.api-token
Enter a value: //作成したapiトークンを入力
var.org-vdc
Enter a value: //svrssaで始まる組織名(org)を入力
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を使用した仮想マシン作成に関する投稿はこれで以上です。
仮想マシンの作成を自動化することで、作業時間の短縮や設定ミスの防止を実現できます。
ぜひお試しください。