# 使用 CLI 部署 vCenter Server Appliance
###### tags: `vmware` `vcsa` `cli`
[toc]
大多數 vCenter Server Appliance(vCSA) 部署安裝都是使用 [GUI 方式](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vcenter.install.doc/GUID-477E5C38-2AA8-4319-B2C6-41671570AD27.html)。使用 GUI 部署雖然輕鬆,但是要完成整個 vCSA 部署需要達成 **2 個階段**:
- **階段1 - OVA 部署**
- **階段2 - 應用裝置設定**
佈署過程也是需要根據精靈提示提供部署和設定資訊的,如果 vCSA 需要重新安裝或調整時,同樣的設定資訊,就需要**手動輸入**完成。既然如此,不如將這些**設定資訊**儲存作為**組態範本**,透過**讀取設定**進行**自動安裝**過程。
這樣一來,同樣的組態參數不會因為手殘輸入錯誤,另一方面也可作為組態備份使用。若要調整部份設定,直接修改組態檔來安裝,也可提昇建置效率。尤其是 LAB 環境需要部署多部 vCSA。
以上的需求目標正好以 **VMware 官方 CLI 安裝程式**可以達成,不用特別使用 OVFTool 部署 OVA,另外寫自動化腳本來完成設備組態。
:::info
取得進一步 vCSA 部署資訊,請參考 [[**部署 vCSA 必要條件**]](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vcenter.install.doc/GUID-8F62E118-4805-4B0A-904C-C561C1A692E7.html)。
:::
# CLI 佈署方式
**CLI 部署**方式包括 2 個部份:
- **佈署設定的 JSON 檔**: 部署 vCSA 所需的組態資訊。
- **執行 CLI 命令**: 提供自動部署及設定 vCSA 裝置的命令。
CLI 部署會**自動**依序執行 **階段1 - OVA 部署** 和 **階段2 - 應用裝置設定** ,與使用者**不需要進行互動**。
# 準備工作
## 作業系統需求
目前 VMware vCSA 安裝程式可以支援 **Windows** / **Mac** / **Linux**,選擇自己常用的作業系統即可,這裡我就選擇使用 **Linux(Fedora)** 囉。
相關支援系統需求可參考[[**連結**]](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vcenter.install.doc/GUID-BA4FA18C-1049-42AA-A5CD-DE863565251B.html)。
## 下載安裝 ISO
使用有效帳戶登入 [**Customer Connect**](https://my.vmware.com/web/vmware/),下載 vCSA 安裝程式 ISO 檔案。
> 7.0U3K 安裝 ISO 檔案: **`VMware-VCSA-all-7.0.3-21290409.iso`**

下載完畢使用網頁提供 MD5SUM/SHA256SUM 工具驗證檔案完整性。<font color=red><< **務必確認**</font>

## 掛載安裝程式
目前 GNOME Files 可以直接選取 ISO 檔後使用 Disk IMage Mounter 直接掛載使用。
<img width=540 src='https://i.imgur.com/9wTWCAs.png'><br>
也可使用以下命令掛載。
```bash
$ sudo mkdir -p /mnt/vcsa
$ sudo mount -o loop VMware-VCSA-all-7.0.3-21290409.iso /mnt/vcsa
```
### 讀我檔案
確認掛載正確後,在其根目錄中開啟讀我檔案(README),目前有中文版本(readme-zh-TW.txt)。
<img width=480 src='https://i.imgur.com/QAYJcwW.png'><br><br>
檢閱其中 **vCSA ISO 檔案和目錄**的相關資訊。
| 目錄 | 說明 |
| --- | --- |
| **/vcsa** | **vCenter Server Appliance 資料檔案** |
| /vcsa-ui-installer | vCenter Server Appliance GUI 安裝程式 |
| **/vcsa-cli-installer** | **vCenter Server Appliance CLI 安裝程式** |
| /migration-assistant | vCenter Server Migration Assistant |
### 檔案架構
- 系統平台類型分別在目錄中以 **win32** / **mac** / **lin64** 資料夾作為區別。
- **vcsa** 目錄,主要包含 **vCSA OVA 檔案** 和 **OVFTool 工具**。
```bash
vcsa
├── ovftool
│ ├── lin64
│ ├── mac
│ └── win32
├── version.txt
└── VMware-vCenter-Server-Appliance-7.0.3.01300-21290409_OVF10.ova
```
- **vcsa-cli-installer** 目錄
- 依據支援的作業平台提供 CLI 安裝程式。
- CLI 安裝程式檔案名稱為 **`vcsa-deploy`**。
- Linux, 64-bit: `lin64/vcsa-deploy`
- Mac OS X: `mac/vcsa-deploy`
- Windows: `win32/vcsa-deploy.exe`
- 部署(Install) 使用的 **JSON 組態檔範本** 存放於 **templates/install** 目錄。
```bash
vcsa-cli-installer
├── lin64
│ └── vcsa-deploy
├── mac
├── README.txt
├── templates
│ ├── install
│ │ ├── embedded_vCSA_on_ESXi.json
│ │ ├── embedded_vCSA_on_VC.json
│ │ ├── embedded_vCSA_replication_on_ESXi.json
│ │ ├── embedded_vCSA_replication_on_VC.json
│ │ └── vCSA_with_cluster_on_ESXi.json
│ ├── migrate
│ └── upgrade
├── template_schemas
│ ├── install
│ ├── migration
│ └── upgrade
└── win32
```
## JSON 組態範本
### 範本類型
在 **vcsa-cli-installer/templates/install** 目錄中,存放不同部署 vCSA 類型的 JSON 組態範本檔案。vCSA CLI 部署執行程式將透過 JSON 組態檔取得配置及部署參數。組態範本僅包含常用預設參數,可透過以下命令查看完整範本選項或參考 [[部署組態參數]](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vcenter.install.doc/GUID-457EAE1F-B08A-4E64-8506-8A3FA84A0446.html#GUID-457EAE1F-B08A-4E64-8506-8A3FA84A0446)。
```bash
$ lin64/vcsa-deploy install --template-help
```
其中 JSON 組態範本檔名稱規則:
- **`embedded_VCSA_on_*.json`**: 部署 Platform Services Controller (PSC) 和 VCSA 的整合系統。
> 目前 vCSA 都是屬於此種類型。
- **`VCSA_on_*.json`**: 僅部署 vCSA。
- **`*_on_ESXi.json`**: 部署 vCSA 至指定的 ESXi 主機上。
- **`*_on_VC.json`**: 部署 vCSA 至 vCenter 管理的 ESXi 主機上。
### 部署範本
包含在 vCenter Server 安裝程式中的**部署 JSON 範本**
| 範本 | 說明 |
| --- | --- |
| **embedded_vCSA_on_ESXi.json** | 包含在 ESXi 主機上部署 vCenter Server Appliance 所需的最低組態參數。 |
| **vCSA_with_cluster_on_ESXi.json** | 包含在 ESXi 主機上部署 vCenter Server Appliance 以及單一節點 vSAN 和 vLCM 管理叢集所需的最低組態參數。 |
| **embedded_vCSA_on_VC.json** | 包含在 vCenter Server 執行個體上部署 vCenter Server Appliance 所需的最低組態參數。 |
| **embedded_vCSA_replication_on_ESXi.json** | 包含在 ESXi 主機上部署 vCenter Server Appliance 做為另一個內嵌式 vCenter Server 之複寫合作夥伴所需的最低組態參數。 |
| **embedded_vCSA_replication_on_VC.json** | 包含在 vCenter Server 執行個體上將 vCenter Server Appliance 複寫合作夥伴部署至另一個 vCenter Server Appliance 所需的最低組態參數。 |
:::warning
**執行 vCSA CLI 安裝程式前,必須針對部署類型準備帶有組態參數值的 JSON 檔**。
:::
### 編輯 JSON 組態檔
為確保 JSON 組態檔的語法正確,請使用支援 JSON 語法編輯器進行 JSON 組態檔內容編修。
:::warning
**注意**
- JSON 組態檔內容語法必須正確,否則部署過程會失敗。
- JSON 組態檔存放路徑名稱僅能包含 ASCII 字元。
- 組態參數可根據部署需求增減所需參數值。
- 若設定值包含反斜線(\)或引號(")字元,必須在字元前加上反斜線(\)可逸出字元。
- 布林值(Boolean)僅包含小寫字元。例: **`"ssh_enable":false`**
- 以 UTF-8 格式儲存檔案。
:::
#### embedded_vCSA_on_ESXi.json 組態範本

- **`__version`**: 標示搭配部署 vCenter 的組態檔版本。
- **`__comments`**: 組態檔參數備註說明。
- **`new_vcsa`**: 描述所部署的 vCSA 相關組態。
- **`esxi`**: 在 ESXi 主機直接部署 vCSA 使用。
- 此範例為不具 vSAN 和 vLCM 管理叢集的部署。
- **`appliance`**: 描述 vCSA 應用裝置的組態參數。
- **`deployment_option`**: 指定 vCSA 應用裝置的部署規模。將會根據選擇部署規模配置對應應用裝置的運算資源。
- **`name`**: 描述 vCSA 應用裝置的**虛擬機器名稱**。
- **`network`**: 描述 vCSA 應用裝置網路設定的組態參數。
- **`ip_family`**: 提供 `ipv4` 和 `ipv6`。
- **`mode`**: IP 指派方式,提供 `static` 和 `dhcp`。
- **`dns_servers`**: 描述一個或多個 DNS 伺服器的 IP 位址。該選項在 **`mode=static`** 時可用。
- 設定多個 DNS 伺服器可採用以下格式
- ["192.168.1.1", "192.168.1.2"] (**建議**)
- "192.168.1.1, 192.168.1.2"
- **`system_name`**: 主要 vCSA 應用裝置的網路身份識別。可以是 **IP** 或 **FQDN(建議)**。
- <font color=red>部署後無法變更此參數值</font>。
- **`os`**: 描述 vCSA 應用裝置作業系統的組態參數。
- **`password`**: vCSA 應用裝置作業系統的 **`root`** 使用者密碼。
- **`ntp_servers`**: 一個或多個 NTP 伺服器的主機名稱或 IP 位址。
- 設定多個 NTP 伺服器格式,與上述設定多個 DNS 伺服器相同。
- **`ssh_enable`**: 設定 `true`,以便使用 SSH 連線登入應用裝置。
- **`sso`**: 描述 vCSA 應用裝置 vCenter Single Sign-On 設定的組態參數。
- **`password`**: vCenter Single Sign-On 管理員使用者 **`administrator@domain_name`** 的密碼。
- **`domain_name`**: vCenter Single Sign-On 網域名稱。預設為 `vsphere.local`。
- **`ceip`**: 描述加入 VMware 客戶經驗改進計畫的組態參數。
- **`ceip_enabled`**: 設定是否要入客戶經驗改進計畫。
以下是根據組態範本編寫出的 JSON 組態檔。
```json=
{
"__version": "2.13.0",
"__comments": "Deploy a vCenter Server Appliance on an ESXi host.",
"new_vcsa": {
"esxi": {
"hostname": "192.168.1.1",
"username": "root",
"password": "VMware1!",
"deployment_network": "VM Network",
"datastore": "shared_datastore"
},
"appliance": {
"thin_disk_mode": true,
"deployment_option": "small",
"name": "vcsa7"
},
"network": {
"ip_family": "ipv4",
"mode": "static",
"ip": "192.168.1.100",
"dns_servers": ["192.168.1.10"],
"prefix": "24",
"gateway": "192.168.1.254",
"system_name": "vcsa7.khdc.lab"
},
"os": {
"password": "VMware1!",
"ntp_servers": ["216.239.35.0,216.239.35.4"],
"ssh_enable": true
},
"sso": {
"password": "VMware1!",
"domain_name": "vsphere.sso",
"first_instance": true
}
},
"ceip": {
"description": {},
"settings": {
"ceip_enabled": true
}
}
}
```
:::info
詳細參數說明,請參考原廠文件 [[**部署組態參數**]](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vcenter.install.doc/GUID-457EAE1F-B08A-4E64-8506-8A3FA84A0446.html)。
:::
### 組態產生器
既然大多數 vCSA 的配置環境都差不多,每次都要編輯 JSON 檔又要擔心語法格式問題,還不如將這些**參數值**放在**設定文件檔**,之後編修參數只要修改這裡的參數**值**就好,寫個簡單的程式透過變數替換成修改的參數值。
#### vcsa.conf
```bash=
## create json for vcsa 7 installation
esxi_hostname="192.168.1.1"
esxi_username="root"
esxi_password="VMware1!"
esxi_deployment_network="VM Network"
esxi_datastore="shared_datastore"
esxi_port=""
appliance_thin_disk_mode="true"
## tiny, tiny-lstorage, tiny-xlstorage
## small, small-lstorage, small-xlstorage
## medium, medium-lstorage, medium-xlstorage
## large, large-lstorage, large-xlstorage
## xlarage, xlarge-lstorage, xlarge-xlstorage
appliance_deployment_option="tiny"
appliance_name="vcsa7"
network_ip_family="ipv4"
network_mode="static"
network_ip="192.168.1.100"
network_dns_servers="192.168.1.10"
network_prefix="24"
network_gateway="192.168.1.254"
network_system_name="vcsa7.khdc.lab"
os_password="VMware1!"
os_ntp_servers="192.168.1.10"
os_ssh_enable="true"
os_time_tools_sync="true"
sso_password="VMware1!"
sso_domain_name="vsphere.sso"
sso_site_name="KHLAB"
sso_first_instance="ture"
ceip_ceip_enabled="true"
```
組態產生器的程式其實很簡單!
主要先確認 JSON 語法格式沒有問題,再把參數值用變數替換。接著透過讀入設定文件檔 **`vcsa.conf`**,取得相關變數的參數值帶入,將轉換結果儲存成 JSON 組態檔 **`vcsa.json`** 就大功告成了!
#### configMaker.sh
```bash=
#!/bin/bash
wrjsonconf7_esxi () {
cat << EOF > ${vcsaJsonFile}
{
"__version": "2.13.0",
"__comments": "Deploy a vCenter Server Appliance on an ESXi host.",
"new_vcsa": {
"esxi": {
"hostname": "${esxi_hostname}",
"username": "${esxi_username}",
"password": "${esxi_password}",
"deployment_network": "${esxi_deployment_network}",
"datastore": "${esxi_datastore}"
},
"appliance": {
"thin_disk_mode": ${appliance_thin_disk_mode},
"deployment_option": "${appliance_deployment_option}",
"name": "${appliance_name}"
},
"network": {
"ip_family": "${network_ip_family}",
"mode": "${network_mode}",
"system_name": "${network_system_name}",
"ip": "${network_ip}",
"prefix": "${network_prefix}",
"gateway": "${network_gateway}",
"dns_servers": "${network_dns_servers}"
},
"os": {
"password": "${os_password}",
"ntp_servers": "${os_ntp_servers}",
"ssh_enable": ${os_ssh_enable}
},
"sso": {
"password": "${sso_password}",
"domain_name": "${sso_domain_name}",
"first_instance": ${sso_first_instance}
}
},
"ceip": {
"description": {},
"settings": {
"ceip_enabled": ${ceip_ceip_enabled}
}
}
}
EOF
}
if [[ $# -eq 1 ]]; then
configFile=$1
source ${configFile}
vcsaJsonFile="$(basename ${configFile} .conf).json"
wrjsonconf7_esxi
echo -e ">> 產生vcsa7 JSON組態檔: ${vcsaJsonFile}\n"
cat ${vcsaJsonFile}
echo ""
else
echo -e " <!> 請提供vCenter 7.0組態檔 <!>\n"
exit
fi
```
**執行結果**
<img width=480 src='https://i.imgur.com/eFX6Vat.png'><br>
這樣就會產生跟先前手動編輯的 JSON 組態檔內容一樣的檔案。之後若是有需要在不同環境部署 vCSA,也只要先修改 conf 設定檔,不用擔心手動編修 JSON 產生語法格式問題。
:::warning
若是要部署不同版本 vCSA 應用裝置,JSON 組態檔或許有些許不同,請根據安裝 ISO 提供的組態檔範本,再次編修 **`configMaker.sh`** 中的組態轉換函式 `wrjsonconf7_esxi ()`。
:::
# 進行部署
完成部署的 JSON 組態檔後,接著要透過 **`vcsa-deploy`** 的 CLI 部署命令來完成 vCSA 應用裝置的自動部署及設定。
## vcsa-deploy 部署命令
### 取得命令幫助
```bash
vcsa-deploy -h|--help
```

:::info
vcsa-deploy 執行完成後,命令**結束代碼(exit code)** 說明。
0: 已成功執行命令
1: 執行階段錯誤
2: 驗證錯誤
3: 範本錯誤
:::
### 取得支援部署規模
```bash
vcsa-deploy --supported-deployment-sizes
```

### 取得安裝部署幫助
```bash
vcsa-deploy install --help
```

### 取得 JSON 組態檔參數說明
```bash
vcsa-deploy install --template-help
```

#### 選用參數(Optional Arguments)
使用 `optional_arguments` 來輸入選用的參數,並以空格作為區隔,以便部署命令執行選用參數。
例: 設定安裝程式的記錄檔和其他輸出檔案的存放位置。
```bash!
vcsa-deploy install --accept-eula --acknowledge-ceip \
--log-dir=path_to_the_location path_to_the_json_file
```
- **`--accepr-eula`**: 同意使用者授權。
- **`--acknowledge-ceip`**: 當 JSON 組態檔配置 `ceip.enabled=true` 時需要。
- **`--skip-ovftool-verification`**: 對 JSON 組態檔的組態參數執行驗證,並進行部署。但不對 OVF 工具參數執行驗證。
- **`--no-esx-ssl-verify`**: 略過 ESXi 連線的 SSL 驗證。
- **`--no-ssl-certificate-verification`**: 略過所有伺服器連線的安全性憑證驗證。
- **`--verify-template-only`**: 對 JSON 組態檔的參數執行範本驗證,並不進行部署。
- **`--precheck-only`**: 僅執行範本驗證與 OVF 工具參數驗證,並不進行部署。
:::info
詳細 CLI 部署命令的用法,請參考原廠文件 [[**CLI 部署命令語法**]](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vcenter.install.doc/GUID-15F4F48B-44D9-4E3C-B9CF-5FFC71515F71.html)。
:::
## 部署程序
### 再次確認
- [X] 根據部署環境需求完成 **JSON 組態檔**。
- [X] 確認**安裝 ISO 檔掛載**正常。
- [X] 並務必確認部署環境中能正常提供 **DNS 和 NTP 服務**。
:::danger
**注意**
- 執行 `vcsa-deploy` CLI 部署命令的作業系統設備,也務必要確認能正確解析 vCSA 應用裝置及部署環境的 FQDN。
- 虛擬環境部署的成功要素:**DNS 和 NTP 服務**。
:::
### 執行任務
1. 切換至作業系統的 **`vcsa-cli-installer`** 子目錄。
2. (選擇性)先不部署應用裝置,只是執行部署前的檢查,以確認部署範本正確性。
- 針對 JSON 組態檔進行基本檢驗。
```bash
vcsa-deploy install --accept-eula --verify-template-only --log-dir <log_dir> <path_to_the_json_file>
```
- 對於部署進行更深入的驗證,包含檢查用於 vCSA 配置的 IP 和名稱、SSO 域名和 DNS 服務。
- 包含 JSON 組態檔進行基本驗證。
- 確認 DNS 配置正確,且能正確解析應用裝置的 FQDN。
```bash
vcsa-deploy install --accept-eula --no-ssl-certificate-verification --precheck-only --log-dir <log_dir> <path_to_the_json_file>
```
若有發生錯誤,請根據顯示訊息進行組態參數及部署環境調整。以下訊息似乎是部署目標的 ESXi 主機所給定的組態參數有問題!

相關的訊息紀錄都會儲存至指定目錄。
<img width=360 src='https://i.imgur.com/5SaJw0v.png'><br>
3. 執行部署命令。
如果上述驗證都沒有發生問題,相信一切應該都可以順利進行,就可以啟動部署發射!:coffee:
- 完整的部署命令執行時,也會包含先前 JSON 組態檔的基本驗證和部署驗證。
- 只要先前驗證沒有問題,部署階段就會按照給予的組態參數自動化完成。
```bash!
$ bash ./vcsa-deploy install --accept-eula --acknowledge-ceip --no-ssl-certificate-verification --log-dir <log_dir> <path_to_the_json_file>
```
表示 vCSA 部署程式已經開始第一階段的應用裝置部署。

完成第一階段應用裝置安裝,接著會開始進行第二階段的 vCSA 設定及相關套件安裝,請耐心等候。
> VCSA Deployment is still runing

當出現 vCSA 登入資訊時,表示部署程式即將告一段落!

恭喜,再次完成 vCSA 部署作業。到此為止,已經可以開始使用瀏覽器連線 vCSA 進行後續環境管理。
### 監控及除錯
若在部署時需要即時監控部署狀態,或遇到問題需要故障排除,可在指定的日誌目錄下透過檢視以下幾個紀錄檔達成。
- vcsa-cli-installer.log: 提供部署程式命令執行紀錄資訊。
- workflow.log: 提供部署整體工作流程紀錄資訊。
- taskflow.log: 提供部署時任務執行內容紀錄資訊。
- ovftool.log: 提供 OVF 工具執行內容紀錄資訊。
- ovftool_config.cfg: 部署時 OVF 工具產生的配置暫存檔。
研究 **`vcsa-cli-installer.log`** 日誌檔,也是可以學習到 OVF 工具命令及參數的使用方式!

# 結論
從以上的測試,應可發現 **vCSA CLI 安裝程序是部署 vCenter 應用裝置的一大利器**。只要有了一份撰寫成功的的 JSON 組態檔,管理者就可以使用命令 **`vcsa-deploy`** 輕鬆地部署 vCenter 應用裝置,而且所使用的 JSON 組態檔也可作為該部署設定的配置備份歸檔。
雖然 vCenter 在生產應用環境下,系統管理者大多不太需要時常變動及部署。但若是技術專家或是測試環境建置,或許使用此方式可以帶來一點**省時和省心**的優點,即便是目前最新版本 vSphere 8,套用現在的 JSON 組態檔也是可以輕鬆達成任務的。
其實以整體部署流程思考,也只要撰寫自動掛載 ISO 安裝檔並自動套用 JSON 組態檔的腳本程式,也就能自動部署一台或多台 vCSA 應用裝置了!
# 參考
[vCenter Server Appliance 的 CLI 部署](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vcenter.install.doc/GUID-C17AFF44-22DE-41F4-B85D-19B7A995E144.html)
[](https://stephanmctighe.com/2021/01/27/deploying-vcenter-7-0-via-the-cli/)
[](https://www.vgemba.net/vmware/VCSA-CLI-Install/)
[](https://vmwaretv.vmware.com/embed/secure/iframe/entryId/1_dmbvxgkj/uiConfId/50138843/)