NutanixをTerraformで試してみる

NutanixをTerraformで操ってみます。

こんにちは、yizumi443(いずみよんよんさん)です。

先日ニュースになったようなならないような、な、Nutanix。HCIの代表的なプロダクツのひとつです。

もちろん、これも仮想化環境であり、Terraformから操ることができます。

1.Nunatixとは、HCIとは

NutanixはHCI製品の名前であり、またその製品を開発・販売する企業の名前でもあります。

そしてHCIはハイパーコンバージド・インフラストラクチャのことで、以下の特徴を持ちます。

  • ハイパーバイザ、仮想SAN、仮想LANを統合
  • これらを実現するハードウェアとソフトウェアをセットで商品化する

もしHCIの運用を開始したのち、リソースが不足してきたら、商品を買い増すだけで拡張が可能になります。

すでにオンプレミスサーバやデータセンタを運用している企業にとって、プライベートクラウドを平易に構築し水平スケールもできる、HCI。 Nutanixは当初専用ハードでこれを製品化し、じょじょに他ハードウェアでの動作をサポートするようになり、ついにNested VMとしても動作可能となっています。

2.Nutanix Test Driveでお試し可能

ハイパーバイザ上で仮想マシンを起動させ、その中でさらに別のハイパーバイザを動作させるNested VMでも、Nutanixは動作します。 まさにGCEではNested VMがサポートされており、Nutanixが提供する試用版、Test Driveはこのサービスにより提供されています。

このTest Drive、メールアドレスの登録のみで、GCEインスタンスで動作するNutanixを2時間無料試用できる、というもの。 Nutanixには無料で利用できるCommunity Editionもありますが、必要なハードウェアのスペックがなかなかですので、まずTest Driveから触ってみるのがお手軽でしょう。

3.Terraformでインスタンスを作成してみる

もちろん、TerraformのNutanixプロバイダを使い、かんたんにNutanix内でのVMの操作が可能です。

しかしじっさいにいじってみようとすると、Terraformの公式ドキュメントの内容だけでは不十分なことに気づきます。

これらはある程度Nutanixにくわしければ解決可能なので、実務上困ることはないと思われますが、試用のため、ここでノウハウをご紹介いたします。

3-1.プロバイダ設定

TerraformのNutanixプロバイダは、以下のように設定します。もちろんじっさいには、endpointは変数とすべきでしょう。

provider "nutanix" {
  username     = "nutanix"
  password     = "nutanix/4u"
  endpoint     = "<Test Driveのサブドメイン名>.nutanixtestdrive.com"
  insecure     = true
  port         = 443
}

なお、Test Driveは認証なしで呼び出せてしまうため、usernamepasswordには何を指定してもよいようです。

そのため、これらは変数とせずにダミー値としています。(なお、管理コンソールPrismから起動したVMへのログインアカウントおよびパスワードが、まさにこれらの値です)

3-2.クラスタの取得

Nutanixは1「物理」サーバ(もちろん、Nested VMでは物理に対応してはいません)をノードとみなし、ノードを束ねた構成をクラスターと呼びます(ブロックは説明省略)。

そして、VMやサブネットを作成する対象はクラスターであるため、Nutanixからこれらを操作する場合、まず「操作できるクラスター」を選択しなければなりません。

Test Driveの場合、対象のクラスターは"AOSonGCP"という名前を持つため、これをデータソースから検索してローカル変数に設定します。

Terraformドキュメント内のサンプルコードでは、これを「クラスターのリストの先頭」として固定で取得していますが、じっさいのTest Driveにおいて、「先頭にならないことがある」事実を確認済ですので、検索は必須です。

data "nutanix_clusters" "clusters" {}

locals {
  cluster_uuid = [for c in data.nutanix_clusters.clusters.entities: c if c.name == "AOSonGCP"].0.metadata.uuid
}

3-3.デフォルトサブネットの取得

Nutanixクラスターにはサブネットをいくつでも追加できますが、その際、デフォルトで設定済みのサブネットを取得しなければならないことがあります。 追加のサブネットを作成せずにVMが外界と通信するような場合、です。この場合でもVMには明示的な指定が必要です。

Test Driveでは、デフォルトのサブネットは"default-net"という名前です。

data "nutanix_subnet" "default_net" {
  subnet_name = "default-net"
}

locals {
  default_subnet_uuid = data.nutanix_subnet.default_net.metadata.uuid
}

3-4.サブネットの作成

サブネットを新たに作成する場合、対象のクラスターのUUID、整数値を指定するvlan_id、デフォルトゲートウェイとサブネットIPが必要です。サブネットは、198.168.5.0/24以外の任意の範囲で作成することができます。

なお、作成し起動したVM上でネットワーク設定コードを動かすような場合(オンプレからの移植などで)、IPやゲートウェイなどを省略することで対応できます

resource "nutanix_subnet" "nic1" {
  name         = "test-nic-1"
  cluster_uuid = local.cluster_uuid

  vlan_id     = 101
  subnet_type = "VLAN"

  prefix_length = 20

  default_gateway_ip = "10.5.80.1"
  subnet_ip          = "10.5.80.0"
}

3-5.プリセットイメージの検索

VMは作成しただけではもちろん動かず、OSを設定する必要があります。これは、動作環境が整えられているディスクイメージをディスクに割り当てることでかんたんに可能となります。

そのディスクイメージはもちろん、自前で作成したものをPrismやAPI経由で登録し、それを使うことが可能ですが、Test Driveにあらかじめ設定されているイメージをPrismやAPIから確認することができ、それを指定することでTerraformからでも利用できます。

以下の名前はあくまでも例であり、じっさいには指定可能なイメージ名をPrismやAPIで得ておく必要があります。

data "nutanix_image" "image" {
  image_name = "CentOS-7-x86_64-1810.qcow2"
}

locals {
  default_image_uuid = data.nutanix_image.image.metadata.uuid
}

3-6.VMの作成

いよいよVMの作成です。

以下の例では、サブネットとしてデフォルトネットと、先に作成するnic1を指定しています。そしてディスクは先に指定したCentOS7のイメージから生成し追加しています。

resource "nutanix_virtual_machine" "vm1" {
  name         = "test-target"
  cluster_uuid = local.cluster_uuid

  num_vcpus_per_socket = 1
  num_sockets          = 1
  memory_size_mib      = 2048

  nic_list {
    subnet_uuid = local.default_subnet_uuid
  }

  nic_list {
    subnet_uuid = nutanix_subnet.nic1.metadata.uuid
    ip_endpoint_list {
      ip =   "10.5.80.2"
      type = "ASSIGNED"
    }
  }

  disk_list {
    disk_size_mib         = 10240
    data_source_reference = {
      kind = "image"
      uuid = local.default_image_uuid
    }
  }
}

終わり

以上のとおり、Test DriveをTerraformから操作することで、Nutanixを気軽に体験することができます。

ただし、すでに設定されているNutanixをTerraformで操る場合、さまざまな工夫が必要になってきます。今後機会があれば、そちらについても触れてみたいと思います。