به روزرسانی ابزارهای VMware با PowerShell و N-Central ارتقا می یابد

به عنوان یک مهندس سیستم که از طیف گسترده ای از مشتری ها با انواع محیط های VMware پشتیبانی می کند – از vsphere گرفته تا میزبان های مستقل ESXi – من به همان چالش ادامه می دهم: نسخه های VMware Tools اغلب به روز بودند. به روزرسانی های دستی متناقض ، وقت گیر و مستعد فراموش شدن بودند.
ما قبلاً با استفاده از N-Central RMM یک فرآیند مدیریت پچ به خوبی تثبیت کردیم و فهمیدم: چرا از همان پنجره تعمیر و نگهداری برای به روزرسانی ابزارهای VMware استفاده نمی کنیم؟ این امر تلاش دستی را از بین می برد و اطمینان می دهد که هر دستگاه به طور خودکار به روز و پشتیبانی می شود.
این وبلاگ داستانی است که چگونه یک اسکریپت PowerShell ساده به ساده سازی این روند کمک کرده است – و چگونه می توانید از آن نیز استفاده کنید.
مشکل
ابزارهای VMware برای عملکرد خوب VM ، ادغام بهتر سیستم عامل مهمان و خاموش کردن VM تمیز ضروری است. اما در محیط هایی با ده ها یا صدها دستگاه مجازی ، نگه داشتن آن در نسخه های مختلف ESXI کثیف است.
N-Central ، ابزار نظارت و مدیریت از راه دور ما (RMM) ، به ما اجازه داد تا در حین ویندوزهای وصله کار برنامه ریزی کنیم. بنابراین من تصمیم گرفتم یک اسکریپت PowerShell بسازم که:
- آخرین نسخه VMware Tools را بصورت آنلاین بررسی می کند
- آن را با نسخه نصب شده محلی مقایسه می کند
- در صورت لزوم ، به روز رسانی را بارگیری می کند و به روز می کند
- در طول مسیر همه چیز را ثبت می کند
فیلمنامه PowerShell
در اینجا فیلمنامه کامل است. من در یک لحظه بخشی از آن را توضیح خواهم داد. شما می توانید آن را از GitHub من در اینجا بارگیری کنید
$URL = "https://packages.vmware.com/tools/esx/latest/windows/x64/"
$LogFilePath = "C:\temp\VMwareToolsUpdateScript.log"
(Get-Date).ToString() + " : Script Initiated" >> $logfilepath
$PSversion = Get-Host | Select-Object Version
(Get-Date).ToString() + " : PowerShell version = " + $PSversion >> $logfilepath
$QueryVMWareToolsVersion = Invoke-WebRequest $URL -UseBasicParsing
$VMWareToolsSetupName = $QueryVMWareToolsVersion.Links.HREF | Select -Skip 1
[string]$VMWareToolsNewestVersion = $VMWareToolsSetupName -replace ".*VMware-tools-" -replace "-.*"
$VMWareToolsInstalledVersion = Get-WmiObject Win32_Product -Filter "Name like 'VMware Tools'" | Select-Object -ExpandProperty Version
[string]$VMWareToolsInstalledVersion = $VMWareToolsInstalledVersion.Substring(0,$VMWareToolsInstalledVersion.LastIndexOf('.'))
If ([version]$VMWareToolsInstalledVersion -lt [version]$VMWareToolsNewestVersion) {
$DownloadURL = $URL + $VMWareToolsSetupName
try {
Invoke-WebRequest -Uri $DownloadURL -OutFile "C:\temp\$VMWareToolsSetupName"
(Get-Date).ToString() + " : Download Finished!" >> $logfilepath
} catch {
(Get-Date).ToString() + " : Download Failed" >> $logfilepath
}
$ArgumentList = "/S /v " + '"/qn REBOOT=R ADDLOCAL=ALL"' + " /l C:\temp\VMwareToolsSetup.log"
$FilePath = "C:\temp\" + $VMWareToolsSetupName
try {
Start-Process -FilePath $FilePath -ArgumentList $ArgumentList
(Get-Date).ToString() + " : Installation Finished!" >> $logfilepath
} catch {
(Get-Date).ToString() + " : Installation Failed" >> $logfilepath
}
} else {
(Get-Date).ToString() + " : VMware latest version is already installed!" >> $logfilepath
}
(Get-Date).ToString() + " : Script executed successfully" >> $logfilepath
چگونه کار می کند
بیایید این مرحله به مرحله را بشکنیم:
1. ورود به سیستم و تشخیص نسخه PowerShell
(Get-Date).ToString() + " : Script Initiated" >> $logfilepath
$PSversion = Get-Host | Select-Object Version
ما با ورود به سیستم به موقع شروع می کنیم و یادداشت می کنیم که نسخه PowerShell در حال اجرا است. این امر به عیب یابی کمک می کند اگر اسکریپت به دلیل ناسازگاری نسخه شکست بخورد (برخی از نسخه های قدیمی تر دارای عجیب و غریب هستند Invoke-WebRequest
).
2. آخرین نسخه ابزارهای VMware را بررسی کنید
$QueryVMWareToolsVersion = Invoke-WebRequest $URL -UseBasicParsing
$VMWareToolsSetupName = $QueryVMWareToolsVersion.Links.HREF | Select -Skip 1
ما به مخزن ابزارهای رسمی VMware ضربه زدیم و به لینک دوم در صفحه نگاه می کنیم (معمولاً اول است ../
). این باید باشد .exe
پرونده برای آخرین نسخه.
[string]$VMWareToolsNewestVersion = $VMWareToolsSetupName -replace ".*VMware-tools-" -replace "-.*"
با استفاده از یک جادوی Regex کوچک ، رشته نسخه را از نام پرونده استخراج می کنیم.
3. نسخه موجود در حال حاضر را تشخیص دهید
$VMWareToolsInstalledVersion = Get-WmiObject Win32_Product -Filter "Name like 'VMware Tools'"
ما از WMI برای دریافت نسخه نصب شده در حال حاضر از ابزارهای VMware استفاده می کنیم. از آنجا که نسخه VMware می تواند شامل شماره های ساخت شود (به عنوان مثال 12.2.5.45654
) ، ما آخرین بخش را برای مقایسه نسخه تمیز تر می کنیم.
4. مقایسه نسخه و ارتقاء مشروط
If ([version]$VMWareToolsInstalledVersion -lt [version]$VMWareToolsNewestVersion)
اگر نسخه نصب شده قدیمی تر باشد ، ما URL بارگیری را می سازیم و نصب را می کشیم.
5. نصب و ورود به سیستم خاموش
$ArgumentList = "/S /v " + '"/qn REBOOT=R ADDLOCAL=ALL"' + " /l C:\temp\VMwareToolsSetup.log"
Start-Process -FilePath $FilePath -ArgumentList $ArgumentList
نصب کننده سکوت راه اندازی می شود (/qn
) با استفاده از راه اندازی مجدد (REBOOT=R
) و نصب کامل ویژگی (ADDLOCAL=ALL
). پرونده ورود به سیستم به تشخیص مشکلات نصب کمک می کند.
چرا این رویکرد کار کرد
- بدون اعتماد به API های vCenter یا ESXi – فقط HTTP و PowerShell ساده
- سازگار با هر سیستم عامل مهمان که پشتیبانی می کند ابزارهای VMware در ویندوز
- هیچ ارتقا غیر ضروری – فقط در صورت وجود نسخه جدیدتر نصب می شود
- ورود به سیستم حسابرسی و عیب یابی را آسان می کند
ما برنامه را برنامه ریزی کردیم که در طول پنجره تعمیر و نگهداری معمولی پچ اجرا شود ، بنابراین هر دستگاه بدون مداخله دستی به روز شد. این یک چیز کوچک است ، اما ساعت ها از تلاش های نگهداری ماهانه ما تراشیده و سازگاری بهتری را در محیط های مشتری تضمین می کند.
فیلمنامه را بارگیری کنید
– اسکریپت کامل را در GitHub بارگیری کنید
افکار نهایی
اتوماسیون همیشه نیازی به فانتزی ندارد. بعضی اوقات ، این فقط در مورد استفاده از ابزاری است که قبلاً به روش هوشمندانه تری دارید. اگر محیط های VMware را اجرا می کنید و می خواهید کارها را ساده نگه دارید ، این رویکرد را امتحان کنید – و به من اطلاع دهید که چگونه برای شما کار می کند!
احساس راحتی کنید که در فیلمنامه چنگال ، بهبود یا پیشنهاد را پیشنهاد دهید. من دوست دارم بشنوم که دیگران چگونه در حال ارتقاء ابزارهای VMware در محیط های پیچیده هستند.