Entry
ᲥááŚááá áá¨áááááááĄá. áŁááá áááŽáááá á áŹáááá, á á᪠áŠááá áááŹáá ááááá áĄáá ááá˘áĄ (áŁá¤á á áĄáŹáá áá áĄáá ááá˘áááᥠáááááááĽá˘áĄ), á ááááá᪠áĽáááᥠááááá áá¨ááᥠááá á˘áŁáááŁá á ááááĽáááááᥠ(áá áá á ááŽáááá) áĄá˘áá˘áŁáĄáᥠá¨ááĄááŽáá. ááááááŹá§ááá˘á áááááááá ááááá áŠááá á¨ááĽáááᥠáááááŞáááááá áá ááááá áááá. áá áá˘áááᥠááááá áááĽáᥠáá áᥠáááĄááá áááááᥠáááááááááá.
áĄáááá ááááᥠá¤áá ááá ááá
áŠááá ááááĽáᥠáááá á ááá á˘áŁáááŁá á ááááĽááá (ááááŽáááááá 1500 VM áááááŹáááááŁáá 3 vCenters-á¨á). ááŽáááá ááĽááááá áá áŤáááááá áĄáááááá áŽá¨áá áá áá¨áááá. áŹááĄá áááᥠá¨ááĄáááá áŠáŁáááááá, vCenter-ᥠáááááá˘á á áááááááá ááá ááááŁáá áááá, á ááá ááá§áᥠVM áĽáááĄááĄá˘áááááá, áááŁááááᥠáá áᥠáᣠáá á ááĄááá áĄáá˘ááĄá˘á áá ááᥠáááá áá á áááᥠá¨áááĽááá. ááááááááŁá áá á¤ááĽá˘áá áá ááááááá ááá ááĄ, á áá ááááĽáááááᥠáááŽáááá áá ááá˘á ááá áŠá áŞáá áááá ááááááá, á ááá᪠áááá ááŁáá ááŁá¨áááá. ááĽáᥠáááá¨á áá ááŽáá áááŚá᪠áá áááááááá áá ááááŹá§á áá áááááŞáááááᥠáááááŽáááááá ááŁá¨áááá, áááá áá á¨ááááá áááá ááááŽááá áᥠá¨ááááá ááŚáá áá§á ááĽá˘áŁáááŁá á.
áááá áááááŞáá áááŁá§áááááááá ááááááá á˘á, á áá á§ááááᥠááĄáááĄ, á áá áŁááá áá áĄááááááᥠáááááŞáŽááááá ááááĽáááááᥠá¨ááĄááĽáááááá, áááá á¨ááĽáááᥠáá ááŞááĄá áá á.á¨. áá ááĄá á¨ááááá. áá áááááá ááŁááá, á§áááá ááááŞá áá ááŞááᥠáá áá ááŞááĄáĄ áá á§ááááá¤áá á á ááááá. áĄáááŹáŁáŽáá áá, áἠááĄá áá áá ááĄ, áááá áá áᥠáá áá áᥠáĄá˘áá˘ááᥠáááá :)
ááááááá áááŚáááŁáá ááĽáá áááááŹá§ááá˘ááááá ááááááᥠá¨áááĄáááᥠáĄááĄáŹáá áᥠá¨ááááŹááááᥠááá˘áááá˘áááá ááááá.
áŠááá ááááááŹá§ááá˘áá, á áá á§ááááááŚááŁá á áŹáá ááá áá ááĄáŹáá áá á¨áááĄáááŁáá ááááĽáááááᥠáĄááá á§áááá áááĄáŁáŽááĄááááááá áááááá ááĄáááᥠáá áááá áŁá¤á ááĄááááĄáááᥠááá áá áááĄááŹá§ááĄá ááĽáááááá.
áá áá˘áááá, áŠáááá áá á-áá ááá ááááááá áŁááá ááááá áá áĄáá ááá˘á PowerShell-á¨á, á ááááá᪠á§ááááááŚá, áá áá¤áááᥠáááŽááááá, ááá áááááá ááá¤áá áááŞááᥠá§áááá vCenter-áᥠá§áááá ááááĽááááá áá áááááá áá áááá 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-ááĄááááĄ, á áááááĄá᪠áá˘ááá áááá áĄááá áá á ááĄáŁá áĄáá.
- áŠááá ááá§ááááá á§áááá á¨ááááŹááááᥠááááááᥠá¨áááĄáááᥠáĄááĄáŹáá ááĄáááᥠáááááŞáááá áŠáá áŠáá¨á á§áááá VM-ááĄáááᥠáá ááĽáááá áŞáŽá áááĄ, á ááááá᪠á¨áááŞááᥠááŽáááá VM-ááᥠáá ááĄáŹáá áá á¨áááĄáááŁáá ááááááá (áá ááŽáááá áá ááááááá).
- áŠááá ááááááááá VM-áááᥠáŠáááááááááᥠáĄáŽáá PowerShell áĄáá ááá˘áá, á ááááá᪠áááááŽááááᥠvCenter ááŁá áááááᥠVM-áᥠá¨ááĽáááᥠááááááááááĄááááĄ, á á᪠áĄáá¨áŁáááááᥠáááááŞááᥠááááŁááááá VM-áᥠá¨ááĽáááᥠáĄáááá ááŁáá áá á áá áĄáááá ááŁáá á¨áááĽááááá. áᥠáá á¨ááááŽáááááĄááááĄ, á ááŞá áá áááá ááŚááá ááᥠáááĄá ááááĽáááá. áᥠáĄáá ááá˘á áĄáŹá áá¤áá áá ááŁá¨ááááĄ, ááá áŁááá˘ááĄ, áᣠáááá á ááŁá ááááá, áááá˘áá áŠááá ááŁá§áŁá ááá ááŽáááá áááá 2 áááá áᥠáá ááĄááá ááá§ááááá áĄáááŁá¨áá áá ááŞááĄáĄ, á ááááá᪠áĄáá¨áŁáááááᥠáááŤáááá áá ááá ááŁááá ááááŤááá ááá¤áá áááŞáá á áááááááá VM-áá. ááááááááᥠáĄáá ááá˘á á¨áááŞááᥠááá˘áááŁá áááááá˘áá ááᥠáá áááĽááááááᥠá¨ááĄááŽáá. á¨ááááᥠááááá˘ááá csv-á¨á, á áááááĄá᪠ááĄáá áá˘ááá áááá R-á¨á.
- áŠááá ááĽáááá ááááááá á¤áá ááá˘áá áááŁá xlsx ááááŁáááá˘áĄ, á ááááá¨á᪠áá ááĄáŹáá áá á¨áááĄáááŁáá áááááá ááĽáááá ááááá¨ááŁáá áŹááááá, á¤ááá˘á ááá ááááá§áááááŁáá ááĽáááá áááááá á áĄááá˘áá áá ááááááááŁáá ááĽáááá ááááá˘ááááá áĄááá˘ááá, á áááááá᪠á¨áááŞááᥠááááá áᎠá¨áááĽááááááᥠáá VM-áᥠá¨ááĽáááᥠáá ááĄ.
- áŠááá ááĽáááá ááá¤ááĄá˘ááĄ, áĄááá᪠áááááá ááá ááááŁáááá˘áĄ, á ááááá᪠ááŚáŹáá ᥠáĄáŹáá á ááááᥠáááá¨áááááááááĄ, ááĄááá áŞáŽá ááᥠáá ááĄáŹáá áá á¨áááĄáááŁáá ááááááá. á˘ááĽáĄá˘á¨á ááááŁáááááá áá ááĄáŹáá áá á¨ááĽááááá VM-áááᥠáĄááá áá á áááááááááĄ, áĄááá áá á ááĄáŁá áĄáᥠáááŁáᥠáá áĄáááá˘ááááŞáá áĄáŁá áááĄ. áᣠáá áá áᥠáá ááĄáŹáá áá á¨áááĄáááŁáá VMs, áŠááá ááááááááá ááááá áá á áŹáá ááᥠáŁá¤á á ááááááá á ááá˘ááááŞááŁá á áĄáŁá áááá.
- áŠááá áŠáááŹáá á á§áááá 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")
áĄáá ááá˘á PowerShell-á¨á vm-áᥠáĄááᥠáááĄááŚáááá
# ĐаннŃĐľ Đ´ĐťŃ ĐżĐžĐ´ĐşĐťŃŃĐľĐ˝Đ¸Ń Đ¸ Đ´ŃŃгио поŃоПоннŃĐľ
$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"
áááááááááá ááááĄáááŁáá áááŁá á§áŁá áááŚáááᥠáááĄááŽáŁá ááᥠ, á ááá᪠á¨ááĄááŤáááááá áááŽááá ááĄááá ááááá áá áááá¤ááá ááá¤áá ááá˘áááŁáá á§áá¤áááá§á (á áááá ᪠áááááŻáááá˘áĄ áááĄáŹáááĄ) áá áá á ááŽáááá 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)áááááááááá ááĄá áááááá§áŁá ááá:
ááĄááá áĄáááá˘áá ááĄá áááŁáááĄá áá§á ááá§ááááááĄááá áááááá¨áá áááá 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)áŞáááá áááááŞáááá ááááᥠá¨ááĄááŽáá
áĄáá ááá˘áᥠááá§áááááᥠá¨ááááá, áĄáŽáá áá áááááááá áááááŠááá. ááááááááá, ááááááá áááááá VM-áᥠáŹáá¨ááᥠááá ááŚá, áááá áá vCenter-áᥠááŁá áááááá áŁááá áááŞáááááá áá§á. áááááááá áĄáá ááá˘á á§ááááááŚááŁá áá áááááĄááᥠá¤áááááᥠáĄááĽááŚááááá¨á áá áá ááĄáŁá¤áááááᥠááᥠ(áŠááá ááᥠáŽáááá áááĄáŁá¤áááááá, á ááŞá ááááŽáĄáááĄ), á¨ááááŤáááá áááááŽáááá áŤááá á¤áááááᥠáá áááááá ááá áááá á¤áááá, á ááááá¨á᪠áᥠVM áá áá ááĄ. áááá áá áᥠáá áá áᥠááááá á.
ááááááá ááĄá˘áá ááŁáá áááááŞáááá ááááᥠá¨ááĽááá.
áĄáááá¨ááááá¨á áááááá MS SQL SERVER-áᥠá¤áŁááĽáŞáááááááá - áĄááĄá˘áááŁá á ááá áĄááá áá áááááá áŞáŽá ááá. áᥠáŠáááŁáááá áá áááá áááááá á áááá ᪠áá áááááá (áá á áá áááááá) áŞáŽá ááááá.
ááá˘áááŁá áá á¨ááááŤáááá áŹááááááŽáá áἠ.
áááááá, áŠááá ááĽáááá áŞáŽá áááĄ, ááááááá, á áá ááááĽáááá ááá áĄááá, áá SQL Server áĽáááᥠ2 ááááá˘áááá ááá ááŚáᥠáá ááᥠáĄááá˘áĄ áá áŞáŽá ááá¨á (áŠááááŹáá áᥠá¨ááĽáááᥠááá ááŚá áá áŠááááŹáá áᥠááááᥠáááĄáááᥠááá ááŚá) áá ááááá˘áááá áŞáŽá áááĄ, á ááááá¨á᪠ááŞááááá. ááááŹáá ááá. á¨áááááá, áŠááá áááŚááá áááááŽááááŁá ááá¤áá áááŞááᥠáá ááá á˘ááá ááááŽááááááᥠáĄáá¨áŁáááááá, á áááááá áááááááááá áááŞáááŁááá ááááŁáááá˘ááŞááá¨á, áŠááá á¨áááááŤááá áááááááŽáá áá ááááá áá˘áŁáá ááá á˘áŁáááŁá á ááááĽáááᥠáĄááĄááŞááŞáŽáá áŞáááá, áá á§áááá VM-áᥠááááááá áááá ááá ááááŁá áááááá˘á¨á. áá ááá.
á¨ááĄá áŁááááᥠááá áĄáááĽá˘áááááá, áááááá áŞáŽá ááá¨á áŠááŹáá áᥠá˘á áááááĽáŞáá áá áááĄá áŁááááá ááááá, áĄáááá áá ááááá áŞáŽá ááá¨á áŠááŹáá áᥠá˘á áááááĽáŞáá áá áááĄá áŁááááá. áááá. ááááááááá, áĄááá᪠áŠááŹáá áᥠáááá ááŞááááᥠáááá á ááááááááá, áᥠá¤áŁááĽáŞáá áĄáá¤á ááŽáááá áŁááá ááááŽáá áŞááááááĄ, áááá áá áŠáááᥠá¨ááááŽááááá¨á áᥠááá ááá᪠ááááá á á áááá.
ááááĄáááááĄ, á áá áááĽááááááá áĄáŹáá áá áááŁá¨áááĄ, áá áŁááá ááááááá˘á ááááᥠááá˘áá á áááŹááá R-á¨á, á ááááá᪠á¨áááááá áá ááŽáá áŞáŽá ááᥠá§áááá VM-áᥠáááááŞááááááá áááááŞáááá ááááá¨á á¨ááááŽáŁáááá áá áááĄá¨á ááŽáááá á¨ááŞáááá áĄá˘á ááĽááááᥠááááŹáá . áááá áá áá áᥠááááĄáááŁáá áááá ááááááá, áᥠáá§ááááᥠ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-á ááááá áá ááŽáá ááŠáááá, á áá áá áᥠá¨ááĄáááá¨áááá áŁááááá áĄáááŁá á ááá, á ááááá᪠á¨ááĄáááá¨ááááá áá á ááŽáááá áĄá˘áá˘ááĄá˘áááŁá á áá ááááááááᥠáááááĄááá áááá, áá áááá ááĄááá áááĽáááááᥠá áááá ᪠á¨ááĄáááá¨áááá âá¤áááâ áááááŞáááá áĄáŽáá áŹá§áá áááᥠá¨áá ááĄ.
áŹá§áá á: www.habr.com
