URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

vCloud DirectorのAPIを使って組織VDCを作成する

 仕事でvCloud Directorを使う機会があるのですが、組織VDCの作成を自動化するためのスクリプト作成が結構難航していました。

 そもそもVMwareのPowerCLIには"New-OrgVdc"というコマンドレットが用意されているのですが、これでVDCを作成するにはストレージポリシーを"Any"する必要があるようです。ですが、うちの環境ではそれが許されていないため、PowerCLIでは手詰まりになってしまいました。そもそもvCloud関連のPowerCLIはまだまだ足りてない機能が多い気が…。情報も少ないし。
 そこで、vCloud DirectorのREST APIを使うしかないと。

 やることは「特定のストレージポリシーが適用された組織VDCを作成する」ということ。
 環境はvCloud Director 5.5、リソースの割り当てモデルとか制限は主題ではないので従量課金で無制限に決め打ち。
 

$VcdUser = "administrator" $VcdPass = "password" $ApiEp = "https://vcd.example.com/api" $ApiVer = "5.5" $ProviderVdcName = "ProviderVDC" $OrgName = "Organization" $StoragePolicy = "HighIOPS" $PrivateNetworkPool = "PrivateNW" $VdcName = "NewVDC" # 認証トークンの取得 $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" } # プロバイダーVDCのURLを取得 $SendUri = $ApiEp + "/admin" $Res = Invoke-RestMethod -Headers $Headers -Uri $SendUri -Method GET foreach ($objPvDC in $Res.vCloud.ProviderVdcReferences.ProviderVdcReference) { if ($objPvDC.Name -eq $ProviderVdcName) { $PvDCUri = $objPvDC.href } } # 組織のURLを取得 foreach ($objOrg in $Res.vCloud.OrganizationReferences.OrganizationReference) { if ($objOrg.Name -eq $OrgName) { $OrgUri = $objOrg.href } } # 適用するストレージポリシーのURLを取得 $Res = Invoke-RestMethod -Headers $Headers -Uri $PvDCUri -Method GET foreach ($objSp in $Res.ProviderVdc.StorageProfiles.ProviderVdcStorageprofile) { if ($objSp.Name -eq $StoragePolicy) { $SpUri = $objSp.href } } # プライベートネットワークプールのURLを取得 foreach ($objNw in $Res.ProviderVdc.NetworkPoolReferences.NetworkPoolReference) { if ($objNw.Name -eq $PrivateNetworkPool) { $NwUri = $objNw.href } } # 作成するVDCのパラメータ $CreateOrgVdcXml = @" <?xml version="1.0" encoding="UTF-8"?> <CreateVdcParams name="$VdcName" xmlns="http://www.vmware.com/vcloud/v1.5"> <Description>NewVirtualDatacenter</Description> <AllocationModel>AllocationVApp</AllocationModel> <ComputeCapacity> <Cpu> <Units>MHz</Units> <Allocated>0</Allocated> <Limit>0</Limit> </Cpu> <Memory> <Units>MB</Units> <Allocated>0</Allocated> <Limit>0</Limit> </Memory> </ComputeCapacity> <NicQuota>0</NicQuota> <NetworkQuota>10</NetworkQuota> <VdcStorageProfile> <Enabled>true</Enabled> <Units>MB</Units> <Limit>0</Limit> <Default>true</Default> <ProviderVdcStorageProfile href="$SpUri" /> </VdcStorageProfile> <ResourceGuaranteedMemory>1</ResourceGuaranteedMemory> <ResourceGuaranteedCpu>1</ResourceGuaranteedCpu> <VCpuInMhz>2000</VCpuInMhz> <IsThinProvision>true</IsThinProvision> <NetworkPoolReference href="$NwUri" /> <ProviderVdcReference name="$ProviderVdcName" href="$PvDCUri" /> <UsesFastProvisioning>false</UsesFastProvisioning> </CreateVdcParams> "@ # VDCの作成 $SendUri = $OrgUri + "/vdcsparams" $Headers = @{ "x-vcloud-authorization" = $VcdAuth; "Accept" = "application/*+xml;version=$ApiVer"; "Content-Type" = "application/vnd.vmware.admin.createVdcParams+xml" } $Res = Invoke-RestMethod -Headers $Headers -Uri $SendUri -Method POST -Body $CreateOrgVdcXml

 "NewVDC"という名前に組織VDCを作成しています。
 APIの使い方はオフィシャルの"vCloud API Programming Guide"の通りですが、PowerShellで実行するため"Invoke-RestMethod"や"Invoke-WebRequest"に手こずりました。API使うならLinux環境から"curl"でもよかった気もするのですが、後学のためですね。BodyがXMLなのも、JSONに慣れるとなんとなくやりにくい。

 とりあえずこれをベースにして、他のスクリプト(組織や初期ネットワークの作成)と繋いで手作業が減らせそうです。あと、関数化したり整理しないと。


          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

プロフィール

1020@管理人

都内を彷徨っているインフラエンジニアとかいう雑用係。いつだって眠い…。

最近のつぶやき

@umkn1020 (08/04-17:04)
自宅のコーヒー豆がきれているけど週末には新しいのくるのでそれまでのしのぎ方を藻よっている感じ
@umkn1020 (08/04-11:32)
自宅でW-Fiの設定をしているとき、デフォルトっぽいSSIDが並ぶ中に自分のだけ変更してあるから他の部屋の人から見ると目立っているかもしれん。
@umkn1020 (08/03-20:15)
RT @tmksStyle: あかんわTiktok。 ・アカウントを作ってないのに動画が中国のサーバに送られていた ・アプリを閉じても生体認証や個人情報が収集されていた ・iOS14でクリップボードの情報が収集されていたことが確認された https://t.co/3Eh8ady…
@umkn1020 (08/03-17:47)
なんかいつもより肌寒いと思ったら室温が22度まで下がってる(ーー;) 設定温度は変わってないはずだが…
@umkn1020 (08/02-12:47)
RT @syouwabandori: ポルシェ硬すぎだろ 一方のBb…bB? 良くあるのは、 ・右車線後方からポルシェぶっ飛ばし ・サンデークソカー右車線ブロック ここからの車線変更であわや事故 この事故から分かった事は、 「車選びとは、命の選別だ」 このポルシェ911G…

エントリーリスト

カテゴリーリスト

タグ