์กฐ๋ง๊ฐ ๋ชจ๋ VMware ์์คํ ๊ด๋ฆฌ์๊ฐ ์ผ์์ ์ธ ์์ ์ ์๋ํํ๊ฒ ๋ฉ๋๋ค. ๋ชจ๋ ๊ฒ์ ๋ช ๋ น์ค๋ก ์์ํ ๋ค์ PowerShell ๋๋ VMware PowerCLI๋ก ์์๋ฉ๋๋ค.
ISE๋ฅผ ์์ํ๊ณ "์ผ์ข ์ ๋ง๋ฒ"์ผ๋ก ์ธํด ์๋ํ๋ ๋ชจ๋์ ํ์ค cmdlet์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค PowerShell์ ์กฐ๊ธ ๋ ๋ง์คํฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ฐฑ ๊ฐ์ ๊ฐ์ ๋จธ์ ์ ์ธ๊ธฐ ์์ํ๋ฉด ์๊ท๋ชจ๋ก ๋์์ด ๋๋ ์คํฌ๋ฆฝํธ๊ฐ ๋๊ท๋ชจ์์๋ ๋์ ๋๊ฒ ๋๋ฆฌ๊ฒ ์คํ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ์ํฉ์์๋ ๋ค์ ๋ ๊ฐ์ง ๋๊ตฌ๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
- PowerShell ๋ฐํ์ โ ๋ณ๋์ ์ค๋ ๋์์ ํ๋ก์ธ์ค ์คํ์ ๋ณ๋ ฌํํ ์ ์๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
- ๋ณด๊ธฐ ๊ฐ์ ธ์ค๊ธฐ โ Windows์ Get-WMIObject์ ์ ์ฌํ ๊ธฐ๋ณธ PowerCLI ๊ธฐ๋ฅ์ ๋๋ค. ์ด cmdlet์ ์ํฐํฐ์ ํจ๊ป โโ์ ๊ณต๋๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค์ง ์์ง๋ง ๊ฐ๋จํ ๋ฐ์ดํฐ ํ์์ ๊ฐ์ง ๊ฐ๋จํ ๊ฐ์ฒด ํํ๋ก ์ ๋ณด๋ฅผ ๋ฐ์ต๋๋ค. ๋ ๋นจ๋ฆฌ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋ค์์ผ๋ก ๊ฐ ๋๊ตฌ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ณ ์ฌ์ฉ ์๋ฅผ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ํน์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ์ํ๊ณ ์ด๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ณด๋ค ๋ ์ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ๋ค!
์ฒซ ๋ฒ์งธ ๋จ๊ณ: Runspace
๋ฐ๋ผ์ Runspace๋ ๊ธฐ๋ณธ ๋ชจ๋ ์ธ๋ถ์ ์์ ์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ฌผ๋ก ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ, ํ๋ก์ธ์ ๋ฑ์ ์๋ชจํ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์์ํ ์ ์์ต๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ ๋ช ๋ถ ์์ ์คํ๋๊ณ ๊ธฐ๊ฐ๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๋ ๊ฒฝ์ฐ Runspace๊ฐ ํ์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ง ๊ฐ์ ๊ฐ์ฒด์ ๋ํ ์คํฌ๋ฆฝํธ์๋ ํ์ํฉ๋๋ค.
์ฌ๊ธฐ์์ ํ์ต์ ์์ํ ์ ์์ต๋๋ค:
PowerShell Runspaces ์ฌ์ฉ ์์: 1๋ถ
Runspace๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์์ด ์ ๊ณต๋ฉ๋๋ค.
- ์คํ๋๋ ๋ช ๋ น ๋ชฉ๋ก์ ์ ํํ์ฌ ์๋๋ฅผ ์ ํํ๊ณ ,
- ์์ ์ ๋ณ๋ ฌ ์คํ,
- ๋ณด์.
๋ค์์ Runspace๊ฐ ๋์์ด ๋๋ ์ธํฐ๋ท์ ์์ ๋๋ค.
โ์คํ ๋ฆฌ์ง ๊ฒฝํฉ์ vSphere์์ ์ถ์ ํ๊ธฐ ๊ฐ์ฅ ์ด๋ ค์ด ์งํ ์ค ํ๋์ ๋๋ค. vCenter ๋ด๋ถ์์๋ ์ด๋ค VM์ด ๋ ๋ง์ ์คํ ๋ฆฌ์ง ๋ฆฌ์์ค๋ฅผ ์๋นํ๊ณ ์๋์ง ์ง์ ํ์ธํ ์๋ ์์ต๋๋ค. ๋คํํ PowerShell ๋๋ถ์ ๋ช ๋ถ ์์ ์ด ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์์ต๋๋ค.
VMware ์์คํ ๊ด๋ฆฌ์๊ฐ vCenter ์ ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ณ ํ๊ท ์ฌ์ฉ๋์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ VM ๋ชฉ๋ก์ ๋ฐ์ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต์ ํ๊ฒ ์ต๋๋ค.
์คํฌ๋ฆฝํธ๋ PowerShell Runspace๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ESXi ํธ์คํธ๊ฐ ๋ณ๋์ Runspace์ ์๋ ์์ฒด VM์ ์๋น ์ ๋ณด๋ฅผ ์์งํ๊ณ ์ฆ์ ์๋ฃ๋ฅผ ๋ณด๊ณ ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด PowerShell์ ํธ์คํธ๋ฅผ ๋ฐ๋ณตํ๊ณ ๊ฐ ํธ์คํธ๊ฐ ์์ฒญ์ ์๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฆ์ ์์ ์ ๋ซ์ ์ ์์ต๋๋ค.โ์ถ์ฒ :
ESXi ๋์๋ณด๋์ ๊ฐ์ ์์คํ I/O๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ
์๋์ ๊ฒฝ์ฐ Runspace๋ ๋ ์ด์ ์ ์ฉํ์ง ์์ต๋๋ค.
โVM์์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ํ์ํ ๋ ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค. ๋ฌธ์ ๋ VM์ด โโ๊ฝค ๋ง๊ณ , ํ ๋จธ์ ์ 5~8์ด๊ฐ ์์๋๋ค๋ ์ ์ด๋ค.โ
์ฌ๊ธฐ์๋ Get-View๊ฐ ํ์ํฉ๋๋ค. ๊ณ์ ์งํํ๊ฒ ์ต๋๋ค.
๋ ๋ฒ์งธ ๋จ๊ณ: Get-View
Get-View๊ฐ ์ ์ฉํ ์ด์ ๋ฅผ ์ดํดํ๋ ค๋ฉด cmdlet์ด ์ผ๋ฐ์ ์ผ๋ก ์๋ํ๋ ๋ฐฉ์์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
API ์ฐธ์กฐ ์์ ์ ์ฐ๊ตฌํ๊ณ ๋ค์ ๋จ๊ณ๋ฅผ ๋ค์ ๋ง๋ค ํ์ ์์ด ํธ๋ฆฌํ๊ฒ ์ ๋ณด๋ฅผ ์ป์ผ๋ ค๋ฉด cmdlet์ด ํ์ํฉ๋๋ค. ์์ ์๋ XNUMX~XNUMX์ค์ ์ฝ๋๊ฐ ํ์ํ๋ ์์ ์ PowerShell์ ์ฌ์ฉํ๋ฉด ํ๋์ ๋ช ๋ น์ผ๋ก ์ํํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ํธ๋ฆฌํจ์ ์ ์ํ๊ฒ ์ง๋ถํฉ๋๋ค. cmdlet ์์ฒด์๋ ๋ง๋ฒ์ด ์์ต๋๋ค. ๋์ผํ ์คํฌ๋ฆฝํธ์ด์ง๋ง ๋ ๋ฎ์ ์์ค์์ ๋ง์ ์ธ๋ ์ถ์ ์ ์๋ จ๋ ์์ผ๋ก ์์ฑ๋์์ต๋๋ค.
์ด์ Get-View์์ ๋น๊ต๋ฅผ ์ํด Get-VM cmdlet์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ์ด cmdlet์ ๊ฐ์ ๋จธ์ ์ ์ก์ธ์คํ๊ณ ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ฆ, VMHost, Datastore ๋ฑ ๋ค๋ฅธ ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ์ฌ๊ธฐ์ ์ฐ๊ฒฐํฉ๋๋ค.
Get-View๋ ๋ฐํ๋ ๊ฐ์ฒด์ ๋ถํ์ํ ํญ๋ชฉ์ ์ถ๊ฐํ์ง ์์ต๋๋ค. ๋ํ ํ์ํ ์ ๋ณด๋ฅผ ์๊ฒฉํ๊ฒ ์ง์ ํ ์ ์์ผ๋ฏ๋ก ์ถ๋ ฅ ๊ฐ์ฒด๊ฐ ๋ ์ฌ์์ง๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Windows Server์ ํนํ Hyper-V์์ Get-WMIObject cmdlet์ ์ง์ ์ ์ธ ์ ์ฌ์ฒด์ ๋๋ค. ์์ด๋์ด๋ ์ ํํ ๋์ผํฉ๋๋ค.
Get-View๋ ํฌ์ธํธ ๊ฐ์ฒด์ ๋ํ ์ผ์์ ์ธ ์์ ์ ๋ถํธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฒ, ์๋ง ๊ฐ์ ๋ฌผ๊ฑด์ ๊ดํด์๋ ๊ฐ๊ฒฉ์ด ์์ต๋๋ค.
VMware ๋ธ๋ก๊ทธ์์ ์์ธํ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
Get-View ์๊ฐ
์ด์ ์ค์ ์ฌ๋ก๋ฅผ ํตํด ๋ชจ๋ ๊ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
VM์ ์ธ๋ก๋ํ๋ ์คํฌ๋ฆฝํธ ์์ฑ
์ด๋ ๋ ๋๋ฃ๊ฐ ๋์๊ฒ ์์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ต์ ํํด ๋ฌ๋ผ๊ณ ์์ฒญํ์ต๋๋ค. ์์ ์ ์ผ๋ฐ์ ์ธ ๋ฃจํด์ ๋๋ค. ์ค๋ณต๋ cloud.uuid ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ชจ๋ VM์ ์ฐพ์ต๋๋ค(์, vCloud Director์์ VM์ ๋ณต์ ํ ๋ ๊ฐ๋ฅํฉ๋๋ค).
๋ง์์์ ๋ ์ค๋ฅด๋ ํ์คํ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชจ๋ VM ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค.
- ์ด๋ป๊ฒ๋ ๋ชฉ๋ก์ ๋ถ์ํด ๋ณด์ธ์.
์๋ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ์คํฌ๋ฆฝํธ์์ต๋๋ค.
function Get-CloudUUID1 {
# ะะพะปััะฐะตะผ ัะฟะธัะพะบ ะฒัะตั
ะะ
$vms = Get-VM
$report = @()
# ะะฑัะฐะฑะฐััะฒะฐะตะผ ะบะฐะถะดัะน ะพะฑัะตะบั, ะฟะพะปััะฐั ะธะท ะฝะตะณะพ ัะพะปัะบะพ 2 ัะฒะพะนััะฒะฐ: ะะผั ะะ ะธ Cloud UUID.
# ะะฐะฝะพัะธะผ ะดะฐะฝะฝัะต ะฒ ะฝะพะฒัะน PS-ะพะฑัะตะบั ั ะฟะพะปัะผะธ VM ะธ UUID
foreach ($vm in $vms)
{
$table = "" | select VM,UUID
$table.VM = $vm.name
$table.UUID = ($vm | Get-AdvancedSetting -Name cloud.uuid).Value
$report += $table
}
# ะะพะทะฒัะฐัะฐะตะผ ะฒัะต ะพะฑัะตะบัั
$report
}
# ะะฐะปะตะต ะ ะฃะะะะ ะฟะฐััะธะผ ะฟะพะปััะตะฝะฝัะน ัะตะทัะปััะฐั
๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํ๊ณ ๋ช ํํฉ๋๋ค. ์ปคํผ๋ฅผ ๋ง์๋ฉฐ ๋ช ๋ถ ์์ ์์ฑํ ์ ์์ต๋๋ค. ๋์ฌ๋ก ์ฌ๊ณผํ๋ฉด ์๋ฃ๋ฉ๋๋ค.
ํ์ง๋ง ์๊ฐ์ ์ธก์ ํด ๋ณด๊ฒ ์ต๋๋ค.
2๋ถ 47์ด ๊ฑฐ์ 10๊ฐ์ VM์ ์ฒ๋ฆฌํ ๋. ๋ณด๋์ค๋ ํํฐ๊ฐ ์๊ณ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ์ ๋ ฌํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ถ๋ช
ํ ์คํฌ๋ฆฝํธ์๋ ์ต์ ํ๊ฐ ํ์ํฉ๋๋ค.
Runspace๋ vCenter์์ ํธ์คํธ ๋ฉํธ๋ฆญ์ ๋์์ ๊ฐ์ ธ์์ผ ํ๊ฑฐ๋ ์๋ง ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํด์ผ ํ ๋ ๊ฐ์ฅ ๋จผ์ ๊ตฌ์ถ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ด ๋ฌด์์ ๊ฐ์ ธ์ค๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์๋ ์ผ๊ธฐ: PowerShell Runspaces
์ด ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฒ์ ๋ฃจํ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํํ๋ ๊ฒ์ด ์๋๋ผ ๋ณ๋ ฌ ์ค๋ ๋์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ์์งํ๊ณ ํํฐ๋งํ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. PowerCLI์์๋ vCenter์ ๋ํ ๋ง์ ๋ ๋ฆฝ ์ธ์ ์ ์ด ์ ์์ผ๋ฉฐ ์ฌ๋ฏธ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
You have modified the global:DefaultVIServer and global:DefaultVIServers system variables. This is not allowed. Please reset them to $null and reconnect to the vSphere server.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋จผ์ ์คํธ๋ฆผ ๋ด๋ถ์ ์ธ์ ์ ๋ณด๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. PowerShell์ ํจ์๋ ScriptBlock์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ์ ์๋ ๊ฐ์ฒด์ ํจ๊ป ์๋ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. $global:DefaultVIServers(-NotDefault ํค๊ฐ ์๋ Connect-VIServer)๋ฅผ ์ฐํํ์ฌ ์ด๋ฌํ ๊ฐ์ฒด ํํ๋ก ์ธ์ ์ ์ ๋ฌํด ๋ณด๊ฒ ์ต๋๋ค.
$ConnectionString = @()
foreach ($vCenter in $vCenters)
{
try {
$ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -AllLinked -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
}
catch {
if ($er.Message -like "*not part of a linked mode*")
{
try {
$ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
}
catch {
throw $_
}
}
else {
throw $_
}
}
}
์ด์ Runspace ํ์ ํตํด ๋ฉํฐ์ค๋ ๋ฉ์ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชจ๋ VM ๋ชฉ๋ก์ ์ป์ต๋๋ค.
- ๋ณ๋ ฌ ์คํธ๋ฆผ์์๋ cloud.uuid๋ฅผ ์ป์ต๋๋ค.
- ์ฐ๋ฆฌ๋ ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ์์งํฉ๋๋ค.
- CloudUUID ํ๋์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ์ฒด๋ฅผ ํํฐ๋งํฉ๋๋ค. ๊ณ ์ ๊ฐ์ ์๊ฐ 1๋ณด๋ค ํฐ ๊ฐ์ฒด๊ฐ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ VM์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์ป์ต๋๋ค.
function Get-VMCloudUUID {
param (
[string[]]
[ValidateNotNullOrEmpty()]
$vCenters = @(),
[int]$MaxThreads,
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential
)
$ConnectionString = @()
# ะกะพะทะดะฐะตะผ ะพะฑัะตะบั ั ัะตััะธะพะฝะฝัะผ ะบะปััะพะผ
foreach ($vCenter in $vCenters)
{
try {
$ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -AllLinked -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
}
catch {
if ($er.Message -like "*not part of a linked mode*")
{
try {
$ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
}
catch {
throw $_
}
}
else {
throw $_
}
}
}
# ะะพะปััะฐะตะผ ัะฟะธัะพะบ ะฒัะตั
ะะ
$Global:AllVMs = Get-VM -Server $ConnectionString
# ะะพะตั
ะฐะปะธ!
$ISS = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
$RunspacePool = [runspacefactory]::CreateRunspacePool(1, $MaxThreads, $ISS, $Host)
$RunspacePool.ApartmentState = "MTA"
$RunspacePool.Open()
$Jobs = @()
# ScriptBlock ั ะผะฐะณะธะตะน!)))
# ะะผะตะฝะฝะพ ะพะฝ ะฑัะดะตั ะฒัะฟะพะปะฝััััั ะฒ ะฟะพัะพะบะต
$scriptblock = {
Param (
$ConnectionString,
$VM
)
$Data = $VM | Get-AdvancedSetting -Name Cloud.uuid -Server $ConnectionString | Select-Object @{N="VMName";E={$_.Entity.Name}},@{N="CloudUUID";E={$_.Value}},@{N="PowerState";E={$_.Entity.PowerState}}
return $Data
}
# ะะตะฝะตัะธััะตะผ ะฟะพัะพะบะธ
foreach($VM in $AllVMs)
{
$PowershellThread = [PowerShell]::Create()
# ะะพะฑะฐะฒะปัะตะผ ัะบัะธะฟั
$null = $PowershellThread.AddScript($scriptblock)
# ะ ะพะฑัะตะบัั, ะบะพัะพััะต ะฟะตัะตะดะฐะดะธะผ ะฒ ะบะฐัะตััะฒะต ะฟะฐัะฐะผะตััะพะฒ ัะบัะธะฟัั
$null = $PowershellThread.AddArgument($ConnectionString)
$null = $PowershellThread.AddArgument($VM)
$PowershellThread.RunspacePool = $RunspacePool
$Handle = $PowershellThread.BeginInvoke()
$Job = "" | Select-Object Handle, Thread, object
$Job.Handle = $Handle
$Job.Thread = $PowershellThread
$Job.Object = $VM.ToString()
$Jobs += $Job
}
# ะกัะฐะฒะธะผ ะณัะฐะดััะฝะธะบ, ััะพะฑั ะฝะฐะณะปัะดะฝะพ ะพััะปะตะถะธะฒะฐัั ะฒัะฟะพะปะฝะตะฝะธะต ะทะฐะดะฐะฝะธะน
# ะ ะทะดะตัั ะถะต ะฟัะธะฑะธะฒะฐะตะผ ะพััะฐะฑะพัะฐะฒัะธะต ะทะฐะดะฐะฝะธั
While (@($Jobs | Where-Object {$_.Handle -ne $Null}).count -gt 0)
{
$Remaining = "$($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False}).object)"
If ($Remaining.Length -gt 60) {
$Remaining = $Remaining.Substring(0,60) + "..."
}
Write-Progress -Activity "Waiting for Jobs - $($MaxThreads - $($RunspacePool.GetAvailableRunspaces())) of $MaxThreads threads running" -PercentComplete (($Jobs.count - $($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False}).count)) / $Jobs.Count * 100) -Status "$(@($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False})).count) remaining - $remaining"
ForEach ($Job in $($Jobs | Where-Object {$_.Handle.IsCompleted -eq $True})){
$Job.Thread.EndInvoke($Job.Handle)
$Job.Thread.Dispose()
$Job.Thread = $Null
$Job.Handle = $Null
}
}
$RunspacePool.Close() | Out-Null
$RunspacePool.Dispose() | Out-Null
}
function Get-CloudUUID2
{
[CmdletBinding()]
param(
[string[]]
[ValidateNotNullOrEmpty()]
$vCenters = @(),
[int]$MaxThreads = 50,
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential)
if(!$Credential)
{
$Credential = Get-Credential -Message "Please enter vCenter credentials."
}
# ะัะทะพะฒ ััะฝะบัะธะธ Get-VMCloudUUID, ะณะดะต ะผั ัะฐัะฟะฐัะฐะปะปะตะปะธะฒะฐะตะผ ะพะฟะตัะฐัะธั
$AllCloudVMs = Get-VMCloudUUID -vCenters $vCenters -MaxThreads $MaxThreads -Credential $Credential
$Result = $AllCloudVMs | Sort-Object Value | Group-Object -Property CloudUUID | Where-Object -FilterScript {$_.Count -gt 1} | Select-Object -ExpandProperty Group
$Result
}
์ด ์คํฌ๋ฆฝํธ์ ์ฅ์ ์ ScriptBlock๊ณผ ์คํธ๋ฆผ์ ์ ๋ฌ๋ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ๋จํ ๋์ฒดํ์ฌ ๋ค๋ฅธ ์ ์ฌํ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ ์ฉํ์ธ์!
์ฐ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค:
55 ์ด. ๋ ๋์์ก์ง๋ง ์ฌ์ ํ ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ์๋์ธ GetView๋ก ์ด๋ํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฌด์์ด ๋ฌธ์ ์ธ์ง ์์๋ด
์๋ค.
๋ฌด์๋ณด๋ค๋ Get-VM cmdlet์ ์คํํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
๋์งธ, Get-AdvancedOptions cmdlet์ ์๋ฃํ๋ ๋ฐ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๋ ๋ฒ์งธ ๊ฒ์ ๋จผ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
Get-AdvancedOptions๋ ๊ฐ๋ณ VM ๊ฐ์ฒด์ ํธ๋ฆฌํ์ง๋ง ๋ง์ ๊ฐ์ฒด๋ฅผ ์์ ํ ๋๋ ๋งค์ฐ ๋ถํธํฉ๋๋ค. ๊ฐ์ ๋จธ์ ๊ฐ์ฒด ์์ฒด(Get-VM)์์๋ ๋์ผํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค. ExtensionData ๊ฐ์ฒด์ ์ ๋ฌปํ ์์ต๋๋ค. ํํฐ๋ง ๊ธฐ๋ฅ์ ํ์ฌํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ๊ณผ์ ์ ์๋๋ฅผ ๋์ ๋๋ค.
์์ ์ด์ง ์์ง์ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
VM | Get-AdvancedSetting -Name Cloud.uuid -Server $ConnectionString | Select-Object @{N="VMName";E={$_.Entity.Name}},@{N="CloudUUID";E={$_.Value}},@{N="PowerState";E={$_.Entity.PowerState}}
๋ค์๊ณผ ๊ฐ์ด ๋ณํฉ๋๋ค:
$VM | Where-Object {($_.ExtensionData.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value -ne $null} | Select-Object @{N="VMName";E={$_.Name}},@{N="CloudUUID";E={($_.ExtensionData.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value}},@{N="PowerState";E={$_.summary.runtime.powerstate}}
์ถ๋ ฅ์ Get-AdvancedOptions์ ๋์ผํ์ง๋ง ๋ช ๋ฐฐ ๋ ๋น ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
์ด์ Get-VM์ผ๋ก ์ด๋ํ์ธ์. ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด์ง๋ ์์ต๋๋ค. ๋ ผ๋ฆฌ์ ์ธ ์ง๋ฌธ์ด ์๊น๋๋ค. VM์ ์ด๋ฆ, ์ํ ๋ฐ ๊น๋ค๋ก์ด ์์ฑ ๊ฐ๋ง ํ์ํ๋ฐ ์ด ๊ฒฝ์ฐ ์ถ๊ฐ ์ ๋ณด์ ๊ดด๋ฌผ ๊ฐ์ PSObject๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ํ Get-AdvancedOptions ํํ์ ์ฅ์ ๋ฌผ์ด ์คํฌ๋ฆฝํธ์์ ์ ๊ฑฐ๋์์ต๋๋ค. ์ธ์ ์ ๋๊ฒจ์ค ๋ ๋ ์ด์ ์ค์ฟผํธ ์ค๋ ๋ ์ ์ฒด์์ ๋๋ฆฐ ์์ ์ ๋ณ๋ ฌํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ Runspace Pools๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด์ ๊ณผ๋ํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋๊ตฌ๋ ์ข์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
ExtensionData์ ์ถ๋ ฅ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ Get-View ๊ฐ์ฒด์ ์ง๋์ง ์์ต๋๋ค.
PowerShell ๋ง์คํฐ์ ๊ณ ๋ ๊ธฐ์ ์ธ ํํฐ, ์ ๋ ฌ ๋ฐ ๊ทธ๋ฃนํ๋ฅผ ์ฌ์ฉํ๋ ํ ์ค์ ํธ์ถํด ๋ณด๊ฒ ์ต๋๋ค. ์ด์ ์ ๋ชจ๋ ๊ณตํฌ๋ ํ ์ค๋ก ์ฐ์ํ๊ฒ ์ถ์๋์ด ํ ์ธ์ ์์ ์คํ๋ฉ๋๋ค.
$AllVMs = Get-View -viewtype VirtualMachine -Property Name,Config.ExtraConfig,summary.runtime.powerstate | Where-Object {($_.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value -ne $null} | Select-Object @{N="VMName";E={$_.Name}},@{N="CloudUUID";E={($_.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value}},@{N="PowerState";E={$_.summary.runtime.powerstate}} | Sort-Object CloudUUID | Group-Object -Property CloudUUID | Where-Object -FilterScript {$_.Count -gt 1} | Select-Object -ExpandProperty Group
์ฐ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค:
9 ์ด ์ํ๋ ์กฐ๊ฑด์ผ๋ก ํํฐ๋งํ์ฌ ๊ฑฐ์ 10๊ฐ์ ๊ฐ์ฒด์ ๋ํด. ์์ฒญ๋!
๋์ ๊ฒฐ๋ก
ํ์ฉ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ ๋๊ตฌ ์ ํ์ ์ง์ ์ ์ผ๋ก ๋ฌ๋ ค ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์ ํํ ๋ฌด์์ ์ ํํด์ผ ํ๋์ง ํ์คํ ๋งํ๊ธฐ๋ ์ข ์ข ์ด๋ ต์ต๋๋ค. ์คํฌ๋ฆฝํธ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋์ด๋ ๊ฐ ๋ฐฉ๋ฒ์ ์ ์ฉ ๋ฒ์ ๋ด์์ ์ ์ฉํฉ๋๋ค. ์ด ๊ธฐ์ฌ๊ฐ ์ธํ๋ผ์ ํ๋ก์ธ์ค ์๋ํ ๋ฐ ์ต์ ํ์ ๊ธฐ๋ณธ ์ฌํญ์ ์ดํดํ๋ ์ด๋ ค์ด ์์ ์ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ถ์ : ์ ์๋ ๊ธฐ์ฌ๋ฅผ ์ค๋นํ๋ ๋ฐ ๋์๊ณผ ์ง์์ ํด์ค ๋ชจ๋ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ฐ์ด ์๋ ์ฌ๋๋ค๋์. ์ฌ์ง์ด ๋ณด์๋ฑ์ฒ๋ผ ๋ค๋ฆฌ๊ฐ ์๋ ์ฌ๋๋ค๋์.
์ถ์ฒ : habr.com