ΠΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅
ΠΠ΅Π½Ρ Π΄ΠΎΠ±ΡΡΠΉ. Π£ΠΆΠ΅ ΠΏΠΎΠ» Π³ΠΎΠ΄Π° Ρ Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΊΡΠΈΠΏΡ (ΡΠΎΡΠ½Π΅Π΅ Π½Π°Π±ΠΎΡ ΡΠΊΡΠΈΠΏΡΠΎΠ²), Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΠΈΠΉ ΠΎΡΡΡΡΡ ΠΏΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½ (ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ). Π Π΅ΡΠΈΠ» ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΠΎΠΏΡΡΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΡΠ°ΠΌΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π Π°ΡΡΡΠΈΡΡΠ²Π°Ρ Π½Π° ΠΊΡΠΈΡΠΈΠΊΡ ΠΈ Π½Π° ΡΠΎ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π» ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠΎΠΌΡ-ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ.
Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ
ΠΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ
ΠΌΠ°ΡΠΈΠ½ Ρ Π½Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ (ΠΏΠΎΡΡΠ΄ΠΊΠ° 1500 ΠΠ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ
ΠΏΠΎ 3-ΠΌ vCenter). Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΈ ΡΠ΄Π°Π»ΡΡΡΡΡ ΡΡΠ°ΡΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ°ΡΡΠΎ. ΠΠ»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π±ΡΠ»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ custom ΠΏΠΎΠ»Π΅ΠΉ Π² vCenter, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΠΠ Π½Π° ΠΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ Π»ΠΈ ΠΎΠ½ΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ΅ΠΌ ΠΈ ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π½Ρ. Π§Π΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΠΊΡΠΎΡ ΠΏΡΠΈΠ²ΡΠ» ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ ΠΌΠ°ΡΠΈΠ½ ΠΎΡΡΠ°Π»ΠΈΡΡ Ρ Π½Π΅Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ, ΡΡΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ»ΠΎ ΡΠ°Π±ΠΎΡΡ. Π Π°Π· Π² ΠΏΠΎΠ» Π³ΠΎΠ΄Π° ΠΊΡΠΎ-ΡΠΎ ΠΏΡΠΈΡ
ΠΎΠ²Π°Π», Π·Π°ΡΠ΅Π²Π°Π» ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
, Π½ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π°Π» Π±ΡΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠΆΠ΅ Π½Π΅Π΄Π΅Π»ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ»ΡΠΎΡΡ.
Π‘ΡΠ°Π·Ρ ΡΡΠΎΡΠ½Ρ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΡΠ²ΠΊΠΈ Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΠΈΠ½, ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎ ΠΈΡ
ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΠΈ Ρ.Π΄. ΠΈ Ρ.ΠΏ. Π ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠ΅ ΡΡΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΡΠ½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡ ΠΈ Π²ΠΎ Π²ΡΡΠΌ ΠΏΠΎΡΡΠ΄ΠΎΠΊ. Π£ Π½Π°Ρ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π΅ ΡΠ°ΠΊ, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΡΡΠ°ΡΡΠΈ π
Π ΠΎΠ±ΡΠ΅ΠΌ, Π±ΡΠ»ΠΎ ΠΏΡΠΈΠ½ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ.
Π Π΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠ΅ ΠΏΠΈΡΡΠΌΠΎ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ
ΠΌΠ°ΡΠΈΠ½ Π½Π° Π²ΡΠ΅Ρ
ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΡ
ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΎΠ² ΠΈ ΠΈΡ
Π½Π°ΡΠ°Π»ΡΠ½ΠΈΠΊΠΎΠ² Π±ΡΠ΄Π΅Ρ Ρ
ΠΎΡΠΎΡΠΈΠΌ Π½Π°ΡΠ°Π»ΠΎΠΌ.
ΠΠ° ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠΎΠ»Π»Π΅Π³ ΡΠΆΠ΅ Π±ΡΠ» Π²Π½Π΅Π΄ΡΡΠ½ ΡΠΊΡΠΈΠΏΡ Π½Π° PowerShell, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ ΠΏΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΎΠ±ΠΈΡΠ°Π» ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΌΠ°ΡΠΈΠ½Π°ΠΌ Π²ΡΠ΅Ρ vCenter-ΠΎΠ² ΠΈ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π» 3 csv Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° (ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΌΡ vCenter), ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π»ΠΈΡΡ Π½Π° ΠΎΠ±ΡΠΈΠΉ Π΄ΠΈΡΠΊ. ΠΡΠ»ΠΎ ΠΏΡΠΈΠ½ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²Π·ΡΡΡ ΡΡΠΎΡ ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΎΡΠ½ΠΎΠ²Ρ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ·ΡΠΊΠ° R, ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΊΠΎΡΠΎΡΡΠΌ Π±ΡΠ» Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΡ.
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠΎΡΠ»ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΠΏΠΎΡΡΠ΅, Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΈ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ (ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π΅), Π° ΡΠ°ΠΊΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ Π»ΠΎΠ³ΠΎΠ² vSphere Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Π΅ΠΉ vm ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ.
ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ IDE RStudio Desktop ΠΈ PowerShell ISE.
Π‘ΠΊΡΠΈΠΏΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Ρ ΠΎΠ±ΡΡΠ½ΠΎΠΉ Π²ΠΈΠ½Π΄ΠΎΠ²ΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ.
ΠΠ±ΡΠ°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠΊΡΠΈΠΏΡΠΎΠ² ΠΏΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ.
- Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΌΠ°ΡΠΈΠ½Π°ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ PowerShell ΡΠΊΡΠΈΠΏΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΠ΅ΡΠ΅Π· R, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ Π² ΠΎΠ΄ΠΈΠ½ csv. ΠΠ±ΡΠ°ΡΠ½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ·ΡΠΊΠ°ΠΌΠΈ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ. (ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π³ΠΎΠ½ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· R Π² PowerShell Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , Π½ΠΎ ΡΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ, Π΄Π° ΠΈ ΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ csv Π»Π΅Π³ΡΠ΅ Π΄Π΅Π±Π°ΠΆΠΈΡΡ ΠΈ Π΄Π΅Π»ΠΈΡΡΡΡ Ρ ΠΊΠ΅ΠΌ-ΡΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΌΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ).
- Π‘ ΠΏΠΎΠΌΠΎΡΡΡ R ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»Π΅ΠΉ, Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ. β Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ word Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ Π΄Π»Ρ Π²ΡΡΠ°Π²ΠΊΠΈ Π² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΠΏΠΈΡΡΠΌΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²Π΅ΡΠΎΠΌ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ ΠΊΠΎΠ»Π»Π΅Π³ "ΠΠ΅ Π½Ρ Π° ΠΊΠ°ΠΊ Ρ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ?".
- ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΠ ΠΈΠ· csv Ρ ΠΏΠΎΠΌΠΎΡΡΡ R, ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ dataframe, ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΈ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ xlsx Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ²ΠΎΠ΄Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΠ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ Π½Π° ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΡΡΡΡ.
- Π dataframe ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΠ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π²ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΈΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΠ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ (ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ ΠΏΠΎΠ»Ρ).
- ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΠ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ PowerShell ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΌΠΎΡΡΠ΅ΡΡ Π»ΠΎΠ³ΠΈ vCenter Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΡΠΎΠ±ΡΡΠΈΠΉ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΠ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΠ ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ. ΠΡΠΎ Π½Π° ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° Π½ΠΈΠΊΡΠΎ Π½Π΅ ΡΠΎΠ·Π½Π°ΡΡΡΡ, ΡΡΡ ΠΌΠ°ΡΠΈΠ½Π°. ΠΠ°Π½Π½ΡΠΉ ΡΠΊΡΠΈΠΏΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π΅ Π±ΡΡΡΡΠΎ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ, Π΅ΡΠ»ΠΈ Π»ΠΎΠ³ΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 2 Π½Π΅Π΄Π΅Π»ΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ workflow, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠΎΠΈΡΠΊ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΠ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΊΡΠΈΠΏΡΠ° Π΅ΡΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ Π² csv, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΡΡ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ Π² R.
- Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΊΡΠ°ΡΠΈΠ²ΠΎ ΠΎΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ xlsx Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄ΡΡ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ ΠΊΡΠ°ΡΠ½ΡΠΌ ΡΠ²Π΅ΡΠΎΠΌ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠ΅ ΠΏΠΎΠ»Ρ, ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Ρ ΡΠΈΠ»ΡΡΡΡ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·Π°Π½Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΠ.
- Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠ΅ ΠΏΠΈΡΡΠΌΠΎ, ΠΊΡΠ΄Π° Π²ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΌΠΈ Π²ΠΌ. Π ΡΠ΅ΠΊΡΡΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΠ, ΡΡΡΠ»ΠΊΡ Π½Π° ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΡΡΡΡ ΠΈ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΠΎΠ½Π½ΡΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ. ΠΡΠ»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ ΠΠ Π½Π΅Ρ β ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠ΅ ΠΏΠΈΡΡΠΌΠΎ Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π΄ΠΎΡΡΠ½ΠΎΠΉ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΎΠΉ.
- ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΠ Π² ΠΠ 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 Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ ΠΌΠ°ΡΠΈΠ½
# Π‘ΠΎΠ·Π΄Π°ΡΠΌ Π½ΠΎΠ²ΡΡ ΠΊΠ½ΠΈΠ³Ρ
# ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ : "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)
ΠΠ° Π²ΡΡ ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π²ΠΎΡ ΡΠ°ΠΊ:
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ» ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ Π½ΡΠ°Π½Ρ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Windows scheduller. ΠΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π»ΠΎΡΡ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΡΠ°Π² ΠΈ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, ΡΡΠΎΠ±Ρ Π²ΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΎΡΡ, ΠΊΠ°ΠΊ Π½ΡΠΆΠ½ΠΎ. Π ΠΈΡΠΎΠ³Π΅ Π±ΡΠ»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° R, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΌΠ° ΡΠΎΠ·Π΄Π°ΡΡ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎ Π·Π°ΠΏΡΡΠΊΡ R ΡΠΊΡΠΈΠΏΡΠ° ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅Ρ ΠΏΡΠΎ ΡΠ°ΠΉΠ» Π΄Π»Ρ Π»ΠΎΠ³ΠΎΠ². ΠΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠΊΠ°ΠΌΠΈ ΠΏΠΎΠ΄ΠΏΡΠ°Π²ΠΈΡΡ Π·Π°Π΄Π°Π½ΠΈΠ΅.
ΠΡΡΠΎΡΠ΅ΠΊ ΠΊΠΎΠ΄Π° Π½Π° R Ρ Π΄Π²ΡΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°ΡΡ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ΅ Windows
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)
ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΏΡΠΎ ΠΠ
ΠΠΎΡΠ»Π΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΊΡΠΈΠΏΡΠ° ΡΡΠ°Π»ΠΈ ΠΏΡΠΎΡΠ²Π»ΡΡΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π½Π°ΠΉΡΠΈ Π΄Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΠ Π±ΡΠ»Π° ΡΠ΄Π°Π»Π΅Π½Π°, Π° Π»ΠΎΠ³ΠΈ Π² vCenter ΡΠΆΠ΅ ΠΏΠΎΡΡΡΠ»ΠΈΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΊΡΠΈΠΏΡ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ»Ρ Π² ΠΏΠ°ΠΏΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ ΠΈ Π½Π΅ ΡΠΈΡΡΠΈΡ (ΡΠΈΡΡΠΈΠΌ ΡΡΠΊΠ°ΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ), ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠ°ΡΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ Π½Π°ΠΉΡΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°ΠΉΠ», Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄Π°Π½Π½ΠΎΠΉ ΠΠ Π½Π΅Ρ. ΠΠΎ ΡΡΠΎ Π½Π΅ ΠΊΡΡΡΠΎ.
ΠΠ°Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΡΡ ΠΠ.
ΠΠ° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΡΡΠ» ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» MS SQL SERVER β system-versioned temporal table. ΠΠ³ΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΡ, ΠΊΠ°ΠΊ Π²ΡΠ΅ΠΌΠ΅Π½Π½Π«Π΅ (Π½Π΅ Π²ΡΠΠΌΠ΅Π½Π½ΡΠ΅) ΡΠ°Π±Π»ΠΈΡΡ.
ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ Π²
ΠΡΠ»ΠΈ Π²ΠΊΡΠ°ΡΡΠ΅ β ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ°Π±Π»ΠΈΡΡ, Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ ΠΎΠ½Π° Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ Ρ Π²Π΅ΡΡΠΈΠΎΠ½Π½ΠΎΡΡΡΡ ΠΈ SQL Server ΡΠΎΠ·Π΄Π°ΡΡ 2 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ datetime ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π² ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ (Π΄Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ ΠΈ Π΄Π°ΡΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΆΠΈΠ·Π½ΠΈ Π·Π°ΠΏΠΈΡΠΈ) ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄ΡΡ ΠΏΠΈΡΠ°ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ, ΠΏΡΡΡΠΌ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΡΠΎΡΡΡ Π΄Π°Π½Ρ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π»ΠΈΠ±ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ, Π»ΠΈΠ±ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΠ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ β ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π°, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ Π² Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ. Π’.Π΅. Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°Ρ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π°ΠΏΠΈΡΠΈ ΡΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π½Π°Π΄ΠΎ Π²Π½Π΅Π΄ΡΡΡΡ Ρ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΡΡ, Π½ΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΏΡΡΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΠΊΠΎΠ»ΡΠ½Π°Ρ ΡΡΡΠΊΠ°.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π» ΠΏΡΠΈΡΠ»ΠΎΡΡ Π½Π° 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)
ΠΡΠΎΠ³ΠΎ
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ°, Π·Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΡΠ΅Π² Π±ΡΠ» Π½Π°Π²Π΅Π΄ΡΠ½ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ. ΠΠ½ΠΎΠ³Π΄Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠ΅ ΠΠ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ, Π½ΠΎ ΡΠΊΡΠΈΠΏΡ ΡΠ»ΡΠΆΠΈΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΈΠΌ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡΠ΅Π΄ΠΊΠ°Ρ ΠΠ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² ΡΠΏΠΈΡΠΎΠΊ 2 Π΄Π½Ρ ΠΏΠΎΠ΄ΡΡΠ΄.
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ» ΡΠ΄Π΅Π»Π°Π½ Π·Π°Π΄Π΅Π» Π½Π° Π°Π½Π°Π»ΠΈΠ· ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ .
ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ "Π½Π° ΠΊΠΎΠ»Π΅Π½ΠΊΠ΅", Π° ΠΏΡΠΎΡΠΈΠ»ΡΠ½ΡΠΌ ΠΠ, Π½ΠΎ Π·Π°Π΄Π°ΡΠ° Π±ΡΠ»Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΠ°ΠΊΡΠ»ΡΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ.
R Π² ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°Π· ΠΏΠΎΠΊΠ°Π·Π°Π» ΡΠ΅Π±Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΠΌ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ·ΡΠΊΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π΄Π°Ρ, Π½ΠΎ ΠΈ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎΠΉ "ΠΏΡΠΎΠΊΠ»Π°Π΄ΠΊΠΎΠΉ" ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ .
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com