| Works
vCloud Director (API) からEdgeゲートウェイを再デプロイする
仕事で使っているvCloud Directorで、多数のEdgeゲートウェイを再デプロイすることになりそう。
そんなこともあって、スクリプト化して手作業を少なくしたいといういつもの動機。
とりあえず1つのEdgeゲートウェイを「再デプロイ」して、念のため「サービス構成の再適用」も実行する。
スクリプトを変更しないで使い回せるように、対象の組織/仮想データセンター/Edgeゲートウェイの組み合わせは引数で指定。
例によって実行環境はWindowsなので、PowerShellを使う。
Param (
[Parameter(Mandatory = $True, HelpMessage="Target Organization Name")][alias("org","o")][ValidateNotNullOrEmpty()][string]$OrgName,
[Parameter(Mandatory = $True, HelpMessage="Target Virtual Datacenter Name")][alias("vdc","v")][ValidateNotNullOrEmpty()][string]$VdcName,
[Parameter(Mandatory = $True, HelpMessage="Target Edge Gateway Name")][alias("edge","e")][ValidateNotNullOrEmpty()][string]$EdgeName
)
# vCloud Director
$VcdUser = "administrator"
$VcdPass = "password"
$ApiEp = "https://vcloud.example.com/api"
$ApiVer = "5.5"
# Authentication
$Auth = $VcdUser + "@system:" + $VcdPass
$Encoded = [System.Text.Encoding]::UTF8.GetBytes($Auth)
$EncodedPassword = [System.Convert]::ToBase64String($Encoded)
$SendUri = $ApiEp + "/sessions"
$Headers = @{
"Authorization" = "Basic " + $EncodedPassword;
"Accept" = "application/*+xml;version=$ApiVer"
}
$Res = Invoke-WebRequest -Headers $Headers -Uri $SendUri -Method POST
$VcdAuth = $Res.Headers["x-vcloud-authorization"]
$Headers = @{
"x-vcloud-authorization" = $VcdAuth;
"Accept" = "application/*+xml;version=$ApiVer"
}
# Main Routine
$SendUri = $ApiEp + "/org"
$Res = Invoke-RestMethod -Headers $Headers -Uri $SendUri -Method GET
foreach ($objOrg in $Res.OrgList.Org) {
if ($objOrg.Name -eq $OrgName) {
$OrgUri = $objOrg.href
}
}
$Res = Invoke-RestMethod -Headers $Headers -Uri $OrgUri -Method GET
foreach ($objLink in $Res.Org.Link) {
if ($objLink.Name -eq $VdcName) {
$VdcUri = $objLink.href
}
}
$SendUri = $ApiEp + "/query?type=edgeGateway&format=records&filter=vdc==" + $VdcUri
$Headers = @{
"x-vcloud-authorization" = $VcdAuth;
"Accept" = "application/*+xml;version=$ApiVer";
}
$Res = Invoke-RestMethod -Headers $Headers -Uri $SendUri -Method GET
foreach ($objEdge in $Res.QueryResultRecords.EdgeGatewayRecord) {
if ($objEdge.Name -eq $EdgeName) {
$EdgeUri = $objEdge.href
}
}
$SendUri = $EdgeUri + "/action/redeploy"
$Res = Invoke-RestMethod -Headers $Headers -Uri $SendUri -Method POST
$SendUri = $Res.Task.href
Write-Host "Please wait a moment."
Sleep 10
While ($Res.Task.Status -eq "running") {
Sleep 5
$Res = Invoke-RestMethod -Headers $Headers -Uri $SendUri -Method GET
}
$SendUri = $EdgeUri + "/action/reapplyServices"
$Res = Invoke-RestMethod -Headers $Headers -Uri $SendUri -Method POST
exit
こんな感じですが、おそらく本番でやるときには「ループで複数の対象に順次実行」と「エラーハンドリング」を追加ですかね。