URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

PowerCLIでvCenter Serverの権限をエクスポート/インポート

 昨日の続きで、ロールをインポートした後にユーザーを作成してロールと権限の対象(仮想マシンとかホスト等)を割り当てる。
 昨日のもそうだけど、とりあえず作業への間に合わせでザックリ作っただけのやつ。

 今回の作業ではユーザー数が多くなかったので手動で作成したけど、権限の割り当てが多数の仮想マシンに個別設定してあったからCSVファイルのインポートで一括設定するようにしたかった。
 ユーザー作成を別にしたのは、実際の作業がvCenter Server for WindowsからvCenter Server Applianceへの移行だったので、そもそも元の環境のOSユーザーはそのまま移行できないというのもあった。

Param ( [Parameter(Mandatory = $True, HelpMessage="Target CSV file")][alias("file","f")][ValidateNotNullOrEmpty()][string]$FilePath, [alias("-export","e")][switch]$ExportFlag, [alias("-import","i")][switch]$ImportFlag ) if ($ExportFlag -and $ImportFlag) { Write-Output "`"export`" and `"import`" are exclusive parameters." exit 255 } $VcSv = "192.168.1.251" $VcUser = "administrator@vsphere.local" $VcPass = "password" Import-Module VMware.PowerCLI #Add-PSSnapin VMware.VimAutomation.Core Connect-VIServer -Server $VcSv -User $VcUser -Password $VcPass if ($ExportFlag) { $Perms = Get-VIPermission $PermArray = @() foreach($Perm in $Perms) { if ($Perm.Principal -notmatch "VSPHERE\.LOCAL\\(vpxd-.*|vsphere-webclient-.*|Administrator$|Administrators$)") { $PermParams = New-Object PSObject -Property @{ Entity = $Perm.Entity Type = $Perm.EntityId.Split("-")[0] Principal = $Perm.Principal Role = $Perm.Role Propagate = $Perm.Propagate } $PermArray += $PermParams } } $PermArray | Select-Object -Property Entity,Type,Principal,Role,Propagate | Export-Csv -Path $FilePath -Encoding Default -NoType } if ($ImportFlag) { Import-Csv -Path $FilePath -Encoding Default | Foreach-Object { if ($_.Type -eq "Datacenter") { $ViObj = Get-Datacenter -Name $_.Entity } elseif ($_.Type -eq "ClusterComputeResource") { $ViObj = Get-Cluster -Name $_.Entity } elseif ($_.type -eq "HostSystem") { $ViObj = Get-VMHost -Name $_.Entity } elseif ($_.Type -eq "VirtualMachine") { $ViObj = Get-VM -Name $_.Entity } elseif ($_.Type -eq "Datastore") { $ViObj = Get-Datastore -Name $_.Entity } elseif ($_.Type -eq "DistributedVirtualPortgroup") { $ViObj = Get-VDPortgroup -Name $_.Entity } elseif ($_.Type -eq "Folder") { $ViObj = Get-Folder -Name $_.Entity } if ($_.Propagate -eq "TRUE") { $Prop = $True } else { $Prop = $False } New-VIPermission -Entity $ViObj -Principal $_.Principal -Role $_.Role -Propagate:$Prop } } Disconnect-VIServer -Confirm:$False exit

 実行時には"-export"か"-import"とCSVファイルを指定する。

PS C:\Scripts> .\VcPermExp.ps1 -f .\permission.csv -export
PS C:\Scripts> .\VcPermExp.ps1 -f .\permission.csv -import

CSVファイルの内容はこんな感じ。

Entity,Type,Principal,Role,Propagate Datacenters,Folder,VSPHERE.LOCAL\AdminUser,Admin,TRUE vm01,VirtualMachine,VSPHERE.LOCAL\VmUser,VmOwner,FALSE
  • Entity … 権限割り当て対象の名前
  • Type … "Entity"の種類 (Datacenter、VirtualMachine、Folder等々)
  • Principal … ユーザーまたはグループ名
  • Role … ロール名
  • Propagate … 伝達の有効無効 (TRUE or FALSE)

 "Type"は自分の作業に合わせて判別するようにしているので、網羅はしていない。
 システムデフォルトの"Entity"はバージョン等で表記が異なる場合があるかも("Datacenters"が"データセンター"とマルチバイト表記だったり)。

 実際に使ったときは、エクスポートしたCSVから不要な権限を削除して、ユーザー名を新しい環境のユーザーに置き換えてインポートした。
 もう少しスマートにできればよかったけどね。