【Equinix Metal/BMaaS】vSphere/vSAN環境をTerraformで一撃デプロイ①

VMwareのSDS(Software Defined Storage)ソリューションである**vSAN**で構成されたvSphereクラスタを、**Equinix Metal**のBMaaS(Baremetal as a Service)上に構築してみました。

Terraformを利用する事で、**約1時間でvSAN構成のvSphereクラスタを一撃デプロイ**できます。

vSAN、Equinix Metalについては以下リンクを参照ください。
**・[VMware Virtual SAN 入門： 〜 従来のストレージと VSAN の違い〜](https://blogs.vmware.com/vmware-japan/2015/11/vsan_01.html)**
**・[Equinix Metal](https://metal.equinix.com/)**

====

* [第１回　概要・事前準備編](https://qiita.com/ktsuruta_eq/items/6209639166bea7705bdf)　★本記事
* [第２回　terraform設定編](https://qiita.com/ktsuruta_eq/items/614ac993b3dea0d50b08)
* [第３回　デプロイ編](https://qiita.com/ktsuruta_eq/items/2e6327438bd35dfa6625)

====

今回は、デプロイされる環境/デプロイ仕様の解説と事前準備を行います。

## 環境構成図

![EsXi_EM-terraform_rev-Terraform_vsphere-working.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1662665/b6ce67fc-f335-ab6a-1a4c-2184629847d6.png)


## 環境仕様・デプロイの流れ
構成図の赤点線範囲がTerraformにより構築される部分です。
事前にMinIO用サーバをEquinix Metal環境に構築し、Edge-gateway(ゲートウェイノード)と通信できる状態にしておきます。

MinIOにはバケットを作成し、vCenterのISOファイルとvSAN管理用PythonSDKを配置します。
※MinIOサーバはデプロイ用資材置き場になっているだけなので、デプロイ完了後は削除しても構いません。

Terraformのデプロイ処理を開始すると、各サーバのデプロイに加えてゲートウェイノードに流し込まれたインストールスクリプトにより、ESXiノードのプロビジョニング、vCenterアプライアンスのデプロイとvSphereクラスタ構成、vSAN構成まで一貫して構築してくれます。

デプロイ後は、ゲートウェイノード経由でパブリックNWに公開されたvCenter(vSphereクライアント)の操作が可能です。
vCenter/ESXiノードのメンテナンスについては、ゲートウェイノードを踏み台にする or L2TP/IPsecVPNを利用して各ホストへSSH接続する必要があります。

なお、今回作成するvSphere/vSAN環境は動作確認用の環境です。
高度な冗長性・セキュリティ面の考慮・調整は特に行っていません。予めご了承ください

## vSphereクラスタのスペック
デプロイ後に作成されるクラスタのスペックは以下の通りです。
ESXiホストの台数はTerraform変数ファイルを変更することで増減できますが、vSAN最小構成要件である[ESXiホスト3台]とした場合の数値になります。

|EsXiホストの数|物理CPU|物理メモリ|データストア|
|:--:|:--:|:--:|:--:|
|3台|72コア|192GB|各ホスト:95GB×3、vSAN:キャパシティ2620GB,キャッシュ670GB|

## 作業環境、Ver、必要なもの等

* 作業用PC 
  * terraform：0.14.8 
    * metal(provider):1.1.0
    * terraform-metal-vsphere(module):2.3.0
  * git:2.30.0
  * L2TP/IPSec VPNクライアント(VPN経由で接続する場合に必要)
* vCenter/vSAN構成用の資材 ※MyVMwareからDL
  * vCenterインストール用ISOファイル、Ver 7.0 U1 build17491101
  * vSAN管理用PythonSDK
* Equinix Metalアカウント
  * APIトークン　※ポータルで発行してください。
  
また、本記事の作業で作成されるMetalサーバは以下の通りです。

|サーバクラス|台数|物理CPU|物理メモリ|ストレージ|用途|
|:--:|:--:|:--:|:--:|:--:|:--:|
|c3.small.x86|2|8コア|32GB|480GB×2|MinIO用×1,ゲートウェイノード用×1|
|c3.medium.x86|3|24コア|64GB|(boot用)240GB×2,480GB×2|ESXiノード用×3|

Metalサーバクラスの詳細スペックについては、公式ページをご確認ください。

**[Bare Metal Servers - Equinix Metal](https://metal.equinix.com/product/servers/)**

## 参考資料

Equinix MetalがメンテしているGithubリポジトリのガイダンスに沿って作業を進めます。

https://github.com/equinix/terraform-metal-vsphere

## 事前準備

### 0. terraform インストール

公式手順は↓のリンク参照。　筆者はWindows10+WSL(ubuntu)にインストールして使っています。
[Install Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli)
### 1. terraformモジュール一式を作業用端末へDL(git clone)する

作業用端末に、GithubリポジトリのTerraformモジュール一式をDLします。
フォルダのファイル構成は以下の通りです。各ファイルは次回編集していきます。

````
$ git clone -b v2.2.0 https://github.com/equinix/terraform-metal-vsphere.git 
$ cd terraform-metal-vsphere
$ tree                              
.
├── LICENSE
├── README.md
├── crash.log
├── main.tf
├── outputs.tf
├── scripts　
│   └── get_vcenter_ip.py
├── templates　
│   ├── deploy_vcva.py
│   ├── download_vcenter.sh
│   ├── esx_host_networking.py
│   ├── extend_datastore.sh
│   ├── l2tp_vpn.sh
│   ├── pre_reqs.py
│   ├── update_uplinks.py
│   ├── vcva_template.json
│   └── vsan_claim.py
├── variables.tf
└── versions.tf
````
### 2. Metal環境に、MinIO用サーバデプロイ＋MinIOインストール

デプロイ先と同じDCに、MinIO用サーバをデプロイします。
デプロイ後、以下ドキュメントを参考にインストールします。

[MinIOを使用したオブジェクトストレージ](https://metal.equinix.com/developers/docs/guides/minio/)

忙しい人のためにMinIOインストール用のUserDataを用意していますので、こちらをご利用ください。
Ubuntu18.04サーバデプロイ時のUserDataに入力すると、"http://[サーバのグローバルIP::9000"でアクセス可能な状態でMinIOがインストールされます。

````
#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
package_upgrade: true
write_files:
-  content: |
     MINIO_ACCESS_KEY="minio"
     MINIO_VOLUMES="/usr/local/share/minio/"
     MINIO_OPTS="-C /etc/minio --address MinIO_GIP:9000"
     MINIO_SECRET_KEY="miniostorage"
   path: /etc/default/minio
   owner: minio-user:minio-user
   permissions: '0644'
runcmd:
  - curl -O https://dl.minio.io/server/minio/release/linux-amd64/minio
  - sleep 5
  - chmod +x minio
  - useradd -r minio-user -s /sbin/nologin
  - chown minio-user:minio-user minio
  - mkdir /usr/local/share/minio
  - mkdir /etc/minio
  - sleep 1
  - chown minio-user:minio-user /usr/local/share/minio
  - chown minio-user:minio-user /etc/minio
  - mv minio /usr/local/bin/.
  - mkdir /opt/minio-data
  - sleep 1
  - chown minio-user:minio-user /opt/minio-data
  - curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service 
  - sleep 5
  - mv minio.service /etc/systemd/system/.
  - SV_GIP=`curl inet-ip.info`
  - sed -i -e "s/MinIO_GIP/$SV_GIP/" /etc/default/minio
  - systemctl daemon-reload
  - systemctl enable minio
  - systemctl start minio

````

### 2. MinIOへバケット作成

MinIOサーバへログイン後、MinIO用クライアントのmcコマンドをDLしてバケットを作成します。
※ブラウザ経由でMinIOへアクセスしてバケット作成してもOKです。

````
[mcコマンドDL、設定]
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc
$ ./mc alias set localhost http://[serverのGIP]:9000
 Enter Access Key: minio
 Enter Secret Key: miniostorage
 Added `localhost` successfully.

[mcコマンドでバケット作成]
$ ./mc mb localhost/vmware
Bucket created successfully `localhost/vmware`.
````

作業後、vmware という名称のバケットと、サーバ上のディレクトリが作成されたことを確認します。

````
$ ./mc ls localhost |grep vmware
[2021-03-12 00:42:36 JST]     0B vmware/

````

### 3. vCenter,vSAN構成用のファイルをバケットに配置する

[参考サイト](https://github.com/equinix/terraform-metal-vsphere#upload-files-to-your-object-store?target=_blank)に記載があるように、MyVMwareからvCenterISOファイル、vSAN管理用SDKファイルを入手します。
取得後、前の手順で構成したバケット内に、以下構成でファイルを配置します。

```
オブジェクトストア ルート：
    | 
    | __ vmware
 
        | 
        | __ VMware-VCSA-all-7.0.1-17491101.iso 
        | 
        | __ vsanapiutils.py 
        | 
        | __ vsanmgmtObjects.py
```

ブラウザ経由でGUIから配置したい場合は、  http://[serverのGIP]:9000 にアクセスしてください。
※デプロイ時に設定したアクセスキー/シークレットキーを利用してログインする必要があります。

配置後、以下画像の状態になっていればOKです。![vSAN_MinIO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1662665/a92e3c75-143e-3612-d41e-265e47abcaa4.png) 

---
事前準備は以上になります。
次回はterraform実行前の変数ファイル等を編集していきます。