Π•ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π·Π° изправността Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ машини, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ R ΠΈ PowerShell

Π•ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π·Π° изправността Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ машини, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ R ΠΈ PowerShell

Π’Π»ΠΈΠ·Π°Π½Π΅

Π”ΠΎΠ±ΡŠΡ€ Π΄Π΅Π½. Π’Π΅Ρ‡Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ Π³ΠΎΠ΄ΠΈΠ½Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ със скрипт (ΠΈΠ»ΠΈ ΠΏΠΎ-скоро Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ скриптовС), ΠΊΠΎΠΉΡ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π·Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ машини (ΠΈ Π½Π΅ само). Π Π΅ΡˆΠΈΡ… Π΄Π° сподСля моя ΠΎΠΏΠΈΡ‚ Π² ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ ΠΈ самия ΠΊΠΎΠ΄. Надявам сС Π½Π° ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° ΠΈ Ρ‚ΠΎΠ·ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π΄Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π½Π° някого.

Π€ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° потрСбност

ИмамС ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини (ΠΎΠΊΠΎΠ»ΠΎ 1500 Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини, Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π² 3 vCenters). Π‘ΡŠΠ·Π΄Π°Π²Π°Ρ‚ сС Π½ΠΎΠ²ΠΈ ΠΈ сС ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ доста чСсто стари. Π—Π° Π΄Π° сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ€Π΅Π΄, към vCenter бяха Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ няколко потрСбитСлски ΠΏΠΎΠ»Π΅Ρ‚Π°, Π·Π° Π΄Π° сС раздСлят Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ машини Π½Π° подсистСми, Π΄Π° сС посочи Π΄Π°Π»ΠΈ са тСстови ΠΈ ΠΎΡ‚ ΠΊΠΎΠ³ΠΎ ΠΈ ΠΊΠΎΠ³Π° са създадСни. Π§ΠΎΠ²Π΅ΡˆΠΊΠΈΡΡ‚ Ρ„Π°ΠΊΡ‚ΠΎΡ€ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° машини останаха с ΠΏΡ€Π°Π·Π½ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ услоТни Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π°. Π’Π΅Π΄Π½ΡŠΠΆ Π½Π° всСки ΡˆΠ΅ΡΡ‚ мСсСца някой сС изплаши ΠΈ Π·Π°ΠΏΠΎΡ‡Π½Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²ΡŠΡ€Ρ…Ρƒ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ прСстана Π΄Π° бъдС Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π΅Π½ слСд сСдмица ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°.
Π’Π΅Π΄Π½Π°Π³Π° Π΄Π° уточня, Ρ‡Π΅ всСки Ρ€Π°Π·Π±ΠΈΡ€Π°, Ρ‡Π΅ трябва Π΄Π° ΠΈΠΌΠ° прилоТСния Π·Π° създаванС Π½Π° машини, процСс Π·Π° ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ ΠΈ Ρ‚.Π½. ΠΈ Ρ‚Π°ΠΊΠ° Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ. И Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ всички стриктно слСдват Ρ‚ΠΎΠ·ΠΈ процСс ΠΈ всичко Π΅ Π½Π°Ρ€Π΅Π΄. Π—Π° съТалСниС Ρ‚ΡƒΠΊ Π½Π΅ Π΅ Ρ‚Π°ΠΊΠ°, Π½ΠΎ Π½Π΅ Ρ‚ΠΎΠ²Π° Π΅ Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π½Π° статията :)

ΠšΠ°Ρ‚ΠΎ цяло бСшС Π²Π·Π΅Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Π° сС Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° Π½Π° корСктността Π½Π° ΠΏΠΎΠΏΡŠΠ»Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π°.
Π Π΅ΡˆΠΈΡ…ΠΌΠ΅, Ρ‡Π΅ Π΅Π΄Π½ΠΎ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ писмо със списък Π½Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ попълнСни машини Π΄ΠΎ всички ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π½ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ ΡˆΠ΅Ρ„ΠΎΠ²Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±Ρ€ΠΎ Π½Π°Ρ‡Π°Π»ΠΎ.

Π’ Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ ΠΊΠΎΠ»Π΅Π³ΠΈΡ‚Π΅ ΠΌΠΈ Π²Π΅Ρ‡Π΅ бСшС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π» скрипт Π² PowerShell, ΠΊΠΎΠΉΡ‚ΠΎ всСки Π΄Π΅Π½ ΠΏΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊ ΡΡŠΠ±ΠΈΡ€Π°ΡˆΠ΅ информация Π·Π° всички машини Π½Π° всички vCenters ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡˆΠ΅ 3 csv Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° (всСки Π·Π° своя vCenter), ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΊΠ°Ρ‡Π²Π°Ρ…Π° Π² ΠΎΠ±Ρ‰ диск. Π‘Π΅ΡˆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ Ρ‚ΠΎΠ·ΠΈ скрипт ΠΊΠ°Ρ‚ΠΎ основа ΠΈ Π΄Π° Π³ΠΎ допълним с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π΅Π·ΠΈΠΊΠ° R, с ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ°Ρ…ΠΌΠ΅ извСстСн ΠΎΠΏΠΈΡ‚.

Π’ процСса Π½Π° Ρ„ΠΈΠ½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ информация ΠΏΠΎ ΠΏΠΎΡ‰Π°Ρ‚Π°, Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ с основна ΠΈ историчСска Ρ‚Π°Π±Π»ΠΈΡ†Π° (ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎ-късно), ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° vSphere рСгистрационни Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π·Π° Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈ дСйствитСлнитС ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ Π½Π° vm ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° тяхното създаванС.

Π—Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° са ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ IDE RStudio Desktop ΠΈ PowerShell ISE.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ сС стартира ΠΎΡ‚ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π½Π° Windows.

ОписаниС Π½Π° ΠΎΠ±Ρ‰Π°Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ°.

ΠžΠ±Ρ‰Π°Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° скриптовСтС Π΅ слСдната.

  • НиС ΡΡŠΠ±ΠΈΡ€Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Π·Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PowerShell скрипт, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ Ρ‡Ρ€Π΅Π· R, ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° Π² Π΅Π΄ΠΈΠ½ csv. ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΡ‚ΠΎ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Π΅Π·ΠΈΡ†ΠΈΡ‚Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½. (възмоТно Π΅ Π΄Π° сС управляват Π΄Π°Π½Π½ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ R към PowerShell ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ csv Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ улСснява отстраняванСто Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ сподСлянСто Π½Π° ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ с някого).
  • Използвайки R, Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°ΠΌΠ΅ Π²Π°Π»ΠΈΠ΄Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π·Π° ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π°, Ρ‡ΠΈΠΈΡ‚ΠΎ стойности провСрявамС. β€” БъздавамС Word Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° стойноститС Π½Π° Ρ‚Π΅Π·ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π° Π·Π° вмъкванС Π² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΡ‚ΠΎ писмо, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΡŠΡ‚ Π½Π° Π²ΡŠΠΏΡ€ΠΎΡΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠ»Π΅Π³ΠΈΡ‚Π΅ β€žΠΠ΅, Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° попълня Ρ‚ΠΎΠ²Π°?β€œ
  • Π—Π°Ρ€Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Π·Π° всички VM ΠΎΡ‚ csv с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R, създавамС Ρ€Π°ΠΌΠΊΠ° с Π΄Π°Π½Π½ΠΈ, ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°ΠΌΠ΅ Π½Π΅Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΈ създавамС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π΅Π½ xlsx Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π° информация Π·Π° всички VM, която ΠΊΠ°Ρ‡Π²Π°ΠΌΠ΅ Π² сподСлСн рСсурс.
  • ΠŸΡ€ΠΈΠ»Π°Π³Π°ΠΌΠ΅ всички ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π° корСктността Π½Π° ΠΏΠΎΠΏΡŠΠ»Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π° към Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° с Π΄Π°Π½Π½ΠΈ Π·Π° всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини ΠΈ създавамС Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° само Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ попълнСни ΠΏΠΎΠ»Π΅Ρ‚Π° (ΠΈ само Ρ‚Π΅Π·ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π°).
  • Π˜Π·ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ получСния списък с Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π½Π° Π΄Ρ€ΡƒΠ³ скрипт Π½Π° PowerShell, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΏΡ€Π΅Π³Π»Π΅Π΄Π° рСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° vCenter Π·Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π·Π° създаванС Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° посочим ΠΎΡ‡Π°ΠΊΠ²Π°Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° създаванС Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина ΠΈ прСдвидСния ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π». Π’ΠΎΠ²Π° Π΅ Π·Π° случая, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ ΠΏΡ€ΠΈΠ·Π½Π°Π²Π° чия Π΅ ΠΊΠΎΠ»Π°Ρ‚Π°. Π’ΠΎΠ·ΠΈ скрипт Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π±ΡŠΡ€Π·ΠΎ, особСно Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ рСгистрационни Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ само послСднитС 2 сСдмици ΠΈ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Π΅Π½ процСс, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈ позволява Π΄Π° Ρ‚ΡŠΡ€ΡΠΈΡ‚Π΅ информация Π·Π° няколко Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΈΡΡ‚ скрипт ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΈ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Π·Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ. ДобавямС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° Π² csv, ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π² R.
  • НиС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ красиво Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½ xlsx Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΏΠΎΠΏΡŠΠ»Π½Π΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅Ρ‚Π° Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½ΠΈ Π² Ρ‡Π΅Ρ€Π²Π΅Π½ΠΎ, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ към някои ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΈ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ посочСни Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½ΠΈΡ‚Π΅ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° създаванС Π½Π° VM.
  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΈΠΌΠ΅ΠΉΠ», към ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΈΠΊΠ°Ρ‡Π²Π°ΠΌΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с описаниС Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΈΡ‚Π΅ стойности Π½Π° ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π°, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π° с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ попълнСни ΠΏΠΎΠ»Π΅Ρ‚Π°. Π’ тСкста посочвамС общия Π±Ρ€ΠΎΠΉ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ създадСни Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини, Π²Ρ€ΡŠΠ·ΠΊΠ° към сподСлСн рСсурс ΠΈ ΠΌΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΎΠ½Π½Π° снимка. Ако няма Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ попълнСни VM, ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ Π΄Ρ€ΡƒΠ³ΠΎ писмо с ΠΏΠΎ-щастлива ΠΌΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΎΠ½Π½Π° снимка.
  • НиС записвамС Π΄Π°Π½Π½ΠΈ Π·Π° всички VM Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π½Π° SQL Server, ΠΊΠ°Ρ‚ΠΎ Π²Π·Π΅ΠΌΠ°ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ внСдрСния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π½Π° историчСски Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ (ΠΌΠ½ΠΎΠ³ΠΎ интСрСсСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ - Π·Π° ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΏΠΎ-късно)

Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ скриптовС

Π“Π»Π°Π²Π΅Π½ Ρ„Π°ΠΉΠ» с R ΠΊΠΎΠ΄

# ΠŸΡƒΡ‚ΡŒ ΠΊ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ (Π½ΡƒΠΆΠ½ΠΎ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Π²ΠΈΠ½Π΄ΠΎΠ²Ρ‹ΠΉ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π·Π°Π΄Π°Π½ΠΈΠΉ)
setwd("C:ScriptsgetVm")
#### ΠŸΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ####
library(tidyverse)
library(xlsx)
library(mailR)
library(rmarkdown)
##### ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΡƒΡ‚ΠΈ ΠΊ исходным Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ #####
source(file = "const.R", local = T, encoding = "utf-8")
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ сущСствованиС Ρ„Π°ΠΉΠ»Π° со всСми Π’Πœ ΠΈ удаляСм, Ссли Π΅ΡΡ‚ΡŒ.
if (file.exists(filenameVmCreationRules)) {file.remove(filenameVmCreationRules)}
#### Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ вордовский Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с допустимыми полями
render("VM_name_rules.Rmd",
output_format = word_document(),
output_file = filenameVmCreationRules)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ сущСствованиС Ρ„Π°ΠΉΠ»Π° со всСми Π’Πœ ΠΈ удаляСм, Ссли Π΅ΡΡ‚ΡŒ
if (file.exists(allVmXlsxPath)) {file.remove(allVmXlsxPath)}
#### Π—Π°Π±ΠΈΡ€Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ всСм машинам Ρ‡Π΅Ρ€Π΅Π· PowerShell скрипт. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ csv.
system(paste0("powershell -File ", getVmPsPath))
# ΠŸΠΎΠ»Π½Ρ‹ΠΉ df
fullXslx_df <- allVmXlsxPath %>% 
read.csv2(stringsAsFactors = FALSE)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ
full_df <- fullXslx_df %>%
mutate(
# Π‘Π½Π°Ρ‡Π°Π»Π° ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ всС лишниС ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ табуляции, ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ Π·Π°ΠΏΡΡ‚ΡƒΡŽ, ΠΏΠΎΡ‚ΠΎΠΌ провСряСм Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² допустимыС значСния,
isSubsystemCorrect = Subsystem %>% 
gsub("[[:space:]]", "", .) %>% 
str_split(., ",") %>% 
map(function(x) (all(x %in% AllowedValues$Subsystem))) %>%
as.logical(),
isOwnerCorrect = Owner %in% AllowedValues$Owner,
isCategoryCorrect = Category %in% AllowedValues$Category,
isCreatorCorrect = (!is.na(Creator) & Creator != ''),
isCreation.DateCorrect = map(Creation.Date, IsDate)
)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ сущСствованиС Ρ„Π°ΠΉΠ»Π° со всСми Π’Πœ ΠΈ удаляСм, Ссли Π΅ΡΡ‚ΡŒ.
if (file.exists(filenameAll)) {file.remove(filenameAll)}
#### Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ xslx Ρ„Π°ΠΉΠ» с ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠΌ ####
# ΠžΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ лист
full_df %>% write.xlsx(file=filenameAll,
sheetName=names[1],
col.names=TRUE,
row.names=FALSE,
append=FALSE)
#### Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ xslx Ρ„Π°ΠΉΠ» с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ полями ####
# Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ df
incorrect_df <- full_df %>%
select(VM.Name, 
IP.s, 
Owner,
Subsystem,
Creator,
Category,
Creation.Date,
isOwnerCorrect, 
isSubsystemCorrect, 
isCategoryCorrect,
isCreatorCorrect,
vCenter.Name) %>%
filter(isSubsystemCorrect == F | 
isOwnerCorrect == F |
isCategoryCorrect == F |
isCreatorCorrect == F)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ сущСствованиС Ρ„Π°ΠΉΠ»Π° со всСми Π’Πœ ΠΈ удаляСм, Ссли Π΅ΡΡ‚ΡŒ.
if (file.exists(filenameIncVM)) {file.remove(filenameIncVM)}
# БохраняСм список VM с Π½Π΅Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ полями Π² csv
incorrect_df %>%
select(VM.Name) %>%
write_csv2(path = filenameIncVM, append = FALSE)
# Π€ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ для вставки Π² ΠΏΠΎΡ‡Ρ‚Ρƒ
incorrect_df_filtered <- incorrect_df %>% 
select(VM.Name, 
IP.s, 
Owner, 
Subsystem, 
Category,
Creator,
vCenter.Name,
Creation.Date
)
# Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ количСство строк
numberOfRows <- nrow(incorrect_df)
#### Начало условия ####
# Π”Π°Π»ΡŒΡˆΠ΅ Π»ΠΈΠ±ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ поля, Π»ΠΈΠ±ΠΎ Π½Π΅Ρ‚.
# Если Π΅ΡΡ‚ΡŒ - запускаСм Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ скрипт
if (numberOfRows > 0) {
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ сущСствованиС Ρ„Π°ΠΉΠ»Π° с создатСлями ΠΈ удаляСм, Ссли Π΅ΡΡ‚ΡŒ.
if (file.exists(creatorsFilePath)) {file.remove(creatorsFilePath)}
# ЗапускаСм PowerShell скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΉΠ΄Ρ‘Ρ‚ создатСлСй Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… VM. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ csv.
system(paste0("powershell -File ", getCreatorsPath))
# Π§ΠΈΡ‚Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» с создатСлями
creators_df <- creatorsFilePath %>%
read.csv2(stringsAsFactors = FALSE)
# Π€ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ для вставки Π² ΠΏΠΎΡ‡Ρ‚Ρƒ, добавляСм Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с создатСлями
incorrect_df_filtered <- incorrect_df_filtered %>% 
select(VM.Name, 
IP.s, 
Owner, 
Subsystem, 
Category,
Creator,
vCenter.Name,
Creation.Date
) %>% 
left_join(creators_df, by = "VM.Name") %>% 
rename(`ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ` = CreatedBy, 
`ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠ°Ρ Π΄Π°Ρ‚Π° создания` = CreatedOn)  
# Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Π΅Π»ΠΎ письма
emailBody <- paste0(
'<html>
<h3>Π”ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ.</h3>
<p>ΠŸΠΎΠ»Π½ΡƒΡŽ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ машинам Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° дискС H: Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚:<p>
<p>\server.ruVM', sourceFileFormat, '</p>
<p>Π’Π°ΠΊΠΆΠ΅ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ список Π’Πœ с <strong>Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ</strong> полями. ВсСго ΠΈΡ… <strong>', numberOfRows,'</strong>.</p>
<p>Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ появилось 2 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ. <strong>ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ</strong> ΠΈ <strong>ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠ°Ρ Π΄Π°Ρ‚Π° создания</strong>, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π»ΠΎΠ³ΠΎΠ² vCenter Π·Π° послСдниС 2 Π½Π΅Π΄Π΅Π»ΠΈ</p>
<p>ΠŸΡ€ΠΎΡΡŒΠ±Π° создатСлСй машин ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поля ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. ΠŸΡ€Π°Π²ΠΈΠ»Π° заполнСния ΠΏΠΎΠ»Π΅ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ</p>
<p><img src="data/meme.jpg"></p>
</html>'
)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ сущСствованиС Ρ„Π°ΠΉΠ»Π°
if (file.exists(filenameIncorrect)) {file.remove(filenameIncorrect)}
# Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΡ€Π°ΡΠΈΠ²ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ ΠΈ Ρ‚.Π΄.
source(file = "email.R", local = T, encoding = "utf-8")
#### Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ письмо с ΠΏΠ»ΠΎΡ…ΠΎ подписанными машинами ####
send.mail(from = emailParams$from,
to = emailParams$to,
subject = "Π’Πœ с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ полями",
body = emailBody,
encoding = "utf-8",
html = TRUE,
inline = TRUE,
smtp = emailParams$smtpParams,
authenticate = TRUE,
send = TRUE,
attach.files = c(filenameIncorrect, filenameVmCreationRules),
debug = FALSE)
#### Π”Π°Π»ΡŒΡˆΠ΅ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Π±Π»ΠΎΠΊ, Ссли Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π’Πœ ####
} else {
# Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Π΅Π»ΠΎ письма
emailBody <- paste0(
'<html>
<h3>Π”ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ</h3>
<p>ΠŸΠΎΠ»Π½ΡƒΡŽ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ машинам Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° дискС H: Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚:<p>
<p>\server.ruVM', sourceFileFormat, '</p>
<p>Π’Π°ΠΊΠΆΠ΅, Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, всС поля Π’Πœ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹</p>
<p><img src="data/meme_correct.jpg"></p>
</html>'
)
#### Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ письмо Π±Π΅Π· ΠΏΠ»ΠΎΡ…ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… VM ####
send.mail(from = emailParams$from,
to = emailParams$to,
subject = "Бводная информация",
body = emailBody,
encoding = "utf-8",
html = TRUE,
inline = TRUE,
smtp = emailParams$smtpParams,
authenticate = TRUE,
send = TRUE,
debug = FALSE)
}
####### ЗаписываСм Π΄Π°Π½Π½Ρ‹Π΅ Π² Π‘Π” #####
source(file = "DB.R", local = T, encoding = "utf-8")

Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° списък с vm Π² PowerShell

# Π”Π°Π½Π½Ρ‹Π΅ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
$vCenterNames = @(
"vcenter01", 
"vcenter02", 
"vcenter03"
)
$vCenterUsername = "myusername"
$vCenterPassword = "mypassword"
$filename = "C:ScriptsgetVmdataallvmall-vm-$(get-date -f yyyy-MM-dd).csv"
$destinationSMB = "server.rumyfolder$vm"
$IP0=""
$IP1=""
$IP2=""
$IP3=""
$IP4=""
$IP5=""
# ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎ всСм vCenter, Ρ‡Ρ‚ΠΎ содСрТатся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π‘ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ссли Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅)
Connect-VIServer -Server $vCenterNames -User $vCenterUsername -Password $vCenterPassword
write-host ""
# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΏΠΎ всСм vCenter-Π°ΠΌ
function Get-VMinventory {
# Π’ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ списко всСх Π’Πœ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²
$AllVM = Get-VM | Sort Name
$cnt = $AllVM.Count
$count = 1
# НачинаСм Ρ†ΠΈΠΊΠ» ΠΏΠΎ всСм Π’Πœ ΠΈ собираСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
foreach ($vm in $AllVM) {
$StartTime = $(get-date)
$IP0 = $vm.Guest.IPAddress[0]
$IP1 = $vm.Guest.IPAddress[1]
$IP2 = $vm.Guest.IPAddress[2]
$IP3 = $vm.Guest.IPAddress[3]
$IP4 = $vm.Guest.IPAddress[4]
$IP5 = $vm.Guest.IPAddress[5]
If ($IP0 -ne $null) {If ($IP0.Contains(":") -ne 0) {$IP0=""}}
If ($IP1 -ne $null) {If ($IP1.Contains(":") -ne 0) {$IP1=""}}
If ($IP2 -ne $null) {If ($IP2.Contains(":") -ne 0) {$IP2=""}}
If ($IP3 -ne $null) {If ($IP3.Contains(":") -ne 0) {$IP3=""}}
If ($IP4 -ne $null) {If ($IP4.Contains(":") -ne 0) {$IP4=""}}
If ($IP5 -ne $null) {If ($IP5.Contains(":") -ne 0) {$IP5=""}}
$cluster = $vm | Get-Cluster | Select-Object -ExpandProperty name  
$Bootime = $vm.ExtensionData.Runtime.BootTime
$TotalHDDs = $vm.ProvisionedSpaceGB -as [int]
$CreationDate = $vm.CustomFields.Item("CreationDate") -as [string]
$Creator = $vm.CustomFields.Item("Creator") -as [string]
$Category = $vm.CustomFields.Item("Category") -as [string]
$Owner = $vm.CustomFields.Item("Owner") -as [string]
$Subsystem = $vm.CustomFields.Item("Subsystem") -as [string]
$IPS = $vm.CustomFields.Item("IP") -as [string]
$vCPU = $vm.NumCpu
$CorePerSocket = $vm.ExtensionData.config.hardware.NumCoresPerSocket
$Sockets = $vCPU/$CorePerSocket
$Id = $vm.Id.Split('-')[2] -as [int]
# Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
$Vmresult = New-Object PSObject
$Vmresult | add-member -MemberType NoteProperty -Name "Id" -Value $Id   
$Vmresult | add-member -MemberType NoteProperty -Name "VM Name" -Value $vm.Name  
$Vmresult | add-member -MemberType NoteProperty -Name "Cluster" -Value $cluster  
$Vmresult | add-member -MemberType NoteProperty -Name "Esxi Host" -Value $VM.VMHost  
$Vmresult | add-member -MemberType NoteProperty -Name "IP Address 1" -Value $IP0
$Vmresult | add-member -MemberType NoteProperty -Name "IP Address 2" -Value $IP1
$Vmresult | add-member -MemberType NoteProperty -Name "IP Address 3" -Value $IP2
$Vmresult | add-member -MemberType NoteProperty -Name "IP Address 4" -Value $IP3
$Vmresult | add-member -MemberType NoteProperty -Name "IP Address 5" -Value $IP4
$Vmresult | add-member -MemberType NoteProperty -Name "IP Address 6" -Value $IP5
$Vmresult | add-member -MemberType NoteProperty -Name "vCPU" -Value $vCPU
$Vmresult | Add-Member -MemberType NoteProperty -Name "CPU Sockets" -Value $Sockets
$Vmresult | Add-Member -MemberType NoteProperty -Name "Core per Socket" -Value $CorePerSocket
$Vmresult | add-member -MemberType NoteProperty -Name "RAM (GB)" -Value $vm.MemoryGB
$Vmresult | add-member -MemberType NoteProperty -Name "Total-HDD (GB)" -Value $TotalHDDs
$Vmresult | add-member -MemberType NoteProperty -Name "Power State" -Value $vm.PowerState
$Vmresult | add-member -MemberType NoteProperty -Name "OS" -Value $VM.ExtensionData.summary.config.guestfullname  
$Vmresult | Add-Member -MemberType NoteProperty -Name "Boot Time" -Value $Bootime
$Vmresult | add-member -MemberType NoteProperty -Name "VMTools Status" -Value $vm.ExtensionData.Guest.ToolsStatus  
$Vmresult | add-member -MemberType NoteProperty -Name "VMTools Version" -Value $vm.ExtensionData.Guest.ToolsVersion  
$Vmresult | add-member -MemberType NoteProperty -Name "VMTools Version Status" -Value $vm.ExtensionData.Guest.ToolsVersionStatus  
$Vmresult | add-member -MemberType NoteProperty -Name "VMTools Running Status" -Value $vm.ExtensionData.Guest.ToolsRunningStatus  
$Vmresult | add-member -MemberType NoteProperty -Name "Creation Date" -Value $CreationDate
$Vmresult | add-member -MemberType NoteProperty -Name "Creator" -Value $Creator
$Vmresult | add-member -MemberType NoteProperty -Name "Category" -Value $Category
$Vmresult | add-member -MemberType NoteProperty -Name "Owner" -Value $Owner
$Vmresult | add-member -MemberType NoteProperty -Name "Subsystem" -Value $Subsystem
$Vmresult | add-member -MemberType NoteProperty -Name "IP's" -Value $IPS
$Vmresult | add-member -MemberType NoteProperty -Name "vCenter Name" -Value $vm.Uid.Split('@')[1].Split(':')[0]  
# Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΎΠ±Ρ‰Π΅Π΅ ΠΈ ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ врСмя выполнСния ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° экран Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Использовалось для тСстирования, Π½ΠΎ ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ оказалось ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.
$elapsedTime = $(get-date) - $StartTime
$totalTime = "{0:HH:mm:ss}" -f ([datetime]($elapsedTime.Ticks*($cnt - $count)))
clear-host
Write-Host "Processing" $count "from" $cnt 
Write-host "Progress:" ([math]::Round($count/$cnt*100, 2)) "%" 
Write-host "You have about " $totalTime "for cofee"
Write-host ""
$count++
# Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ†ΠΈΠΊΠ» "Π·Π½Π°Π»" Ρ‡Ρ‚ΠΎ являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π°
$Vmresult
}
}
# Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΡƒΡŽΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ сразу Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² csv
$allVm = Get-VMinventory | Export-CSV -Path $filename -NoTypeInformation -UseCulture -Force
# ΠŸΡ‹Ρ‚Π°Π΅ΠΌΡΡ Π²Ρ‹Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ Π½Π°ΠΌ мСсто ΠΈ, Π² случаС ошибки, пишСм Π»ΠΎΠ³.
try
{
Copy-Item $filename -Destination $destinationSMB -Force -ErrorAction SilentlyContinue
}
catch
{
$error | Export-CSV -Path $filename".error" -NoTypeInformation -UseCulture -Force
}

PowerShell скрипт, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·Π²Π»ΠΈΡ‡Π° ΠΎΡ‚ рСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини ΠΈ Π΄Π°Ρ‚Π°Ρ‚Π° Π½Π° тяхното създаванС

# ΠŸΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒ список VM
$VMfilePath = "C:ScriptsgetVmcreators_VMcreators_VM_$(get-date -f yyyy-MM-dd).csv"
# ΠŸΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
$filePath = "C:ScriptsgetVmdatacreatorscreators-$(get-date -f yyyy-MM-dd).csv"
# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π²ΠΎΠΊΡ€Ρ„Π»ΠΎΡƒ
Workflow GetCreators-Wf
{
# ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ скрипта
param([string[]]$VMfilePath)
# ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ workflow
$vCenterUsername = "myusername"
$vCenterPassword = "mypassword"
$daysToLook = 14
$start = (get-date).AddDays(-$daysToLook)
$finish = get-date
# ЗначСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ вписаны Π² csv для машин, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ
$UnknownUser = "UNKNOWN"
$UnknownCreatedTime = "0000-00-00"
# ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны Π²ΠΎ всём скриптС.
$vCenterNames = @(
"vcenter01", 
"vcenter02", 
"vcenter03"
)
# ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список VM ΠΈΠ· csv ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹
$list = Import-Csv $VMfilePath -UseCulture | select -ExpandProperty VM.Name
# Π¦ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ (ΠΏΠΎ 5 машин Π·Π° Ρ€Π°Π·)
foreach -parallel ($row in $list)
{
# Π­Ρ‚ΠΎ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΈΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свои ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· $Using
InlineScript {
# ВрСмя Π½Π°Ρ‡Π°Π»Π° выполнСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°
$StartTime = $(get-date)
Write-Host ""
Write-Host "Processing $Using:row started at $StartTime"
Write-Host ""
# ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ информация ΠΎ Π½Ρ‘ΠΌ Π½Π΅ мСшалась Π² консоли
$con = Connect-VIServer -Server $Using:vCenterNames -User $Using:vCenterUsername -Password $Using:vCenterPassword
# ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ vm
$vm = Get-VM -Name $Using:row
# НиТС 2 ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Одна с Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, вторая - Π±Π΅Π·. МоТно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΌ,
$Event = $vm | Get-VIEvent -Start $Using:start -Finish $Using:finish -Types Info | Where { $_.Gettype().Name -eq "VmBeingDeployedEvent" -or $_.Gettype().Name -eq "VmCreatedEvent" -or $_.Gettype().Name -eq "VmRegisteredEvent" -or $_.Gettype().Name -eq "VmClonedEvent"}
# $Event = $vm | Get-VIEvent -Types Info | Where { $_.Gettype().Name -eq "VmBeingDeployedEvent" -or $_.Gettype().Name -eq "VmCreatedEvent" -or $_.Gettype().Name -eq "VmRegisteredEvent" -or $_.Gettype().Name -eq "VmClonedEvent"}
# ЗаполняСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π»ΠΈ Π² Π»ΠΎΠ³Π°Ρ… Π½Π°ΠΉΡ‚ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ
If (($Event | Measure-Object).Count -eq 0){
$User = $Using:UnknownUser
$Created = $Using:UnknownCreatedTime
$CreatedFormat = $Using:UnknownCreatedTime
} Else {
If ($Event.Username -eq "" -or $Event.Username -eq $null) {
$User = $Using:UnknownUser
} Else {
$User = $Event.Username
} # Else
$CreatedFormat = $Event.CreatedTime
# Один ΠΈΠ· ΠΊΠΎΠ»Π»Π΅Π³ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ просил, Ρ‡Ρ‚ΠΎΠ±Ρ‹ врСмя Π±Ρ‹Π»ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, поэтому Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ. А Π² Π‘Π” ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.
$Created = $Event.CreatedTime.ToString('yyyy-MM-dd')
} # Else
Write-Host "Creator for $vm is $User. Creating object."
# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ДобавляСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.
$Vmresult = New-Object PSObject
$Vmresult | add-member -MemberType NoteProperty -Name "VM Name" -Value $vm.Name  
$Vmresult | add-member -MemberType NoteProperty -Name "CreatedBy" -Value $User
$Vmresult | add-member -MemberType NoteProperty -Name "CreatedOn" -Value $CreatedFormat
$Vmresult | add-member -MemberType NoteProperty -Name "CreatedOnFormat" -Value $Created           
# Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹
$Vmresult
} # Inline
} # ForEach
}
$Creators = GetCreators-Wf $VMfilePath
# ЗаписываСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ„Π°ΠΉΠ»
$Creators | select 'VM Name', CreatedBy, CreatedOn | Export-Csv -Path $filePath -NoTypeInformation -UseCulture -Force
Write-Host "CSV generetion finisghed at $(get-date). PROFIT"

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»Π½ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ заслуТава Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° XLSX, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ възмоТно прикачСният Ρ„Π°ΠΉΠ» към писмото Π΄Π° бъдС ясно Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½ (ΠΊΠ°ΠΊΡ‚ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ харСсва), Π° Π½Π΅ само CSV Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° красив xlsx Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ със списък Π½Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ попълнСни машини

# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ
# Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния : "xls" ΠΈ "xlsx"
wb<-createWorkbook(type="xlsx")
# Π‘Ρ‚ΠΈΠ»ΠΈ для ΠΈΠΌΡ‘Π½ рядов ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…
TABLE_ROWNAMES_STYLE <- CellStyle(wb) + Font(wb, isBold=TRUE)
TABLE_COLNAMES_STYLE <- CellStyle(wb) + Font(wb, isBold=TRUE) +
Alignment(wrapText=TRUE, horizontal="ALIGN_CENTER") +
Border(color="black", position=c("TOP", "BOTTOM"), 
pen=c("BORDER_THIN", "BORDER_THICK"))
# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ лист
sheet <- createSheet(wb, sheetName = names[2])
# ДобавляСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ
addDataFrame(incorrect_df_filtered, 
sheet, startRow=1, startColumn=1,  row.names=FALSE, byrow=FALSE,
colnamesStyle = TABLE_COLNAMES_STYLE,
rownamesStyle = TABLE_ROWNAMES_STYLE)
# МСняСм ΡˆΠΈΡ€ΠΈΠ½Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ автоматичСским
autoSizeColumn(sheet = sheet, colIndex=c(1:ncol(incorrect_df)))
# ДобавляСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹
addAutoFilter(sheet, cellRange = "C1:G1")
# ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΡ‚ΠΈΠ»ΡŒ
fo2 <- Fill(foregroundColor="red")
cs2 <- CellStyle(wb, 
fill = fo2, 
dataFormat = DataFormat("@"))
# Находим ряды с Π½Π΅Π²Π΅Ρ€Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ Π’Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΈ примСняСм ΠΊ Π½ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ
rowsOwner <- getRows(sheet, rowIndex = (which(!incorrect_df$isOwnerCorrect) + 1))
cellsOwner <- getCells(rowsOwner, colIndex = which( colnames(incorrect_df_filtered) == "Owner" )) 
lapply(names(cellsOwner), function(x) setCellStyle(cellsOwner[[x]], cs2))
# Находим ряды с Π½Π΅Π²Π΅Ρ€Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ ΠŸΠΎΠ΄ΡΠΈΡΡ‚Π΅ΠΌΡ‹ ΠΈ примСняСм ΠΊ Π½ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ
rowsSubsystem <- getRows(sheet, rowIndex = (which(!incorrect_df$isSubsystemCorrect) + 1))
cellsSubsystem <- getCells(rowsSubsystem, colIndex = which( colnames(incorrect_df_filtered) == "Subsystem" )) 
lapply(names(cellsSubsystem), function(x) setCellStyle(cellsSubsystem[[x]], cs2))
# Аналогично ΠΏΠΎ ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ
rowsCategory <- getRows(sheet, rowIndex = (which(!incorrect_df$isCategoryCorrect) + 1))
cellsCategory <- getCells(rowsCategory, colIndex = which( colnames(incorrect_df_filtered) == "Category" )) 
lapply(names(cellsCategory), function(x) setCellStyle(cellsCategory[[x]], cs2))
# Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ
rowsCreator <- getRows(sheet, rowIndex = (which(!incorrect_df$isCreatorCorrect) + 1))
cellsCreator <- getCells(rowsCreator, colIndex = which( colnames(incorrect_df_filtered) == "Creator" )) 
lapply(names(cellsCreator), function(x) setCellStyle(cellsCreator[[x]], cs2))
# БохраняСм Ρ„Π°ΠΉΠ»
saveWorkbook(wb, filenameIncorrect)

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:

Π•ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π·Π° изправността Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ машини, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ R ΠΈ PowerShell

ИмашС ΠΈ интСрСсСн нюанс относно настройката Π½Π° ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‡ΠΈΠΊΠ° Π½Π° Windows. Π‘Π΅ΡˆΠ΅ нСвъзмоТно Π΄Π° сС намСрят ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²Π° ΠΈ настройки, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всичко Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ трябва. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° бСшС ΠΎΡ‚ΠΊΡ€ΠΈΡ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° R, която сама създава Π·Π°Π΄Π°Ρ‡Π° Π·Π° стартиранС Π½Π° R скрипт ΠΈ Π΄ΠΎΡ€ΠΈ Π½Π΅ забравя Π·Π° Π»ΠΎΠ³ Ρ„Π°ΠΉΠ»Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ‚Π΅ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Ρ€ΡŠΡ‡Π½ΠΎ.

Част ΠΎΡ‚ R ΠΊΠΎΠ΄ с Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΊΠΎΠΉΡ‚ΠΎ създава Π·Π°Π΄Π°Ρ‡Π° Π² Windows Scheduler

library(taskscheduleR)
myscript <- file.path(getwd(), "all_vm.R")
## запускаСм скрипт Ρ‡Π΅Ρ€Π΅Π· 62 сСкунды
taskscheduler_create(taskname = "getAllVm", rscript = myscript, 
schedule = "ONCE", starttime = format(Sys.time() + 62, "%H:%M"))
## запускаСм скрипт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь Π² 09:10
taskscheduler_create(taskname = "getAllVmDaily", rscript = myscript, 
schedule = "WEEKLY", 
days = c("MON", "TUE", "WED", "THU", "FRI"),
starttime = "02:00")
## удаляСм Π·Π°Π΄Π°Ρ‡ΠΈ
taskscheduler_delete(taskname = "getAllVm")
taskscheduler_delete(taskname = "getAllVmDaily")
# Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π»ΠΎΠ³ΠΈ (послСдниС 4 строчки)
tail(readLines("all_vm.log"), sep ="n", n = 4)

ΠžΡ‚Π΄Π΅Π»Π½ΠΎ Π·Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ

Π‘Π»Π΅Π΄ настройката Π½Π° скрипта Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ…Π° Π΄Π° сС появяват Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. НапримСр, исках Π΄Π° намСря Π΄Π°Ρ‚Π°Ρ‚Π°, Π½Π° която VM Π΅ ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚Π°, Π½ΠΎ рСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ във vCenter Π²Π΅Ρ‡Π΅ бяха износСни. Въй ΠΊΠ°Ρ‚ΠΎ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ поставя Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΏΠ°ΠΏΠΊΠ° всСки Π΄Π΅Π½ ΠΈ Π½Π΅ я почиства (чистим Π³ΠΎ с Ρ€ΡŠΡ†Π΅Ρ‚Π΅ си, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС сСтим), ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°Ρ‚Π΅ старитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΡŠΡ€Π²ΠΈΡ Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΠΉΡ‚ΠΎ Ρ‚Π°Π·ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π½Π΅ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π°. Но Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Π³ΠΎΡ‚ΠΈΠ½ΠΎ.

Π˜ΡΠΊΠ°Ρ… Π΄Π° създам историчСска Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.

На ΠΏΠΎΠΌΠΎΡ‰ Π΄ΠΎΠΉΠ΄Π΅ функционалността Π½Π° MS SQL SERVER - систСмно-вСрсирана Π²Ρ€Π΅ΠΌΠ΅Π½Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°. ОбикновСно сС ΠΏΡ€Π΅Π²Π΅ΠΆΠ΄Π° ΠΊΠ°Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ (Π½Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ) Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° докумСнтация Π½Π° Microsoft.

Накратко, Π½ΠΈΠ΅ създавамС Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ Ρ‰Π΅ я ΠΈΠΌΠ°ΠΌΠ΅ с вСрсия, ΠΈ SQL Server създава 2 Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π·Π° Π΄Π°Ρ‚Π° ΠΈ час Π² Ρ‚Π°Π·ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π° (Π΄Π°Ρ‚Π°Ρ‚Π°, Π½Π° която Π΅ създадСн Π·Π°ΠΏΠΈΡΡŠΡ‚ ΠΈ Π΄Π°Ρ‚Π°Ρ‚Π° Π½Π° ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅ Π½Π° записа) ΠΈ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π² която сС промСня Ρ‰Π΅ бъдС написано. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π° информация ΠΈ Ρ‡Ρ€Π΅Π· прости заявки, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ са Π΄Π°Π΄Π΅Π½ΠΈ Π² докумСнтацията, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ»ΠΈ ТизнСния Ρ†ΠΈΠΊΡŠΠ» Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина, ΠΈΠ»ΠΈ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π° Π²Ρ€Π΅ΠΌΠ΅.

ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° производитСлността транзакцията Π·Π° запис Π² Π³Π»Π°Π²Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° няма Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π½Π΅ Π·Π°Π²ΡŠΡ€ΡˆΠΈ транзакцията Π·Π° запис във Π²Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°. Π’Π΅Π·ΠΈ. Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ с голям Π±Ρ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° запис, Ρ‚Π°Π·ΠΈ функционалност трябва Π΄Π° сС ΠΏΡ€ΠΈΠ»Π°Π³Π° с повишСно Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½ΠΎ Π² нашия случай Ρ‚ΠΎΠ²Π° Π΅ наистина страхотно Π½Π΅Ρ‰ΠΎ.

Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡŠΡ‚ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ, Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° добавя ΠΌΠ°Π»ΠΊΠΎ ΠΏΠ°Ρ€Ρ‡Π΅ ΠΊΠΎΠ΄ Π² R, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π° сравнява Π½ΠΎΠ²Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° с Π΄Π°Π½Π½ΠΈ Π·Π° всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини с Ρ‚Π°Π·ΠΈ, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π° Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° записва само ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅ Π² нСя. ΠšΠΎΠ΄ΡŠΡ‚ Π½Π΅ Π΅ особСно ΡƒΠΌΠ΅Π½, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° compareDF, Π½ΠΎ Ρ‰Π΅ Π²ΠΈ прСдставя ΠΈ нСя ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

R код за запис на данни в база данни

# ΠŸΠΎΠ΄Ρ†Π΅ΠΏΠ»ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
library(odbc)
library(compareDF)
# Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚
con <- dbConnect(odbc(),
Driver = "ODBC Driver 13 for SQL Server",
Server = DBParams$server,
Database = DBParams$database,
UID = DBParams$UID,
PWD = DBParams$PWD,
Port = 1433)
#### ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°. Если Π½Π΅Ρ‚ - создаём. ####
if (!dbExistsTable(con, DBParams$TblName)) {
#### Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ####
create <- dbSendStatement(
con,
paste0(
'CREATE TABLE ',
DBParams$TblName,
'(
[Id] [int] NOT NULL PRIMARY KEY CLUSTERED,
[VM.Name] [varchar](255) NULL,
[Cluster] [varchar](255) NULL,
[Esxi.Host] [varchar](255) NULL,
[IP.Address.1] [varchar](255) NULL,
[IP.Address.2] [varchar](255) NULL,
[IP.Address.3] [varchar](255) NULL,
[IP.Address.4] [varchar](255) NULL,
[IP.Address.5] [varchar](255) NULL,
[IP.Address.6] [varchar](255) NULL,
[vCPU] [int] NULL,
[CPU.Sockets] [int] NULL,
[Core.per.Socket] [int] NULL,
[RAM..GB.] [int] NULL,
[Total.HDD..GB.] [int] NULL,
[Power.State] [varchar](255) NULL,
[OS] [varchar](255) NULL,
[Boot.Time] [varchar](255) NULL,
[VMTools.Status] [varchar](255) NULL,
[VMTools.Version] [int] NULL,
[VMTools.Version.Status] [varchar](255) NULL,
[VMTools.Running.Status] [varchar](255) NULL,
[Creation.Date] [varchar](255) NULL,
[Creator] [varchar](255) NULL,
[Category] [varchar](255) NULL,
[Owner] [varchar](255) NULL,
[Subsystem] [varchar](255) NULL,
[IP.s] [varchar](255) NULL,
[vCenter.Name] [varchar](255) NULL,
DateFrom datetime2 GENERATED ALWAYS AS ROW START NOT NULL,
DateTo datetime2 GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME (DateFrom, DateTo)
) ON [PRIMARY]
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = ', DBParams$TblHistName,'));'
)
)
# ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ запрос
dbClearResult(create)
} # if
#### Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ####
# ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ
allVM_db_con <- tbl(con, DBParams$TblName) 
#### Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ####
# Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ с Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ слуТСбныС Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ поля)
allVM_db <- allVM_db_con %>% 
select(c(-"DateTo", -"DateFrom")) %>% 
collect()
# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ со сравнСниСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎ Id
# Π£Π΄Π°Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· -, созданныС Ρ‡Π΅Ρ€Π΅Π· +, ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· - ΠΈ +
ctable_VM <- fullXslx_df %>% 
compare_df(allVM_db, 
c("Id"))
#### Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ строк ####
# Π’Ρ‹Π΄ΠΈΡ€Π°Π΅ΠΌ Id Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΎΠΊ, записи ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ 
remove_Id <- ctable_VM$comparison_df %>% 
filter(chng_type == "-") %>%
select(Id)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ записи (Ссли записСй Π½Π΅Ρ‚ - ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ)
if (remove_Id %>% nrow() > 0) {
# ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΠ΅ΠΌ шаблон для запроса Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
delete <- dbSendStatement(con, 
paste0('
DELETE 
FROM ',
DBParams$TblName,
' WHERE "Id"=?
') # paste
) # send
# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ запрос Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
dbBind(delete, remove_Id)
# ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ запрос
dbClearResult(delete)
} # if
#### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ строк ####
# ВыдСляСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ.
allVM_add <- ctable_VM$comparison_df %>% 
filter(chng_type == "+") %>% 
select(-chng_type)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈ добавляСм (Ссли Π½Π΅Ρ‚ - Π½Π΅ добавляСм)
if (allVM_add %>% nrow() > 0) {
# ПишСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ со всСми Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
dbWriteTable(con,
DBParams$TblName,
allVM_add,
overwrite = FALSE,
append = TRUE)
} # if
#### НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ дисконнСкт ####
dbDisconnect(con)

ΠžΠ±Ρ‰ΠΎ

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° сцСнария Ρ€Π΅Π΄ΡŠΡ‚ бСшС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²Π΅Π½ ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° няколко мСсСца. Понякога сС появяват Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ попълнСни VM, Π½ΠΎ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ слуТи ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠ±Ρ€ΠΎ напомнянС ΠΈ рядка VM ΠΏΠΎΠΏΠ°Π΄Π° Π² списъка Π·Π° 2 Π΄Π½ΠΈ ΠΏΠΎΠ΄Ρ€Π΅Π΄.

НаправСна Π΅ ΠΈ основа Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° историчСски Π΄Π°Π½Π½ΠΈ.

Ясно Π΅, Ρ‡Π΅ голяма част ΠΎΡ‚ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° Π½Π΅ Π½Π° коляно, Π° със спСциализиран софтуСр, Π½ΠΎ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° бСшС интСрСсна ΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΠ°ΠΆΠ΅, Π½Π΅Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½Π°.

R ΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ унивСрсалСн Π΅Π·ΠΈΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½ Π½Π΅ само Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° статистичСски ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, Π½ΠΎ ΠΈ дСйства ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ β€žΡΠ»ΠΎΠΉβ€œ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΈ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ.

Π•ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π·Π° изправността Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ машини, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ R ΠΈ PowerShell

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

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