Ako vyrobiť niekoľko Linuxových virtuálnych serverov naraz

Jedného dňa, sa nám kolega ponúkol, že nás vyškolí na Docker. Dostal som za úlohu, vytvoriť pár Linuxových serverov.

Rozhodnutie padlo na Ubuntu 18.04 server. Poprosil som ho teda, aby virtuálny server nainštaloval a nakonfiguroval ho tak, ako je pre školenie nevyhnutné. Nainštalovaný a nakonfigurovaný server som prekonvertoval na VMwareovú template, vyrobil “customization specification” a na základe nej som vyrobil nový virtuálny server.

Po spustení nového servera sa však dostavilo niekoľko problémov. Vo vašom prípade môžu byť symptómy rovnaké, no príčina a prípadné riešenie týchto problémov môžu byť odlišné. Preto odporúčam pri každom probléme najprv si prezrieť logy:

 sudo cat /var/log/vmware-imc/toolsDeployPkg.log 

 

1. problém: Neprebehol korektne “customization script”. Hostaname aj IP adresa ostala rovnaká, ako má template.

1. riešenie: Install/Update Perl:


sudo apt update

sudo apt-get install perl

 

2. problém: “Customizaton script” prebehol, nové virtuálne servre dostali správny Hostname, no nedostali žiadnu IP adresu.

2. riešenie: Kedže v toolDeployPkg.log logu bolo: “Customization command failed: Failed to create bus connection: No such file or directory” a o tomto type hlásenia pojednáva VMware KB56409, na vyriešenie môjho problému bolo nutné použiť “workaround” s úpravou dvoch súborov. Moje prostredie totiž nie je možné povýšiť na vSphere 6.7 U3.

 

3. problém: Aj napriek použitiu “workaroundu” z predchádzajúceho KB, nové virtuálne servre IP adresu nedostali.

3. riešenie: Príčina môjho problému tkvela v tom, že network config v Ubuntu 18.04 už nepoužíva mac adresu ako “default” ID pre DHCP požiadavky. Musel som teda obnoviť použitie mac adresy ako “default ID” a to tak, že som zapísal reťazec dhcp-identifier: mac do súboru 01-netcfg.yaml.

sudo nano /etc/netplan/01-netcfg.yaml

Výsledný obsah súboru potom vyzerá takto:

 
network:
  version: 2
  renderer: networkd
  ethernets:
    ens160:
      dhcp4: yes
      dhcp-identifier: mac

Poznámka: Dbajte na dodržiavanie odsadenia v .yaml.

Potom už iba:

sudo netplan apply

 

Po vyriešení problémov už stačilo iba vyrobiť script na automatické vytváranie nových virtuálnych serverov.

param (
       [int]$NumOfVMs = 1,
       [string]$NotificationEmail = "<name>@<your_company>.<your_domain>"
)
$start = (Get-Date).Minute
Import-Module VMware.PowerCLI
$creds = Get-Credentials 
Connect-VIServer -Server <vcenter.yourcompany>.<your_domain> -credential $creds

$Header = @"
<style>
h1, h5, th { text-align: center; }
table { margin: auto; font-family: Segoe UI; box-shadow: 10px 10px 5px #888; border: thin ridge grey; }
th { background: #0046c3; color: #fff; max-width: 400px; padding: 5px 10px; }
td { font-size: 11px; padding: 5px 20px; color: #000; }
tr { background: #b8d1f3; }
tr:nth-child(even) { background: #dae5f4; }
tr:nth-child(odd) { background: #b8d1f3; }
</style> 
"@

$Location = Get-Folder "Discovered Virtual Machine" | Where-Object {$_.Id -eq "<Folder-group-vXX>"}
$OSSpecs = Get-OSCustomizationSpec -Name <your_linux_custom_spec>
$VMTemplate = Get-Template -Name <your_linux_tmpl>
$Hostnames = 1..$NumOfVMs | foreach{New-Object -TypeName PSObject -Property @{Name = ("Linux-Edu{0}" -f $_)}}
foreach ($hostname in $Hostnames){
         New-VM -Name $Hostname.Name -Template $VMTemplate -OSCustomizationSpec $OSSpecs -VMHost <your_esx> -Datastore <your_datastore> -Notes "Linux for education" -Location $Location 
}

Start-Sleep -Seconds 100

$NewVMs = Get-VM Linux-Edu*
Start-VM -VM $NewVMs
$stop = (Get-Date).Minute

Start-Sleep -Seconds 300
$time = $stop - $start
$body = "<body><b>Generated:</b> $(Get-Date) <br><br> <body><b>Build time:</b> $($time) minutes<br><br>"
$body = $body + "</head>" 



$VMSummary = $NewVMs | ForEach-Object {$_ | Select-Object Name,NumCpu,MemoryGB,@{N="DiskGB";E={[math]::round($_.ExtensionData.Guest.Disk.Capacity / 1gb,3)}},@{N="Hostname";E={$_.ExtensionData.Guest.HostName}},@{N="IP Address";E={$_.ExtensionData.Guest.IpAddress}},@{N="OS";E={$_.ExtensionData.Guest.GuestFullName}}}
$VMSummaryHTML = $VMSummary | ConvertTo-Html -Head $Header -Body $body

Send-MailMessage -To "<$NotificationEmail>" -From "VM Automat <vmautomat@your_company.your_domain>" -BodyAsHtml "$($VMSummaryHTML)" -SmtpServer <your_company>-<your_domain>.mail.protection.outlook.com -Subject "New Linux VMs for education" 

Servre dostávali názvy Linux-EduX kde X bolo poradové číslo servera. Ich počet je možné upraviť parametrom -NumOfVMs a e-mailovú adresu pre súhrnné info parametrom -NotificationEmail.

./New-LinuxVMsEdu.ps1 -NumOfVMs 5 -NotificationEmail 'meno@firma.domena'

Súhrnná tabuľka, ktorú dostanete v notifikačnom e-maili vyzerá približne takto:

Author: Martin

Infrastructure engineer | virtualization & cloud enthusiast | vSphere specialist | blogger | VMware vExpert 2017, 2018, 2019, 2020 | VMCE | Slovak VMUG Leader |  user group ambassador for kmug.sk | husband&father