NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Terraform の Nutanix Provider v2 を使用してみる。Part-03:仮想マシンの作成

Terraform の Nutanix Provider v2 で、仮想マシンを作成してみます。

今回の環境

Terraform の実行環境は、下記のように用意してあります。

 

仮想マシンを作成するための、ディスク イメージと VLAN サブネットは、Terraform では下記のように作成できます。

 

ディスク イメージと VLAN サブネットは、Prism Central の Web UI で手動作成しても構いません。

 

作成しておく VLAN サブネットのパラメータです。

  • サブネットの名前:nw-vlan-12-ipam
  • VLAN ID:12
  • IPAM 有効(IP アドレス プールも設定済)

 

Prism Central に登録しておくディスク イメージです。

 

1. Cloud-init スクリプトの作成

仮想マシンの初回起動時に、ログイン ユーザーの作成などを実行するための Cloud-init スクリプトを作成しておきます。

cloud-init_nutanix.yml

gist.github.com

 

tf ファイルの中で指定するため、下記のようにCloud-init スクリプトの内容を Base64 エンコードした文字列を取得しておきます。

$ cat cloud-init_nutanix.yml | base64
I2Nsb3VkLWNvbmZpZwoKZGlzYWJsZV9yb290OiB0cnVlCnNzaF9wd2F1dGg6IHRydWUKcGFja2Fn
ZV91cGdyYWRlOiBmYWxzZQoKdXNlcnM6Ci0gbmFtZTogbnV0YW5peAogIHNoZWxsOiAvYmluL2Jh
c2gKICBsb2NrLXBhc3N3ZDogZmFsc2UKICBzdWRvOiBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMCgpj
aHBhc3N3ZDoKICBsaXN0OiB8CiAgICBudXRhbml4Om51dGFuaXgvNHUKICBleHBpcmU6IGZhbHNl
Cg==

 

2. tf ファイルの作成

新規ディレクトリを作成して、下記のファイル一式を作成します。

今回のファイル構成

ディレクトリには、下記のファイルを作成します。

$ tree --charset=ascii ./
./
|-- data_v2.tf
|-- output.tf
|-- prism.auto.tfvars
|-- provider.tf
|-- variable.tf
`-- vm_v2.tf

 

以前の投稿の tf ファイル

以前の投稿 で作成したファイル一式も、そのままの内容で作成します。

  • provider.tf
  • variable.tf
  • prism.auto.tfvars

 

data.tf(データ ソース)

データ ソースで、作成ずみのリソースを取得します。これは、仮想マシンのリソース定義で UUID(ext_id)を指定するために必要です。

  • L1~:Nutanix クラスタ:lab-nxce-10
  • L9~:VLAN サブネット:nw-vlan-12-ipam
    • 複数クラスタにわたって同名サブネットが存在しうるので、Nutanix クラスタの ext_id を参照。ext_id はパスが長いので、local 変数に格納(L5~L7)
  • L13~:ディスク イメージ:OL9U5_x86_64-kvm-b253.qcow2
    • これは、Cloud-init がインストールされている「Cloud Image」

gist.github.com

 

vm_v2.tf

仮想マシンを作成する tf ファイルを用意しておきます。

  • L2:仮想マシン名は vm01 です。
  • L17:ディスク イメージの UUID(ext_id)を参照します。
  • L27:IP アドレスを指定していないので、サブネットの IP アドレスプールから DHCP で設定されます。
  • L41:Cloud-init スクリプト ファイルの内容を、Terraform Configuration Language(TCL)の「filebase64」関数で Base64 エンコードして読み込みます。
  • L47-L52:Cloud-init による設定ゲスト OS 設定が、仮想マシン作成後の terraform apply で再実行されないように、仮想マシン定義の一部を Terraform の差分確認から除外します。

gist.github.com

 

output.tf

仮想マシンに設定された IP アドレスを表示します。

gist.github.com

 

3. 仮想マシンの作成(terraform コマンドの実行)

新規フォルダで terraform コマンドを実行するので、あらためて「teraform init」を実行します。

$ terraform init

 

これまでと同様に、「terraform plan」→「terraform apply」でリソースを作成します。

$ terraform plan
$ terraform apply -auto-approve

 

terraform apply による仮想マシンの作成が完了すると、下記のように仮想マシンに設定された IP アドレスが表示されます。

 

これは、あとから「terraform output」でも確認できます。

$ terraform output
vm1_ip = "192.168.12.16"

 

Terraform の State は下記のように登録されます。

$ terraform state list
data.nutanix_clusters_v2.cluster1
data.nutanix_images_v2.image1
data.nutanix_subnets_v2.subnet1
nutanix_virtual_machine_v2.vm1

 

Prism Central の VMs 画面でも、仮想マシンが作成されたことがわかります。

 

4. 仮想マシンの削除

仮想マシンの削除は、これまでの投稿と同様に terraform destroy です。

$ terraform destroy -auto-approve

 

仮想マシン作成例

vm_v2.tf ファイルの内容を変更して、あらためて仮想マシンを作成してみます。

例1:Cloud-init スクリプトを Base64 エンコードで指定する

Cloud-init スクリプトを別ファイルに分離せず、Base64 エンコードした文字列を仮想マシンのリソースに直接記述します。

  • L43-L47:Cloud-init スクリプトを Base64 エンコードした文字列をヒアドキュメントで記述します。 

gist.github.com

 

例2:IP アドレスを静的に指定する

vm_v2.tf ファイルで、仮想マシンの NIC に IP アドレスを指定します。

  • L28-L31:サブネットのネットワーク アドレスの範囲から、IP アドレスを指定します。
  • L53:IP アドレスの指定による NIC の設定変更が、仮想マシン作成後の terraform apply で差分として検知されないように、仮想マシン定義の「nics」配下を Terraform の差分確認から除外します。

gist.github.com

 

例3:複数台の仮想マシンを作成する

vm_v2.tf にて、複数の仮想マシンを作成できるように「count」を追記して、仮想マシン名の規則を「format」関数で記述します。

  • L2:2台の仮想マシンを作成します。
  • L3:仮想マシンは、vm-01、vm-02 といった名前になります。

gist.github.com

 

output.tf の内容を変更して、作成した仮想マシンに IPAM で自動付与された IP アドレスを、Output で取得してみます。

gist.github.com

 

「terraform apply」を実行すると、Output により仮想マシンに設定された IP アドレスが表示されます。

 

これは、「terraform output」を実行することでも確認できます。

$ terraform output
vms_name_ip_map = {
  "vm-01" = "10.0.11.19"
  "vm-02" = "10.0.11.10"
}

 

作成された仮想マシン vm-01 と vm-02 と、IP アドレスが一致しています。

 

つづく。

 

©2024 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。