URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

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

 こんな感じですが、おそらく本番でやるときには「ループで複数の対象に順次実行」と「エラーハンドリング」を追加ですかね。