Как Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ Ρ€Π°ΠΊΠ΅Ρ‚Π΅Π½ ускоритСл Π·Π° PowerCLI скриптовС 

Π Π°Π½ΠΎ ΠΈΠ»ΠΈ късно всСки систСмСн администратор Π½Π° VMware Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π° Ρ€ΡƒΡ‚ΠΈΠ½Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ. Всичко Π·Π°ΠΏΠΎΡ‡Π²Π° с командния Ρ€Π΅Π΄, слСд Ρ‚ΠΎΠ²Π° ΠΈΠ΄Π²Π° PowerShell ΠΈΠ»ΠΈ VMware PowerCLI.

Π”Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ΠΌ, Ρ‡Π΅ стС усвоили PowerShell ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ стартиранСто Π½Π° ISE ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° стандартни ΠΊΡ€Π°Ρ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ работят ΠΏΠΎΡ€Π°Π΄ΠΈ β€žΠ½ΡΠΊΠ°ΠΊΠ²Π° ΠΌΠ°Π³ΠΈΡβ€œ. ΠšΠΎΠ³Π°Ρ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° Π±Ρ€ΠΎΠΈΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² стотици, Ρ‰Π΅ ΠΎΡ‚ΠΊΡ€ΠΈΠ΅Ρ‚Π΅, Ρ‡Π΅ скриптовСтС, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎΠΌΠ°Π³Π°Ρ‚ Π² малък ΠΌΠ°Ρ‰Π°Π±, работят Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ Π² голям ΠΌΠ°Ρ‰Π°Π±. 

Π’ Ρ‚Π°Π·ΠΈ ситуация Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ 2 инструмСнта:

  • PowerShell Runspaces – ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° процСси Π² ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ нишки; 
  • Get-View – Π±Π°Π·ΠΎΠ²Π° PowerCLI функция, Π°Π½Π°Π»ΠΎΠ³ Π½Π° Get-WMIObject Π² Windows. Π’Π°Π·ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ изтСгля ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, ΠΏΡ€ΠΈΠ΄Ρ€ΡƒΠΆΠ°Π²Π°Ρ‰ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° информация ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° прост ΠΎΠ±Π΅ΠΊΡ‚ с прости Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ. Π’ ΠΌΠ½ΠΎΠ³ΠΎ случаи ΠΈΠ·Π»ΠΈΠ·Π° ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ говоря Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π·Π° всСки инструмСнт ΠΈ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. НСка Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ скриптовС ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠ³Π° Сдиният Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ ΠΎΡ‚ другия. ΠžΡ‚ΠΈΠ²Π°ΠΌ!

Как Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ Ρ€Π°ΠΊΠ΅Ρ‚Π΅Π½ ускоритСл Π·Π° PowerCLI скриптовС

ΠŸΡŠΡ€Π²ΠΈ Π΅Ρ‚Π°ΠΏ: Runspace

И Ρ‚Π°ΠΊΠ°, Runspace Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π·Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ извън основния ΠΌΠΎΠ΄ΡƒΠ». Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стартиратС Π΄Ρ€ΡƒΠ³ процСс, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ изядС ΠΌΠ°Π»ΠΊΠΎ ΠΏΠ°ΠΌΠ΅Ρ‚, процСсор ΠΈ Ρ‚.Π½. Ако Π²Π°ΡˆΠΈΡΡ‚ скрипт сС изпълнява Π·Π° няколко ΠΌΠΈΠ½ΡƒΡ‚ΠΈ ΠΈ консумира Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚ ΠΏΠ°ΠΌΠ΅Ρ‚, Π½Π°ΠΉ-вСроятно няма Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Runspace. Но Π·Π° скриптовС Π·Π° дСсСтки хиляди ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚ΡƒΠΊ: 
Начало Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° PowerShell Runspaces: Част 1

Какво Π΄Π°Π²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Runspace:

  • скорост Ρ‡Ρ€Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° списъка с изпълнСни ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ,
  • ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ изпълнСниС Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ,
  • сигурност.

Π•Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Runspace ΠΏΠΎΠΌΠ°Π³Π°:

β€žΠ‘ΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π·Π° прослСдяванС във vSphere. Π’ΡŠΠ² vCenter Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ коя VM консумира ΠΏΠΎΠ²Π΅Ρ‡Π΅ рСсурси Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅. Π—Π° щастиС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ±Π΅Ρ€Π΅Ρ‚Π΅ Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° PowerShell.
Π©Π΅ сподСля скрипт, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° систСмнитС администратори Π½Π° VMware Π±ΡŠΡ€Π·ΠΎ Π΄Π° Ρ‚ΡŠΡ€ΡΡΡ‚ във vCenter ΠΈ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ списък с Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини с Π΄Π°Π½Π½ΠΈ Π·Π° тяхното срСдно ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅.  
Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° пространства Π·Π° изпълнСниС Π½Π° PowerShell, Π·Π° Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° всСки ESXi хост Π΄Π° ΡΡŠΠ±ΠΈΡ€Π° информация Π·Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΎΡ‚ собствСнитС си Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ пространство Π·Π° изпълнСниС ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π΄Π° Π΄ΠΎΠΊΠ»Π°Π΄Π²Π° Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅Ρ‚ΠΎ. Π’ΠΎΠ²Π° позволява Π½Π° PowerShell Π΄Π° затваря Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ задания, вмСсто Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡ€Π΅Π· хостовС ΠΈ Π΄Π° Ρ‡Π°ΠΊΠ° всСки Π΄Π° изпълни заявката си.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: Как Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ I/O Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π½Π° Ρ‚Π°Π±Π»ΠΎ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ESXi

Π’ случая ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Runspace Π²Π΅Ρ‡Π΅ Π½Π΅ Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½:

β€žΠžΠΏΠΈΡ‚Π²Π°ΠΌ сС Π΄Π° напиша скрипт, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΠ±ΠΈΡ€Π° ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ VM ΠΈ записва Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ ΠΈΠΌΠ° доста VM ΠΈ Π½Π° Π΅Π΄Π½Π° машина сС ΠΈΠ·Ρ€Π°Π·Ρ…ΠΎΠ΄Π²Π°Ρ‚ 5-8 сСкунди. 

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: Многонишков PowerCLI с RunspacePool

Π’ΡƒΠΊ Ρ‰Π΅ Π²ΠΈ трябва Get-View, Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към Π½Π΅Π³ΠΎ. 

Π’Ρ‚ΠΎΡ€ΠΈ Π΅Ρ‚Π°ΠΏ: Get-View

Π—Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π·Π°Ρ‰ΠΎ Get-View Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½, струва си Π΄Π° си ΠΏΡ€ΠΈΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ работят ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ΠΈΡ‚Π΅ ΠΊΠ°Ρ‚ΠΎ цяло. 

ΠšΡ€Π°Ρ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° информация, Π±Π΅Π· Π΄Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ·ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ справочници Π·Π° API ΠΈ Π΄Π° ΠΏΡ€Π΅ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Ρ‚Π΅ слСдващото ΠΊΠΎΠ»Π΅Π»ΠΎ. Π’ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π² старитС Π΄Π½ΠΈ ΠΎΡ‚Π½Π΅ΠΌΠ°ΡˆΠ΅ сто ΠΈΠ»ΠΈ Π΄Π²Π° Ρ€Π΅Π΄Π° ΠΊΠΎΠ΄, PowerShell Π²ΠΈ позволява Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ с Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°. НиС ΠΏΠ»Π°Ρ‰Π°ΠΌΠ΅ Π·Π° Ρ‚ΠΎΠ²Π° удобство с Π±ΡŠΡ€Π·ΠΈΠ½Π°. Π’ самитС ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ΠΈ няма магия: ΡΡŠΡ‰ΠΈΡΡ‚ скрипт, Π½ΠΎ Π½Π° ΠΏΠΎ-ниско Π½ΠΈΠ²ΠΎ, написан ΠΎΡ‚ ΡƒΠΌΠ΅Π»ΠΈΡ‚Π΅ Ρ€ΡŠΡ†Π΅ Π½Π° майстор ΠΎΡ‚ ΡΠ»ΡŠΠ½Ρ‡Π΅Π²Π° Индия.

Π‘Π΅Π³Π°, Π·Π° сравнСниС с Get-View, Π½Π΅ΠΊΠ° Π²Π·Π΅ΠΌΠ΅ΠΌ cmdlet Get-VM: Ρ‚ΠΎΠΉ ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина ΠΈ Π²Ρ€ΡŠΡ‰Π° ΡΡŠΡΡ‚Π°Π²Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚, тоСст ΠΏΡ€ΠΈΠΊΠ°Ρ‡Π²Π° Π΄Ρ€ΡƒΠ³ΠΈ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ към Π½Π΅Π³ΠΎ: VMHost, Datastore ΠΈ Ρ‚.Π½.  

Get-View Π½Π° Π½Π΅Π³ΠΎΠ²ΠΎ място Π½Π΅ добавя Π½ΠΈΡ‰ΠΎ Π½Π΅Π½ΡƒΠΆΠ½ΠΎ към Π²ΡŠΡ€Π½Π°Ρ‚ΠΈΡ ΠΎΠ±Π΅ΠΊΡ‚. ОсвСн Ρ‚ΠΎΠ²Π° Π½ΠΈ позволява стриктно Π΄Π° посочим ΠΊΠ°ΠΊΠ²Π° информация Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ улСсни изходния ΠΎΠ±Π΅ΠΊΡ‚. Π’ Windows Server ΠΊΠ°Ρ‚ΠΎ цяло ΠΈ Π² Hyper-V Π² частност cmdlet Get-WMIObject Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π΅Π½ Π°Π½Π°Π»ΠΎΠ³ - идСята Π΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΡΡŠΡ‰Π°Ρ‚Π°.

Get-View Π΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π΅Π½ Π·Π° Ρ€ΡƒΡ‚ΠΈΠ½Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΡŠΡ€Ρ…Ρƒ Ρ‚ΠΎΡ‡ΠΊΠΎΠ²ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ. Но ΠΊΠΎΠ³Π°Ρ‚ΠΎ става Π²ΡŠΠΏΡ€ΠΎΡ Π·Π° хиляди ΠΈ дСсСтки хиляди ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΈ, Ρ‚ΠΎΠ²Π° няма Ρ†Π΅Π½Π°.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π² Π±Π»ΠΎΠ³Π° Π½Π° VMware: Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Get-View

Π‘Π΅Π³Π° Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ° всичко с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° истински случай. 

ПисанС Π½Π° скрипт Π·Π° Ρ€Π°Π·Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π½Π° VM

Π•Π΄ΠΈΠ½ Π΄Π΅Π½ ΠΌΠΎΠΉ ΠΊΠΎΠ»Π΅Π³Π° ΠΌΠ΅ ΠΏΠΎΠΌΠΎΠ»ΠΈ Π΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΠΌ нСговия скрипт. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π΅ ΠΎΠ±ΠΈΡ‡Π°ΠΉΠ½Π° Ρ€ΡƒΡ‚ΠΈΠ½Π°: Π½Π°ΠΌΠ΅Ρ€Π΅Ρ‚Π΅ всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини с Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ cloud.uuid (Π΄Π°, Ρ‚ΠΎΠ²Π° Π΅ възмоТно ΠΏΡ€ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина във vCloud Director). 

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ΄Π²Π° Π½Π° ΡƒΠΌ Π΅:

  1. Π’Π·Π΅ΠΌΠ΅Ρ‚Π΅ списък с всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини.
  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 сСкунди ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΡ‡Ρ‚ΠΈ 10k VM. Бонус Π΅ липсата Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ ΠΈ нСобходимостта ΠΎΡ‚ Ρ€ΡŠΡ‡Π½ΠΎ сортиранС Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ изисква оптимизация.

Runspaces са ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ΄Π²Π°Ρ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰, ΠΊΠΎΠ³Π°Ρ‚ΠΎ трябва Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° хост ΠΎΡ‚ 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 (Connect-VIServer с ΠΊΠ»ΡŽΡ‡ -NotDefault):

$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 Pools.  

ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΡŠΡ‚ Π΅ слСдният:

  1. ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ списък с всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини.
  2. Π’ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΈ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ cloud.uuid.
  3. Π‘ΡŠΠ±ΠΈΡ€Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ Π² Π΅Π΄ΠΈΠ½ ΠΎΠ±Π΅ΠΊΡ‚.
  4. НиС Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡ‚Π°, ΠΊΠ°Ρ‚ΠΎ Π³ΠΎ Π³Ρ€ΡƒΠΏΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎ стойността Π½Π° ΠΏΠΎΠ»Π΅Ρ‚ΠΎ CloudUUID: Ρ‚Π΅Π·ΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ броят Π½Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΈΡ‚Π΅ стойности Π΅ ΠΏΠΎ-голям ΠΎΡ‚ 1, са Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ машини, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‚ΡŠΡ€ΡΠΈΠΌ.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ скрипта:


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 ΠΎΡ‚Π½Π΅ΠΌΠ° ΠΎΡ‰Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π²Ρ€Π΅ΠΌΠ΅.
НСка ΠΏΡŠΡ€Π²ΠΎ сС справим с Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ. 

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. НС Π΅ Π±ΡŠΡ€Π·, Π·Π°Ρ‰ΠΎΡ‚ΠΎ сС Π·Π°Π½ΠΈΠΌΠ°Π²Π° със слоТни ΠΎΠ±Π΅ΠΊΡ‚ΠΈ. Π’ΡŠΠ·Π½ΠΈΠΊΠ²Π° Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Π²ΡŠΠΏΡ€ΠΎΡ: Π·Π°Ρ‰ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация ΠΈ Ρ‡ΡƒΠ΄ΠΎΠ²ΠΈΡ‰Π΅Π½ 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 сСкунди Π·Π° ΠΏΠΎΡ‡Ρ‚ΠΈ 10k ΠΎΠ±Π΅ΠΊΡ‚Π° с Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅. Π‘Ρ‚Ρ€Π°Ρ…ΠΎΡ‚Π΅Π½!

ВмСсто Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΈΡΡ‚ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ зависи ΠΎΡ‚ ΠΈΠ·Π±ΠΎΡ€Π° Π½Π° инструмСнт. ЧСсто Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС ΠΊΠ°ΠΆΠ΅ със сигурност ΠΊΠ°ΠΊΠ²ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ трябва Π΄Π° сС ΠΈΠ·Π±Π΅Ρ€Π΅, Π·Π° Π΄Π° сС постигнС Ρ‚ΠΎΠ²Π°. ВсСки ΠΎΡ‚ ΠΈΠ·Π±Ρ€ΠΎΠ΅Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ускоряванС Π½Π° скриптовС Π΅ Π΄ΠΎΠ±ΡŠΡ€ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° своята прилоТимост. Надявам сС, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π² Ρ‚Ρ€ΡƒΠ΄Π½Π°Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ основитС Π½Π° автоматизацията Π½Π° процСситС ΠΈ оптимизацията във Π²Π°ΡˆΠ°Ρ‚Π° инфраструктура.

PS: ΠΠ²Ρ‚ΠΎΡ€ΡŠΡ‚ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€ΠΈ Π½Π° всички Ρ‡Π»Π΅Π½ΠΎΠ²Π΅ Π½Π° общността Π·Π° тяхната ΠΏΠΎΠΌΠΎΡ‰ ΠΈ ΠΏΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ° ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°Ρ‚Π° Π½Π° статията. Π”ΠΎΡ€ΠΈ Ρ‚Π΅Π·ΠΈ с Π»Π°ΠΏΠΈ. И Π΄ΠΎΡ€ΠΈ Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ нямат ΠΊΡ€Π°ΠΊΠ°, ΠΊΠ°Ρ‚ΠΎ Π±ΠΎΠ° констриктор.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€