PowerCLI ์Šคํฌ๋ฆฝํŠธ์šฉ ๋กœ์ผ“ ๋ถ€์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ• 

์กฐ๋งŒ๊ฐ„ ๋ชจ๋“  VMware ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ์ผ์ƒ์ ์ธ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์€ ๋ช…๋ น์ค„๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ PowerShell ๋˜๋Š” VMware PowerCLI๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

ISE๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  "์ผ์ข…์˜ ๋งˆ๋ฒ•"์œผ๋กœ ์ธํ•ด ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“ˆ์˜ ํ‘œ์ค€ cmdlet์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค PowerShell์„ ์กฐ๊ธˆ ๋” ๋งˆ์Šคํ„ฐํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์„ธ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์†Œ๊ทœ๋ชจ๋กœ ๋„์›€์ด ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋Œ€๊ทœ๋ชจ์—์„œ๋Š” ๋ˆˆ์— ๋„๊ฒŒ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋„๊ตฌ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • PowerShell ๋Ÿฐํƒ€์ž„ โ€“ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์„ ๋ณ‘๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 
  • ๋ณด๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ โ€“ Windows์˜ Get-WMIObject์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋ณธ PowerCLI ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด cmdlet์€ ์—”ํ„ฐํ‹ฐ์™€ ํ•จ๊ป˜ โ€‹โ€‹์ œ๊ณต๋˜๋Š” ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์ง€๋งŒ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๊ฐ€์ง„ ๊ฐ„๋‹จํ•œ ๊ฐœ์ฒด ํ˜•ํƒœ๋กœ ์ •๋ณด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋” ๋นจ๋ฆฌ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๊ฐ ๋„๊ตฌ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์‚ฌ์šฉ ์˜ˆ๋ฅผ ๋ณด์—ฌ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์–ด๋Š ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋‹ค!

PowerCLI ์Šคํฌ๋ฆฝํŠธ์šฉ ๋กœ์ผ“ ๋ถ€์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„: 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์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค๋Š” ์ ์ด๋‹ค.โ€ 

์ถœ์ฒ˜ : RunspacePool์„ ์‚ฌ์šฉํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ PowerCLI

์—ฌ๊ธฐ์—๋Š” 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์„ ๋ณต์ œํ•  ๋•Œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค). 

๋งˆ์Œ์†์— ๋– ์˜ค๋ฅด๋Š” ํ™•์‹คํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  VM ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. ์–ด๋–ป๊ฒŒ๋“  ๋ชฉ๋ก์„ ๋ถ„์„ํ•ด ๋ณด์„ธ์š”.

์›๋ž˜ ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ์˜€์Šต๋‹ˆ๋‹ค.

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
}
# ะ”ะฐะปะตะต ะ ะฃะšะะœะ˜ ะฟะฐั€ัะธะผ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ั€ะตะทัƒะปัŒั‚ะฐั‚

๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๋ฉฐ ๋ช‡ ๋ถ„ ์•ˆ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์‚ฌ๋กœ ์—ฌ๊ณผํ•˜๋ฉด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PowerCLI ์Šคํฌ๋ฆฝํŠธ์šฉ ๋กœ์ผ“ ๋ถ€์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•

PowerCLI ์Šคํฌ๋ฆฝํŠธ์šฉ ๋กœ์ผ“ ๋ถ€์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•

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 ํ’€์„ ํ†ตํ•ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.  

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  VM ๋ชฉ๋ก์„ ์–ป์Šต๋‹ˆ๋‹ค.
  2. ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์—์„œ๋Š” cloud.uuid๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  3. ์šฐ๋ฆฌ๋Š” ์ŠคํŠธ๋ฆผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  4. 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๊ณผ ์ŠคํŠธ๋ฆผ์— ์ „๋‹ฌ๋  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ๋Œ€์ฒดํ•˜์—ฌ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์•…์šฉํ•˜์„ธ์š”!

์šฐ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค:

PowerCLI ์Šคํฌ๋ฆฝํŠธ์šฉ ๋กœ์ผ“ ๋ถ€์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•

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

์šฐ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค:

PowerCLI ์Šคํฌ๋ฆฝํŠธ์šฉ ๋กœ์ผ“ ๋ถ€์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•

9 ์ดˆ ์›ํ•˜๋Š” ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๊ฑฐ์˜ 10๊ฐœ์˜ ๊ฐ์ฒด์— ๋Œ€ํ•ด. ์—„์ฒญ๋‚œ!

๋Œ€์‹  ๊ฒฐ๋ก 

ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋Š” ๋„๊ตฌ ์„ ํƒ์— ์ง์ ‘์ ์œผ๋กœ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํžˆ ๋งํ•˜๊ธฐ๋Š” ์ข…์ข… ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‚˜์—ด๋œ ๊ฐ ๋ฐฉ๋ฒ•์€ ์ ์šฉ ๋ฒ”์œ„ ๋‚ด์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๊ฐ€ ์ธํ”„๋ผ์˜ ํ”„๋กœ์„ธ์Šค ์ž๋™ํ™” ๋ฐ ์ตœ์ ํ™”์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๋Š” ์–ด๋ ค์šด ์ž‘์—…์— ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถ”์‹ : ์ €์ž๋Š” ๊ธฐ์‚ฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐ ๋„์›€๊ณผ ์ง€์›์„ ํ•ด์ค€ ๋ชจ๋“  ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐœ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค๋„์š”. ์‹ฌ์ง€์–ด ๋ณด์•„๋ฑ€์ฒ˜๋Ÿผ ๋‹ค๋ฆฌ๊ฐ€ ์—†๋Š” ์‚ฌ๋žŒ๋“ค๋„์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€