Entrée
Bonjour. Depuis maintenant six mois, nous exécutons un script (plus précisément un ensemble de scripts) qui génère des rapports sur l'état des machines virtuelles (et pas seulement). J'ai décidé de partager l'expérience de création et le code lui-même. Je compte sur la critique et le fait que ce matériel peut être utile à quelqu'un.
Nous avons beaucoup de machines virtuelles (environ 1500 VM réparties sur le 3ème vCenter). De nouveaux sont créés et les anciens sont supprimés assez souvent. Pour préserver l'ordre, plusieurs champs personnalisés ont été ajoutés à vCenter pour diviser les machines virtuelles en sous-systèmes, indiquer si elles sont testées, ainsi que par qui et quand. Le facteur humain a conduit au fait que plus de la moitié des voitures ont été laissées avec des champs vides, ce qui a compliqué le travail. Une fois tous les six mois, quelqu'un a paniqué, a commencé à mettre à jour ces données, mais le résultat a cessé d'être pertinent pendant une semaine et demie.
Je précise tout de suite que tout le monde comprend qu'il devrait y avoir des applications pour créer des machines, un processus pour les créer, etc. etc. Et tandis que tout ce processus est strictement suivi et en ordre. Malheureusement, ce n'est pas le cas chez nous, mais ce n'est pas le sujet de l'article :)
En général, il a été décidé d'automatiser la vérification de l'exactitude du remplissage des champs.
Nous avons décidé qu'une lettre quotidienne avec une liste de machines mal remplies pour tous les ingénieurs responsables et leurs supérieurs serait un bon début.
À ce stade, l'un des collègues avait déjà implémenté un script PowerShell, qui chaque jour selon un calendrier collectait des informations sur toutes les machines de tous les vCenter et formait 3 documents csv (chacun dans son propre vCenter), qui étaient disposés sur un disque partagé. Il a été décidé de prendre ce script comme base et de le compléter avec des vérifications en utilisant le langage R, avec lequel j'avais une certaine expérience.
En cours de finalisation, la solution a été envahie par des informations par courrier, une base de données avec les tables principales et historiques (plus d'informations à ce sujet plus tard), ainsi que par l'analyse des journaux vSphere pour trouver les véritables créateurs de vm et l'heure de leur création.
Pour le développement, IDE RStudio Desktop et PowerShell ISE ont été utilisés.
Le script est lancé à partir d'une machine virtuelle Windows standard.
Description de la logique générale.
La logique générale des scripts est la suivante.
- Nous collectons des données sur des machines virtuelles à l'aide du script PowerShell, qui est appelé via R, le résultat est combiné en un seul csv. L'interaction inverse entre les langues se fait de manière similaire. (il était possible de diriger des données directement de R vers PowerShell sous forme de variables, mais c'est difficile, et même avec un csv intermédiaire, il est plus facile de déboguer et de partager des résultats intermédiaires avec quelqu'un).
- En utilisant R, nous formons des paramètres valides pour les champs dont nous vérifions les valeurs. - Nous formons un document Word qui contiendra les valeurs de ces champs pour l'insertion dans une lettre d'information qui sera une réponse aux questions des collègues "Pas bien, mais comment dois-je le remplir?"
- Nous chargeons des données sur toutes les machines virtuelles de csv en utilisant R, formons un cadre de données, supprimons les champs inutiles et formons un document d'informations xlsx qui contiendra des informations récapitulatives sur toutes les machines virtuelles que nous téléchargeons sur une ressource partagée.
- À la trame de données pour toutes les machines virtuelles, nous appliquons toutes les vérifications de l'exactitude du remplissage des champs et formons un tableau contenant uniquement les machines virtuelles avec des champs incorrectement remplis (et uniquement ces champs).
- La liste résultante des machines virtuelles est envoyée à un autre script PowerShell, qui examinera les journaux vCenter pour les événements de création de machines virtuelles, ce qui vous permettra de spécifier l'heure estimée de création de la machine virtuelle et le créateur souhaité. C'est le cas lorsque personne ne confesse à qui appartient la voiture. Ce script ne fonctionne pas rapidement, surtout s'il y a beaucoup de journaux, donc nous ne regardons que les 2 dernières semaines, et nous utilisons également le workflow, qui vous permet de rechercher des informations sur plusieurs machines virtuelles en même temps. Dans l'exemple de script, il existe des commentaires détaillés sur ce mécanisme. Le résultat est ajouté à csv, qui est à nouveau chargé dans R.
- Nous formons un document xlsx magnifiquement formaté dans lequel les champs incorrectement remplis seront surlignés en rouge, des filtres seront appliqués à certaines colonnes, et des colonnes supplémentaires contenant les créateurs présumés et l'heure de la création de la VM seront indiquées.
- Nous formons un e-mail, où nous mettons un document décrivant les valeurs de champ valides, ainsi qu'un tableau avec un remplissage incorrect. Dans le texte, nous indiquons le nombre total de VM mal créées, un lien vers une ressource partagée et une image de motivation. S'il n'y a pas de VM mal remplies, nous envoyons une autre lettre avec une image de motivation plus joyeuse.
- Nous enregistrons des données sur toutes les machines virtuelles dans la base de données SQL Server, en tenant compte du mécanisme implémenté des tables historiques (un mécanisme très intéressant - dont plus en détail)
Scripts
Le fichier principal avec le code pour R Script pour obtenir la liste vm sur PowerShell Script PowerShell extrayant les journaux des créateurs de machines virtuelles et leurs dates de création La bibliothèque xlsx mérite une attention particulière, ce qui a permis de rendre la pièce jointe à la lettre clairement formatée (comme le manuel l'aime), et pas seulement une table csv.
Création d'un beau document xlsx avec une liste de machines incorrectement remplies La sortie est quelque chose comme ceci:

Il y avait aussi une nuance intéressante dans la configuration du planificateur Windows. Cela n'a pas fonctionné pour sélectionner les droits et paramètres corrects afin que tout commence comme il se doit. En conséquence, la bibliothèque R a été trouvée, qui crée elle-même une tâche pour exécuter le script R et n'oublie même pas le fichier journal. Ensuite, vous pouvez corriger la tâche avec des stylos.
Un morceau de code R avec deux exemples qui crée une tâche dans le planificateur Windows library(taskscheduleR) myscript <- file.path(getwd(), "all_vm.R")
Séparément, sur la base de données
Après avoir configuré le script, d'autres questions ont commencé à apparaître. Par exemple, je voulais trouver la date à laquelle la machine virtuelle a été supprimée et les journaux dans vCenter étaient déjà usés. Puisque le script place les fichiers dans le dossier tous les jours et ne les nettoie pas (nous les nettoyons avec nos mains quand nous nous souvenons), vous pouvez regarder les anciens fichiers et trouver le premier fichier dans lequel cette machine virtuelle ne se trouve pas. Mais ce n'est pas cool.
Je voulais créer une base de données historique.
La fonctionnalité MS SQL SERVER est venue à l'aide - une table temporelle versionnée par le système. Il est généralement traduit par des tables temporaires (non temporaires).
Vous pouvez lire en détail dans la documentation officielle de Microsoft .
En bref, nous créons une table, nous disons que nous l'aurons avec la gestion des versions et SQL Server crée 2 colonnes datetime supplémentaires dans cette table (la date à laquelle l'enregistrement a été créé et la date à laquelle l'enregistrement a expiré) et une table supplémentaire dans laquelle les modifications seront écrites. En conséquence, nous obtenons des informations pertinentes et, à travers de simples requêtes, dont des exemples sont donnés dans la documentation, nous pouvons voir soit le cycle de vie d'une machine virtuelle particulière, soit l'état de toutes les VM à un certain moment.
En termes de performances, la transaction d'écriture dans la table principale ne sera pas terminée tant que la transaction d'écriture dans la table temporaire ne sera pas terminée. C'est-à-dire sur les tables avec un grand nombre d'opérations d'écriture, cette fonctionnalité doit être implémentée avec prudence, mais dans notre cas, c'est une chose très cool.
Pour que le mécanisme fonctionne correctement, il était nécessaire d'ajouter un petit morceau de code sur R qui comparerait la nouvelle table avec les données de toutes les machines virtuelles à celle stockée dans la base de données et n'y écrirait que les lignes modifiées. Le code n'est pas très délicat, il utilise la bibliothèque compareDF, mais je vais aussi le donner ci-dessous.
Code R pour écrire des données dans la base de données Total
À la suite de l'introduction du script, l'ordre a été maintenu et maintenu pendant plusieurs mois. Parfois, des machines virtuelles mal remplies apparaissent, mais le script sert de bon rappel et une machine virtuelle rare entre dans la liste pendant 2 jours consécutifs.
Une réserve a également été constituée pour l'analyse des données historiques.
Il est clair qu'une grande partie de cela peut être réalisée non pas «sur le genou», mais avec un logiciel spécialisé, mais la tâche était intéressante et, pourrait-on dire, facultative.
R s'est révélé une fois de plus être un merveilleux langage universel, parfait non seulement pour résoudre des problèmes statistiques, mais aussi comme un excellent «pontage» entre d'autres sources de données.