2019年9月28日土曜日

Terraform vSphere 最速入門

概要

とりあえず動かしてみたい人向けです
クローン元の VM は事前に作成してあることが前提です

環境

  • vSphere 6.7.0.30000
  • terraform v0.12.1
  • CentOS 7.7.1908

事前準備

今回はクローンすることで VM を作成します
またストレージやネットワークなども事前に準備済みとします

tf ファイル

おそらくクローンで VM を作成する際の最低限の設定になります

  • vim resources.tf
variable "vsphere_user" {}
variable "vsphere_password" {}
variable "vsphere_server" {}

provider "vsphere" {
  user           = "${var.vsphere_user}"
  password       = "${var.vsphere_password}"
  vsphere_server = "${var.vsphere_server}"

  allow_unverified_ssl = true
}

data "vsphere_datacenter" "dc" {
  name = "dc1"
}

data "vsphere_datastore" "datastore" {
  name          = "datastore1"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_compute_cluster" "cluster" {
  name          = "cluster1"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_network" "network" {
  name          = "network1"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_virtual_machine" "template" {
  name          = "seed_vm1"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

resource "vsphere_virtual_machine" "vm" {
  name             = "terraform-test"
  resource_pool_id = "${data.vsphere_compute_cluster.cluster.resource_pool_id}"
  datastore_id     = "${data.vsphere_datastore.datastore.id}"

  num_cpus = 2
  memory   = 1024
  guest_id = "${data.vsphere_virtual_machine.template.guest_id}"

  scsi_type = "${data.vsphere_virtual_machine.template.scsi_type}"

  network_interface {
    network_id   = "${data.vsphere_network.network.id}"
    adapter_type = "vmxnet3"
  }

  disk {
    label            = "disk0"
    size             = "${data.vsphere_virtual_machine.template.disks.0.size}"
    eagerly_scrub    = "${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}"
    thin_provisioned = "${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}"
  }

  clone {
    template_uuid = "${data.vsphere_virtual_machine.template.id}"

    customize {
      linux_options {
        host_name = "terraform-test"
        domain    = "test.internal"
      }

      network_interface {
        ipv4_address = "192.168.100.11"
        ipv4_netmask = 24
      }

      ipv4_gateway = "192.168.100.1"
    }
  }
}

動作確認

  • terraform init
  • terraform plan -var 'vsphere_user=administrator@vsphere.local' -var 'vsphere_password=xxxxxxxxxx' -var 'vsphere_server=192.168.100.10'
  • terraform apply -var 'vsphere_user=administrator@vsphere.local' -var 'vsphere_password=xxxxxxxxxx' -var 'vsphere_server=192.168.100.10'

削除

  • terraform destroy -var 'vsphere_user=administrator@vsphere.local' -var 'vsphere_password=xxxxxxxxxx' -var 'vsphere_server=192.168.100.10'

軽く解説

使っている terraform の機能 (リソース) は variable, provider, data そして resource になります
実際に VM を作成しているのは resource になります

variable はその名の通り変数を定義しています
今回は vCenter の「ログインユーザ名」「パスワード」「アドレス」を変数にしています
.tf ファイル内に書いても問題ないですが今回は実行時に引数で実行するようにしました

providervSphere Provider を使う定義をしています
変数で設定した認証情報はここに設定します

data は vSphere 内の各リソース (データセンターやクラスタ、データストア、ネットワーク、テンプレートなど) を定義します
各リソース内で datacenter_id を指定しています
これは Moref で取得できる ID で名前ではありません
terraform では ${data.vsphere_datacenter.dc.id} という感じで事前に定義したデータセンターの data を使うことで自動的に Moref からデータセンターの ID を引っ張ってきて設定してくれます
ID を引っ張ってくるのは terraform plan 時に取得して確認します
Provider が提供する参照可能なデータはリファレンスを見ると良いです

resourece で VM の作成を行います
今回はクローンして VM を作成するので vsphere_virtual_machine.clone リソースを使います
ここでクローン元の VM を指定します
template_uuid には事前に data で定義した data "vsphere_virtual_machine" "template" から id を参照すれば OK です
あとはディスクの情報とネットワークの情報を指定すれば OK です
今回は作成する VM の IP アドレスは固定 IP を指定するので IP の情報も記載しました
DHCP 環境のネットワークであれば IP アドレスやゲートウェイの指定は不要です
それ以外の情報はクローン元の VM と同じにするので ${data.vsphere_virtual_machine.template.disks.0.size} みたいな感じでクローン元の VM の情報を参照しています

最後に

Terraform vSphere をとりあえず動かしてみました
今回は紹介しませんでしたが実はポイントはクローン元の VM でこっちがちゃんと設定できていないと apply に失敗します

例えば vmware-tools のインストール漏れやネットワークインタフェースの設定が漏れていると IP アドレスが取得できなくてエラーになることがあります
vSphere Provider で VM がうまく作成できない場合は大抵ネットワーク周りかなと思います

あとは今回はすべてのリソースを resources.tf 配下に作成しましたが terraform は *.tf ファイルを自動で読み込んでくれるので各リソースごとに設定などをまとめたりできます

参考サイト

0 件のコメント:

コメントを投稿