Автоматическое наполнение custom attributes в vCenter из Google Sheets
Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В предыдущий раз мы с вами рассмотрели вопрос импортирования табличных данных с веб-страниц в Google таблицу. Сегодня у меня обратная задача, мне нужно получать данные из Google Sheets и импортировать их в автоматическом виде в мой vCenter 7, для того чтобы иметь актуальную информацию по описанию к виртуальным машинам. Для этих задач мы вновь воспользуемся возможностями PowerShell и все полностью автоматизируем. Надеюсь, что данный пример поможет вам так же улучшить описание вашей виртуальной инфраструктуры.
Постановка задачи
Пару месяцев назад я вам рассказывал, как можно удобно вести описание виртуальных машин VMware с помощью custom attributes. Которых можно на создавать нужное количество и потом делать любые выборки по ним с помощью PowerCLI. Выглядит это вот так. В моем случае это атрибуты:
- Customer
- Product
- Project
- Responsible
- Service Time
- Status
Я первый раз сам заполнил их по всем виртуальным машинам в vCenter, но люди меняются, меняется статус виртуальных серверов, время обслуживания и так далее. Встал вопрос, как все это автоматизировать. Выход нашли в таком виде, данный оригинальный файл был выгружен и помещен в Google таблицы. Выдан доступ на его редактирование всем руководителям проектов и выработана договоренность, что коллеги все это сами будут поддерживать в актуальном виде и менять, все что необходимо. Далее данный файл будет раз в неделю или по другому расписанию, будет импортироваться в vCenter, обновляя все custom attributes. Одним словом почти автоматизация.
Ниже я хочу вам представить очередной скрипт Powershell, который сможет выполнить поставленные задачи.
Скрипт PowerShell по импорту данных из Google таблиц в vCenter
Логика у скрипта простая:
- 1️⃣С помощью утилиты gam.exe будет подключение к Google таблицам
- 2️⃣Скачивание файла в виде CSV
- 3️⃣Импорт данного CSV
Сам файл имеет вот такой вид по столбцам.
#Задается удобочитаемая дата для формирования файлов логирования
function Date {Get-Date -Format "yyyy.MM.dd HH:mm:ss"}
#Создаем папку для хранения логов и помещаем лог файл туда
$log_folder = "$PSScriptRoot\Logs\" + $($MyInvocation.MyCommand.Name -replace (".ps1", ""))
$log = "$log_folder\$(Get-Date -Format "yyyy_MM_dd_HH_mm_ss").txt"
if (! (Test-Path $log_folder -PathType Container -ErrorAction SilentlyContinue))
{
New-Item $log_folder -ItemType D -Force | Out-Null
}
### gam.exe это утилита для Google сервисов
$gam_exe = "$PSScriptRoot\gam-64\gam.exe"
$viserver = "vcenter.pyatilistnik.org"
$VMs_Properties_file = "$log_folder\VMs_Properties.csv"
###
"$(Date) Start Processing" | Tee-Object $log -Append
if (Test-Path $VMs_Properties_file -PathType Leaf -ErrorAction SilentlyContinue)
{
"$(Date) Trying to remove existed file `"$VMs_Properties_file`"" | Tee-Object $log -Append
try {
Remove-Item $VMs_Properties_file -Force -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
Break
}
}
else
{
"$(Date) File `"$VMs_Properties_file`" doesn't existed" | Tee-Object $log -Append
}
###
"$(Date) Trying to download source file to `"$log_folder`"" | Tee-Object $log -Append
#Тут задается ID файла
& $gam_exe user admingoogle@pyatilistnik.org get drivefile id 1hKHRoX_C9sr8sU9cjNKYzAhfrfZjjj2aXD0p0iumcwM format csv targetfolder `"$log_folder`"
"$(Date) Checking downloaded file" | Tee-Object $log -Append
if (Test-Path $VMs_Properties_file -PathType Leaf -ErrorAction SilentlyContinue)
{
"$(Date) All good" | Tee-Object $log -Append
}
else
{
"$(Date) Something went wrong. Brake" | Tee-Object $log -Append
Break
}
###
"$(Date) Trying to import VMware.PowerCLI module" | Tee-Object $log -Append
try {
Import-Module VMware.PowerCLI -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
Break
}
"$(Date) Trying to connect to VIServer $viserver" | Tee-Object $log -Append
try {
Connect-VIServer -Server $viserver -Force -ErrorAction Stop #-User picompany\pa
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
Break
}
###
foreach ($line in (Import-Csv $VMs_Properties_file)) # | select -First 1
{
"$(Date) Trying to update VM $($line.Name)" | Tee-Object $log -Append
# $line
$VM = Get-VM $($line.Name)
# $VM.CustomFields
try {
$VM | Set-Annotation -CustomAttribute "Customer" -Value $line."Customer (инициатор)" -ErrorAction Stop
$VM | Set-Annotation -CustomAttribute "Project" -Value $line.Project -ErrorAction Stop
$VM | Set-Annotation -CustomAttribute "Responsible" -Value $line."Responsible (тех лид)" -ErrorAction Stop
$VM | Set-Annotation -CustomAttribute "Status" -Value $line.Status -ErrorAction Stop
$VM | Set-Annotation -CustomAttribute "Product" -Value $line.Product -ErrorAction Stop
$VM | Set-Annotation -CustomAttribute "Service time" -Value $line."Service time" -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
}
###
"$(Date) End Processing" | Tee-Object $log -Append
Надеюсь, что данный скрипт вам поможет в подобной задаче по импорту информации в custom attributes.