День добрый. Уже пол года у нас работает скрипт (точнее набор скриптов), генерирующий отчёты по состоянию виртуальных машин (и не только). Решил поделиться опытом создания и самим кодом. Рассчитываю на критику и на то, что данный материал может быть кому-то полезным. Виртуальных машин у нас много (порядка 1500 ВМ распределённых по 3-м vCenter). Создаются новые и удаляются старые достаточно часто. Для сохранения порядка было добавлено несколько custom полей в vCenter, чтобы разделять ВМ на Подсистемы, указывать тестовые ли они, а также кем и когда созданы. Человеческий фактор привёл к тому, что более половины машин остались с незаполненными полями, что усложняло работу. Раз в пол года кто-то психовал, затевал работу по актуализации этих данных, но результат переставал быть актуальным уже недели через полторы.
Сразу уточню, что все понимают, что должны быть заявки на создание машин, процесс по их созданию, и т.д. и т.п. И при этом все этому процессу неукоснительно следуют и во всём порядок. У нас, к сожалению, не так, но это не предмет статьи :) В общем, было принято решение автоматизировать проверку правильности заполнения полей.
Решили, что ежедневное письмо со списком неправильно заполненных машин на всех ответственных инженеров и их начальников будет хорошим началом. На этот момент одним из коллег уже был внедрён скрипт на PowerShell, который каждый день по расписанию собирал информацию по всем машинам всех vCenter-ов и формировал 3 csv документа (каждый по своему vCenter), которые выкладывались на общий диск. Было принято решение взять этот скрипт за основу и дополнить проверками с помощью языка R, по работе с которым был некоторый опыт. В процессе доработки решение обросло информированием по почте, базой данных с основной и исторической таблицей (об этом позднее), а также анализом логов vSphere для поиска фактических создателей vm и времени их создания.  Для разработки использовались IDE RStudio Desktop и PowerShell ISE. Скрипт запускается с обычной виндовой виртуальной машины. Общая логика скриптов получилась следующая. Отдельного внимания заслуживает библиотека xlsx, которая позволила сделать вложение к письму наглядно отформатированным (как любит руководство), а не просто csv таблицей. На выходе получается примерно вот так: После настройки скрипта стали проявляться другие вопросы. Например, хотелось найти дату, когда ВМ была удалена, а логи в vCenter уже потёрлись. Поскольку скрипт складывает файлы в папку каждый день и не чистит (чистим руками, когда вспоминаем), то можно просмотреть старые файлы и найти первый файл, в котором данной ВМ нет. Но это не круто. Захотелось создать историческую БД. На помощь пришёл функционал MS SQL SERVER — system-versioned temporal table. Его обычно переводят, как временнЫе (не врЕменные) таблицы. Можно подробно почитать в официальной документации Microsoft.  Если вкратце — создаём таблицу, говорим, что она у нас будет с версионностью и SQL Server создаёт 2 дополнительные datetime колонки в этой таблице (дату создания записи и дату окончания жизни записи) и дополнительную таблицу, в которую будут писаться изменения. В результате получаем актуальную информацию и, путём несложных запросов, примеры которых даны в документации, можем увидеть либо жизненный цикл конкретной виртуальной машины, либо состояние всех ВМ на определённый момент времени.  С точки зрения производительности — транзакция записи в основную таблицу не будет завершена, пока не завершится транзакция записи в временную таблицу. Т.е. на таблицах с большим количеством операций записи этот функционал надо внедрять с осторожностью, но в нашем случае это прям очень прикольная штука. Для того, чтобы механизм корректно работал пришлось на R дописать небольшой кусок кода, который сравнивал бы новую таблицу с данными по всем ВМ с той, что хранится в БД и записывала в неё только изменившиеся строки. Код не особо хитрый, использует библиотеку compareDF, но его я тоже приведу ниже. В результате внедрения скрипта, за несколько месяцев был наведён и поддерживается порядок. Иногда неправильно заполненные ВМ появляются, но скрипт служит неплохим напоминанием и редкая ВМ попадает в список 2 дня подряд. Также был сделан задел на анализ исторических данных. Понятно, что многое из этого можно реализовать не "на коленке", а профильным ПО, но задача была интересной и, можно сказать, факультативной. R в очередной раз показал себя прекрасным универсальным языком, который прекрасно подходит не только для решения статистических задач, но и выступает прекрасной "прокладкой" между другими источниками данных.