Terraform の Nutanix Provider v2 で、仮想マシンを作成してみます。
今回の環境
Terraform の実行環境は、下記のように用意してあります。
仮想マシンを作成するための、ディスク イメージと VLAN サブネットは、Terraform では下記のように作成できます。
ディスク イメージと VLAN サブネットは、Prism Central の Web UI で手動作成しても構いません。
作成しておく VLAN サブネットのパラメータです。
- サブネットの名前:nw-vlan-12-ipam
- VLAN ID:12
- IPAM 有効(IP アドレス プールも設定済)
Prism Central に登録しておくディスク イメージです。
- イメージ名:OL9U5_x86_64-kvm-b253.qcow2
- ダウンロード URL:https://yum.oracle.com/templates/OracleLinux/OL9/u5/x86_64/OL9U5_x86_64-kvm-b253.qcow2
1. Cloud-init スクリプトの作成
仮想マシンの初回起動時に、ログイン ユーザーの作成などを実行するための Cloud-init スクリプトを作成しておきます。
cloud-init_nutanix.yml
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」
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 の差分確認から除外します。
output.tf
仮想マシンに設定された IP アドレスを表示します。
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 エンコードした文字列をヒアドキュメントで記述します。
例2:IP アドレスを静的に指定する
vm_v2.tf ファイルで、仮想マシンの NIC に IP アドレスを指定します。
- L28-L31:サブネットのネットワーク アドレスの範囲から、IP アドレスを指定します。
- L53:IP アドレスの指定による NIC の設定変更が、仮想マシン作成後の terraform apply で差分として検知されないように、仮想マシン定義の「nics」配下を Terraform の差分確認から除外します。
例3:複数台の仮想マシンを作成する
vm_v2.tf にて、複数の仮想マシンを作成できるように「count」を追記して、仮想マシン名の規則を「format」関数で記述します。
- L2:2台の仮想マシンを作成します。
- L3:仮想マシンは、vm-01、vm-02 といった名前になります。
output.tf の内容を変更して、作成した仮想マシンに IPAM で自動付与された IP アドレスを、Output で取得してみます。
「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 アドレスが一致しています。
つづく。