Автоматическое наполнение custom attributes в vCenter из Google Sheets

Обновлено 07.08.2022

google sheets

Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В предыдущий раз мы с вами рассмотрели вопрос импортирования табличных данных с веб-страниц в Google таблицу. Сегодня у меня обратная задача, мне нужно получать данные из Google Sheets и импортировать их в автоматическом виде в мой vCenter 7, для того чтобы иметь актуальную информацию по описанию к виртуальным машинам. Для этих задач мы вновь воспользуемся возможностями PowerShell и все полностью автоматизируем. Надеюсь, что данный пример поможет вам так же улучшить описание вашей виртуальной инфраструктуры.

Постановка задачи

Пару месяцев назад я вам рассказывал, как можно удобно вести описание виртуальных машин VMware с помощью custom attributes. Которых можно на создавать нужное количество и потом делать любые выборки по ним с помощью PowerCLI. Выглядит это вот так. В моем случае это атрибуты:

  • Customer
  • Product
  • Project
  • Responsible
  • Service Time
  • Status

custom attributes

Я первый раз сам заполнил их по всем виртуальным машинам в vCenter, но люди меняются, меняется статус виртуальных серверов, время обслуживания и так далее. Встал вопрос, как все это автоматизировать. Выход нашли в таком виде, данный оригинальный файл был выгружен и помещен в Google таблицы. Выдан доступ на его редактирование всем руководителям проектов и выработана договоренность, что коллеги все это сами будут поддерживать в актуальном виде и менять, все что необходимо. Далее данный файл будет раз в неделю или по другому расписанию, будет импортироваться в vCenter, обновляя все custom attributes. Одним словом почти автоматизация.

Ниже я хочу вам представить очередной скрипт Powershell, который сможет выполнить поставленные задачи.

Скрипт PowerShell по импорту данных из Google таблиц в vCenter

Логика у скрипта простая:

  • 1️⃣С помощью утилиты gam.exe будет подключение к Google таблицам
  • 2️⃣Скачивание файла в виде CSV
  • 3️⃣Импорт данного CSV

Сам файл имеет вот такой вид по столбцам.

Файл для импорта в custom attributes

# Скрипт Ивана Семина, сайт /

#Задается удобочитаемая дата для формирования файлов логирования
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.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *