vm.gowatana.jp

NEOにほんごVMware(仮)

Avi Load Balancer を Terraform で操作してみる。(vSphere といっしょに)

Japan VMUG vExpert が語る #36 で「Avi Load Balancer を Terraform で操作してみる。」というタイトルで登壇しました。

vmug-jp.connpass.com

 

当日の録画はこちら。

www.youtube.com

 

今回の内容です。

 

はじめに

今回は、Avi Load Balancer と vSphere を Terraform で操作してみます。

Avi Load Blancer は、VMware by Broadcom になってから、Application Networking and Security 部門の製品になりました。ちなみに少し前まで NSX Advanced Load Balancer という名前でしたが、Avi Load Blancer という名前に変更されました。(というか Avi に戻りました)

 

今回の Avi デモ環境

今回のデモ環境は、以前の投稿にある環境と同様の構成で Avi Controller をセットアップしてあります。投稿時よりも少し新しい(とはいっても最新ではない)バージョンである v22.1.3 を使用しています。

 

そして、Avi Load Blancer のプール メンバとして登録する仮想マシンは、直前のセッションで Terraform での vSphere 自動化に挑戦してみた話をされていた Unemoto さんが、以前にブログで紹介していた構成で作成してあります。

ということで vSphere Provider の準備や実行の流れについては下記の投稿をどうぞ。

hiro1325.hatenablog.com

 

ただし、今回は仮想マシンの新規作成ではなく、Web サーバ構築ずみの仮想マシンをクローンしてあります。

 

vSphere(vCenter Server の配下)に仮想マシン「testvm99」を作成してあり、IP アドレスは、DHCP で「192.168.11.30」が設定されています。

 

仮想マシンのクローン作成の HCL(.tf)ファイルは、下記のように作成しました。

 

Unemoto さんのブログ での HCL との差分(仮想マシン作成 → クローンに変更)は、下記のようになっています。

  • ただし、この差分とは別に、vCenter インベントリ オブジェクト名は私のラボに合わせてあります。そのうえでの編集前ファイル(比較用)として main.tf.original を用意してあります。
  • sdiff での比較は こちら

gist.github.com

 

Terraform での Avi Load Balancer 仮想サービス作成(説明)

今回は、VMware の提供する Avi Provider である「vmware/avi」を使用します。

Avi Provider の Terraform Registry は下記です。

 

ここからのポイントです。

  • vSphere 上の VM にアクセスする仮想サービス(Virtual Service を作成)
  • vSphere と Avi は、それぞれ別 Provider を使用する

 

Avi のプール作成時には、仮想マシンの IP アドレスを指定したいのですが、今回の HCL で仮想マシンを作成した場合には、IP アドレスが取得できませんでした。(Terraform の State に IP アドレスが含まれていません)

そこで、Terraform の State に仮想マシンの IP アドレスを含めるには、次のような工夫が考えられるかなと思います。※この投稿の最後に 後日解決編 あり

  • 仮想マシンのデプロイ時に IP アドレスを指定
  • 実機(デプロイ後の仮想マシン)から IP アドレスを取得

 

今回は、vSphere Provider を利用して、仮想マシンの(ゲスト OS に設定された)IP アドレスを取得してみます。そしてその IP アドレスを、Avi のプール メンバとして指定します。

 

Terraform での Avi Load Balancer 仮想サービス作成(デモ)

Avi の操作については、以前の下記投稿にある HCL ファイルを修正してあります。

 

Terraform での処理の概要です。

  • vSphere Provider: デプロイ済みの仮想マシンから、IP アドレスを取得
  • Avi Provider: プール 作成 → VIP 作成 → 仮想サービス 作成

 

ここからの Avi 操作 HCL ファイルは、仮想マシンを作成した HCL ファイルとはディレクトリを分けてあります。

今回の HCL(.tf)ファイルです。

provider.tf

  • L7~10: Avi Provider の指定
  • L21~: Avi Provider の設定(おもに Avi Controller ログイン情報)

gist.github.com

 

main.tf(ファイル名があっていませんが、vSphere Provider を使用している部分)

  • L5~: vsphere_virtual_machine データ ソースで、仮想マシンの情報を取得。ここにゲスト OS の IP アドレスも含まれる。
  • L11: vsphere_virtual_machine に含まれる guest_ip_addresses(IP は複数含まれる。IPv4 だけでなく IPv6 アドレスも) から「192.168.11.」のアドレスを取得して、変数「vm_ip_addr」に格納。
  • L14: 取得した IP アドレス(を格納した変数 vm_ip_addr)を表示。

gist.github.com

 

avi.tf

  • L28: main.tf で変数に格納しておいた IP アドレスを指定(local.vm_ip_addr[0])。ちなみに直接値を指定する場合は L27 のようになる。

gist.github.com

 

terraform init を実行すると、hashicorp/vsphere だけでなく、vmware/avi Provider もダウンロードされます。

gowatana@lab-ph5-01 [ ~/tf-avi ]$ terraform init

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/vsphere from the dependency lock file
- Reusing previous version of vmware/avi from the dependency lock file
- Using previously-installed hashicorp/vsphere v2.7.0
- Using previously-installed vmware/avi v22.1.3

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

 

terraform plan を実行します。

gowatana@lab-ph5-01 [ ~/tf-avi ]$ terraform plan

 

実行結果から、仮想マシンの IP アドレスが取得できることがわかります。

 

terraform apply を実行します。

gowatana@lab-ph5-01 [ ~/tf-avi ]$ terraform apply -auto-approve

 

これで、Avi に仮想サービスが作成されました。プール メンバに 192.168.11.30 のサーバが含まれていることがわかります。


仮想サーバに紐づけられた VIP アドレスにアクセスすると、仮想マシンの Web サーバが提供するページが表示できるはずです。

 

おまけ

Terraform の Avi Provider は、新しい Avi Load Blancer バージョンがリリースされると、わりとすぐにリリースされています。

 

ちょうどさきほど、Avi Load Balancer のセキュリティ脆弱性が公開されていました。

修正バージョンは 30.2.1 とのことですが・・・

 

Avi Provider でも、すでにそのバージョン用のものが公開されています。

 

Terraform での Avi Load Balancer 仮想サービス作成(後日解決編)

登壇時のデモでは、vsphere_virtual_machine リソースで作成した仮想マシンの IP アドレスが State に取得できていませんでした。しかし、よく考えたら参考にした HCL では、空の仮想マシンを作成しているのであえて wait_for_guest_net_timeout = 0 を設定していました。

 

今回はクローン直後に DHCP で IP 設定される仮想マシンをクローンしていたので、wait_for_guest_net_timeout = 0 を指定しなかったところ、ふつうに作成したゲスト OS の IP アドレスが取得できている・・・(今回の仮想マシンだと 192.168.11.51)

gowatana@lab-ph5-01 [ ~/tf-fix ]$ terraform state show vsphere_virtual_machine.vm | grep ip_address -A3
    default_ip_address                      = "192.168.11.51"
    efi_secure_boot_enabled                 = false
    enable_disk_uuid                        = false
    enable_logging                          = false
--
    guest_ip_addresses                      = [
        "192.168.11.51",
        "fe80::250:56ff:fe81:8aa1",
    ]

 

vSphere Client でも、この IP アドレスが確認できます。

 

ということで、仮想マシンをクローンした際の HCL を下記のように修正すると、avi.tf に IP アドレスを渡せました。

  • L43 のあとに記載されていた wait_for_guest_net_timeout = 0 を削除
  • L46 以降の追記(データ ソースであとから IP アドレスを取得しなおさない)

gist.github.com

 

上記の main.tf と、もともと作成していた avi.tf で terraform apply してみると、ちゃんとプール メンバが設定できました。

 

ちなみに、avi.tf で IP アドレスを変数で指定している部分も、IPv4 アドレス設定が 1件であれば、たいていは下記に置き換えられるかもしれません。

addr = vsphere_virtual_machine.vm.default_ip_address

 

以上、Terraform で vSphere と Avi を操作してみる話でした。