Action-Based Extensibility (ABX) 提供一個輕量且彈性的運行引擎 (Run-time engine) 介面,讓我們可以編寫腳本 (腳本語法支援 nodejs、powershell 和python),並設定在指定的事件發生後自動執行腳本。本文主要說明如何利用 ABX Action 在 Windows VM 部署完成後,自動將第二顆硬碟格式化並新增為 E 磁碟
Blueprint 設計 & 調整
這個藍圖的目的是讓使用者自行輸入 E 磁碟空間大小,依據輸入磁碟的空間大小判斷是否要掛接第二顆硬碟給虛擬機。首先,在藍圖設計中新增一個型態為 integer 的 Cloud Template Inputs,本例命名為 Disk_Size
接著,拖拉 vSphere Disk 元件到藍圖中,但先不要把 Disk 與 Virtual Machine 連接。最後 YAML Code 需要在 vSphere Disk 和 vSphere Machine 的部分做調整
- vSphere Disk 部份:
- ${input.Disk_Size} 用來接收使用者輸入的 Disk 空間大小
- ${input.Disk_Size==0? 0:1} 用來判斷是否要新增 Disk,如果輸入的空間大小 = 0,部署出來的 VM 就不會多一顆硬碟
- vSphere Machine 部分:
- attachedDisks: '${map_to_object(resource.Cloud_vSphere_Disk_1[*].id, "source")}' 這樣子的寫法就不會直接掛接 vSphere Disk,而是有硬碟才會掛接
最後,藍圖會如下圖所示:
建立 ABX Actions
在 Cloud Assembly→Extensibility→Library→Actions,新增 Action。本例命名為 PostConfig
設定 Action Constants,將 vc 和 windows 範本的密碼加密儲存在 vRA 裡,之後編寫 Actions 腳本時可以運用。在 Cloud Assembly→Extensibility→Library→Actions,點選 Action Constants
編寫 Powershell 腳本,流程大致上是:取得部署出來的 VM→建立 Session 登入到 VC→檢查 VM GuestOS→如果是 "Windows Guest",執行 Script 將第二顆硬碟格式化並新增為 E 磁碟→關閉 Session
Powershell 語法如下:
function handler($context, $inputs) {
$vmName = $inputs.resourceNames[0]
# get vc pwd
$vc_pwd = $context.getSecret($inputs."vCenterPassword")
Connect-ViServer -Server '172.26.93.11' -User "administrator@vsphere.local" -Password $vc_pwd -Force
# get osType
$osType = (Get-VM -Name $vmName).Guest.GuestFamily.ToString()
if($osType.Equals("windowsGuest")) {
Write-Host " $vmName is a $osType "
# Create a script that can be run on the vm to initialize/format the disk
$script = '$disk = get-disk | ? {$_.PartitionStyle -eq "Raw"} | select -first 1;'
$script += 'initialize-disk -inputobject $disk;'
$script += '$p = new-partition $disk.number -UseMaximumSize -AssignDriveLetter:$false;'
$script += '$p | Format-Volume -FileSystem NTFS -Confirm:$false;'
$script += '$p | Set-Partition -NewDriveLetter "E"'
# get winsrv pwd
$winsrv_pwd = $context.getSecret($inputs."TemplateWinsrvPassword")
# Invoke the script on the vm
Invoke-VMScript -VM $vmName -ScriptText $script -GuestUser administrator -GuestPassword $winsrv_pwd
}
Disconnect-ViServer -Server '172.26.93.11' -Force -Confirm:$false
}
訂閱 (Subscription)
ABX Actions 需要搭配訂閱事件才能運作,意思是當環境中發生訂閱的事件時,指派要執行哪一個 ABX Actions。
Cloud Assembly 已經有許多預設定義的事件主題
透過事件紀錄檢視部署流程會觸發哪些事件主題,並從中選取特定事件來觸發 ABX Action
在本例,設定當「Compute post provision」事件發生,執行 PostConfig Actions
最後,發起部署請求並確認部署完成後是否有成功執行 ABX Action。在 Extensibility→Activity→Action Runs 可以所有 Action Runs 紀錄
點選 Action 進去可以看到每一個 Action Runs 的詳細資訊與 log 紀錄
直接登入到自動部署的 VM,確認是否有自動掛載 E 磁碟
沒有留言:
張貼留言