| Works
PowerCLIでvCenter Serverのロールをエクスポート/インポート
vSphere環境の移行をするときにロールの権限設定が細かく設定されていて非常に手間だったので、楽をするために作成したスクリプト。
こういう作業をGUIを見比べながらとか、Excelに設定内容を落としこんでとか、とにかく手作業でやらせようとするのはいかがなものか…。
今回はvCenter Server 5.5にあるロールをエクスポートし、vCenter Server 6.5にインポートするのが目的でした。
ロールはシステムのデフォルトで作成されているもの(Admin等)とか、もう使わないので移行しなくてもよいものなどが入り混じっているので、引数で指定するようにしました。
Param (
[Parameter(Mandatory = $True, HelpMessage="Role name")][alias("name","n")][ValidateNotNullOrEmpty()][string]$RoleName,
[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) {
$OutFile = $PSScriptRoot + "\" + "$RoleName" + ".role"
try {
Get-VIRole -Name $RoleName | Get-VIPrivilege | Select-Object -ExpandProperty Id | Out-File -FilePath $OutFile
} catch {
Write-Error $_.Exceotion
exit 1
}
}
if ($ImportFlag) {
$InFile = $PSScriptRoot + "\" + "$RoleName" + ".role"
try {
$RolePrivileges = Get-Content -Path $InFile
} catch {
Write-Error $_.Exceotion
exit 2
}
New-VIRole -Name $RoleName
foreach ($Privilege in $RolePrivileges) {
if (-not ($null -eq $Privilege -or $Privilage -eq "")) {
Set-VIRole -Role $RoleName -AddPrivilege (Get-VIPrivilege -Id $Privilege)
}
}
}
Disconnect-VIServer -Confirm:$False
exit
実行方法は、スクリプト名を"VcRoleExp.ps1"、対象のロール名を"rolename"として以下の通り。
PS C:\Scripts> .\VcRoleExp.ps1 -n rolename -import
"-export"で実行するとスクリプトと同じパスに"rolename.role"というファイルを作成してエクスポート。
"-import"で実行するとスクリプトと同じパスの"rolename.role"ファイルをインポート。インポート時にはロールを新規に作成するので、名前の重複に注意する。空のロールを作成してファイルから読み取った権限を一つずつ追加して行くので、余計な権限はつかないはず。
適当に入れた"try ~ catch"のエラーハンドリングは怪しいけど、やりたいことはできているはず。
ただ、あとから気がついたのですが、スクリプト中で使っている変数"$PSScriptRoot"はPowerShell 3.0で追加されたらしく、このままではWindows Server 2008 R2等のPowerShell 2.x以前の環境ではうまく動作しない…。古い環境ではそこのところは修正ですね。