Creació màquines virtuals Hyper-V automàticament

Aquesta entrada consisteix en el procés de creació màquines virtuals sobre Hyper-V de forma automatitzada, amb una configuració concreta a partir d’un disc dur, que s’utilitza de plantilla, mitjançant un script de PowerShell. Normalment, aquest procés es fa amb Microsoft System Center Virtual Machine Manager, no obstant, en un entorn petit o si no disposem d’aquesta eina, aquesta pot ser una bona forma de semi-automatització.

 

Preparant una maqueta de Windows Server 2016 per la creació màquines virtuals

Ei que també serveix per a la versió Windows Server 2012 R2 i Windows 10. El procés és el mateix.

Per començar cal disposar d’un disc dur virtual que actuï com a plantilla per les noves màquines virtuals, alguns en direu maqueta, els altres planxa, altres mestre, etc… la finalitat és la mateixa. Microsoft ha actualitzat el sistema operatiu de servidors, és una bona ocasió de crear les noves plantilles amb Microsoft Windows Server 2016, ja sigui amb una versió d’escriptori o core.

Naturalment, la primera màquina virtual s’ha de muntar a mà, (almenys en aquesta entrada), però un cop la tenim al nostre gust es pot deixar preparada perquè actuï com a plantilla.

 

Què passa amb la llicència de Windows?

Al crear una plantilla no és adequat fer-ho en un equip amb una llicència instal·lada, ja què al fer la plantilla aquesta es perd. El normal és fer-ho sense llicència o amb una llicència d’activació automàtica. És a dir, unes llicències preestablertes que al introduir-les desencadena una sèrie d’accions a la màquina, per exemple, buscar a la xarxa un equip que assigni automàticament les llicències (llicències KMS) o bé, si és una màquina virtual, que s’activi sola des de l’amfitrió (AVMA).

Al crear la plantilla us recomano utilitzar una clau AVMA (Automatic Virtual Machine Activation) o bé una KMS.

Llicències AVMA (Automatic Virtual Machine Activation)

Les màquines s’activen automàticament mitjançant la llicència de l’amfitrió. Funciona en entorns amb Microsoft Hyper-V, tant per llicenciament OEM (adquirit amb la màquina) com amb llicenciament de Volum (llicències de contracte OPEN o SELECT).

L’amfitrió ha de ser un Windows Server 2012 R2 Datacenter o Windows Server 2016 Datacenter. No serveix en llicències Standard!

Si la màquina amfitrió és un servidor Windows Server 2016 Datacenter, pot activar màquines virtuals Windows Server 2016 o 2012 R2 amb les edicions Datacenter, Standard o Essentials.

Si la màquina amfitrió és un servidor Windows Server 2012 R2 Datacenter, pot activar màquines virtuals Windows Server 2012 R2 amb les edicions Datacenter, Standard o Essentials. No pot activar màquines virtuals amb Windows Server 2016!

Perquè les màquines virtuals s’activin amb aquest mètode, complint tot l’anterior, la clau de producte que han de tenir instal·lada els equips o màquines virtuals per l’activació automàtica correspon a les següents taules:

Les següents llicències NO activen el producte per sí soles, simplement s’informa al sistema operatiu que ha de fer alguna cosa per trobar la llicència definitiva, si no ho troba la màquina es queda sense activar.

Claus d’activació AVMA per a Windows Server 2012 R2 (només activa màquines virtuals Windows Server 2012 R2)

Edició Clau a instal·lar
Datacenter Y4TGP-NPTV9-HTC2H-7MGQ3-DV4TW
Standard DBGBW-NPF86-BJVTX-K3WKJ-MTB6V
Essentials K2XGM-NMBT3-2R6Q8-WF2FK-P36R2

 

Claus d’activació AVMA per a Windows Server 2016 (activa màquines virtuals Windows Server 2012 R2 i Windows Server 2016

Edició Clau a instal·lar
Datacenter TMJ3Y-NTRTM-FJYXT-T22BY-CWG3J
Standard C3RCX-M6NRP-6CXC9-TW2F2-4RHYD
Essentials B4YNW-62DX9-W8V6M-82649-MHBKQ

Si en el procés de instal·lació no s’ha utilitzat una clau d’aquest tipus, es pot afegir o canviar mitjançant la següent comanda de consola de sistema:

slmgr /ipk <clau_AVMA>

Per exemple, si tenim una màquina virtual amb Windows Server 2016 Standard, des de la consola de sistema executarem la següent comanda per instal·lar la clau de producte:

slmgr /ipk C3RCX-M6NRP-6CXC9-TW2F2-4RHYD

 

Llicències KMS

Són per l’activació d’equips mitjançant la xarxa interna. Requereixen d’un servidor de llicències, que té instal·lada la clau KMS que es proporciona al comprar les llicències. Aquesta clau només s’obté mitjançant un contracte de Volum: OPEN, SELECT… No serveix per a instal·lacions amb llicències OEM (llicències comprades amb l’equip), en aquests casos s’han d’instal·lar les llicències MAK, assignada a cada equip, ja sigui físic o virtual.

A no ser que siguin llicències de Windows Server Datacenter sobre Hyper-V que es pot utilitzar el mètode anterior, el AVMA.

Claus d’activació KMS per a Windows Server 2016

Edició Clau a instal·lar
Datacenter CB7KF-BWN84-R7R2Y-793K2-8XDDG
Standard WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY
Essentials JCKRF-N37P4-C2D82-9YXRT-4M63B

 

Claus d’activació KMS per a Windows Server 2012 R2

Edició Clau a instal·lar
Datacenter W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9
Standard D2N9P-3P6X9-2R39C-7RTCD-MDVJX
Essentials KNC87-3J2TX-XB4WP-VCPJV-M4FWM

També passa el mateix que en el cas anterior, si la màquina virtual o, també en aquest cas també, la física no s’han instal·lat amb aquesta clau de producte, es pot canviar mitjançant la comanda de consola de sistema:

slmgr /ipk <clau_KMS>

Ja sé que no és objecte d’aquesta entrada, però potser també us interessa tenir les claus KMS del sistema operatiu client Microsoft Windows 10:

Claus d’activació KMS per a Windows 10

Edició Clau a instal·lar
Professional W269N-WFGWX-YVC9B-4J6C9-T83GX
Enterprise NPPR9-FWDCX-D2C8J-H872K-2YT43
Enterprise 2015 LTSB WNMTR-4C88C-JK8YV-HQ7T2-76DF9
Enterprise 2016 LTSB DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ
Education NW6C2-QMPVW-D7KKK-3GKT6-VCFB2

 

Fitxer per la configuració desatesa

El següent punt és preparar el fitxer de configuració desatesa (unattend.xml) per l’inicialització de l’equip un cop arranca per primer cop sense que pregunti massa cosa o res.

Us deixo un fitxer unattend.xml d’exemple, que he creat amb l’entorn Microsoft Deployment Toolkit. La configuració és per tenir l’entorn amb anglès, però el teclat i configuració regional de les aplicacions amb espanyol. La zona horària correspon a Espanya. El nom de l’equip serà automàtica començant amb el nom de l’empresa que s’ha indicat al fitxer. I, el més important, la contrasenya de l’Administrador local s’estableix a P@ssw0rd

Copiar el fitxer a la carpeta del sysprep per exemple. La ruta correspon a: c:\Windows\System32\sysprep amb el nom unattend.xml.

Si ho tenim tot a punt, tanquem la màquina (preparar-la per fer-ne còpies) per poder desplegar altres màquines a partir d’aquesta. Des d’una consola de sistema amb privilegis d’administrador, executar la següent comanda:

c:\Windows\System32\sysprep\Sysprep /generalize /oobe /shutdown /unattend:c:\Windows\system32\sysprep\unattend.xml /mode:vm

El sistema prepara l’equip per ser copiat i el deixa parat. És el moment de fer la còpia del disc dur virtual! per a altres màquines virtuals.

Creació màquines virtuals. Procés Sysprep.
Creació màquines virtuals. Procés de tancament de la maqueta amb Sysprep.

Un cop tenim una nova màquina amb una còpia del disc dur que hem preparat, només cal engegar-la. El sistema l’ha personalitzat tot sol amb el què s’ha especificat en el fitxer unattend.xml.

Creació màquines virtuals. Inici de la nova màquina.
Creació màquines virtuals. Inici de la nova màquina, el sistema operatiu es personalitza.

Esperar una estona a què acabi, segurament reiniciarà algun cop. No us preocupeu està seguint el guió. No us ha de preguntar res, el procés és completament automàtic amb el què li hem demanat.

Creació màquines virtuals. Acabant de configurar els detalls de la personalització.
Creació màquines virtuals. Acabant de configurar els detalls de la personalització de l’equip de forma automàtica.

Finalitzat tot el procés, fer Control + Alt + Supr per iniciar sessió. No hem hagut de tocar res i el sistema està llest per treballar. Ull, si heu utilitzat el fitxer anterior unattend.xml, recordeu que ha canviat la contrasenya d’administrador local: P@ssw0rd

Creació màquines virtuals. La màquina ja s'ha iniciat sense cap intervenció externa.
Creació màquines virtuals. La màquina ja s’ha iniciat sense cap intervenció externa. Tot a punt per començar a treballar.

 

Script PowerShell creació màquines virtuals automàticament

Tenim la maqueta de la màquina virtual, o millor dit, el seu disc dur. És el que està apagat i NO s’ha engegat després de tancar la maqueta. El reservem en una carpeta a banda per fer-ne còpies per les diferents màquines que haguem de crear.

En aquest apartat comencem a programar una mica amb PowerShell per fer el següent:

  1. Crear una nova màquina virtual amb una configuració estàndard.
  2. Connectar la màquina virtual a un switch virtual predefinit.
  3. Personalitzar la configuració de la màquina virtual en quan a processador, memòria, com s’ha d’engegar, com s’ha de parar, serveis d’integració entre amfitrió i màquina virtual.
  4. Moure la definició de la màquina virtual a una carpeta amb el seu nom del què penjaran tots els fitxers que en depèn.
  5. Crear el seu disc dur C a partir del disc dur mestre que s’ha creat en el procés anterior.
  6. Assignar el disc dur C a la màquina virtual i establir-lo com a únic mètode d’arrancada de la mateixa.
  7. Engegar la nova màquina virtual.
  8. El procés d’instal·lació desatesa ens la deixarà amb la pantalla del Control + Alt + Supr. Llesta per treballar.

Ara bé, no us vull deixar només l’script per executar-lo i ja està, no estaria fent bé la feina.

Es tracta d’ensenyar a pescar, perquè podeu continuar sols i no de donar-vos-ho tot mastegat perquè sempre depengueu d’algú altri.

En l’amfitrió de virtualització, obrir la consola de PowerShell en el seu entorn gràfic i amb privilegis d’administrador. En el menú d’inici heu de buscar el Windows PowerShell ISE. Botó dret damunt el nom i clicar a executar com Administrador.

Obrir la consola gràfica de PowerShell amb privilegis d'administrador.
Obrir la consola gràfica de PowerShell amb privilegis d’administrador.

Assegurar que es visualitza la finestra per crear un script. En la pantalla anterior no hi és, clicar a la part superior dreta l’opció Script per visualitzar-la.

Creació màquines virtuals amb Hyper-V. En l'entorn gràfic accedir a la finestra de Script
Creació màquines virtuals amb Hyper-V. En l’entorn gràfic accedir a la finestra de Script

S’ha d’escriure a la part de dalt, per després poder executar a la consola de PowerShell de la part inferior de forma seguida. Ho farem pas a pas, però després ho ajuntarem en dues funcions.

Establim els paràmetres, diguem estàndards, de les màquines virtuals a crear. Nom de la màquina virtual, ubicació del disc dur que s’utilitzarà com a plantilla (el que s’ha creat en el pas anterior), nom del switch virtual on es connectarà la màquina virtual, quantitat de memòria RAM estàtica que tindrà la màquina virtual i el nombre de virtual CPUs. Tot això ho podem en variables al principi. Si tenim la necessitat de canviar-ho, és més fàcil fer-ho així que amb codi pel mig. Per tant, s’han de declarar variables. En PowerShell la declaració de variables es fa mitjançant el símbol del dòlar ($) al davant del nom. Els comentaris es marquen amb el símbol coixinet (#) seguit del comentari. Aquests no fa falta que es copiïn, serveixen per entendre el codi.

$nomVM = "srvPROVA"
$plantillaVHDX = "D:\VMs\Plantilles\Windows2016coreplantilla.vhdx"
$switch = "swExtern" #switch virtual on connectar les màquines virtuals.
$MemoriaRAM = 2048MB #memòria RAM de la màquina virtual.
$CPUs = 2 # número de processadors virtuals

A continuació hem de jugar una mica amb les variables anteriors per la reubicació dels fitxers en el disc dur.

$CarpetaVM = "d:\VMs\" + $nomVM  # La carpeta que contindrà les subcarpetes i fitxers de la VM.
$CarpetaVHDX = $CarpetaVM + "\Virtual Hard Disks\" # La carpeta on es copiarà el disc dur virtual.
$UbicacioDisc = $CarpetaVHDX + $nomVM + "_C.vhdx" # El nom del disc dur virtual per la unitat C.

Ja tenim totes les dades necessàries. El següent pas és fer alguna cosa amb elles. Comencem comprovant que el switch virtual existeix. En cas que no existeixi, en creem un del tipus Privat on connectar la màquina virtual.

La comanda if actua com a condicional (si passa això, fes això altre). El què? doncs es fa un llistat dels switchs virtuals que té l’amfitrió (Get-VMSwitch). D’aquesta llista només es selecciona el què el seu nom és el que s’ha indicat a la variable $switch. Amb el resultat, es fa un recompte (.count) de la quantitat de switch que hi pot haver. Si la llista conté 1 element, bingo, el switch existeix. Posant el símbol d’admiració a l’inici (!), indica que s’ha de complir precisament el contrari, si la llista no és igual a 1, no tenim switch. Per tant, per no donar errors a la creació de màquines virtuals, se’n crea un d’entorn privat. La comanda write-host serveix per treure alguna cosa per pantalla, en cas de crear el switch ho indica amb el text de color verd.

if (!(Get-VMSwitch | Where-Object -Property Name -eq $switch).count -eq 1)
{
   # El switch virtual no existeix, se'n crea un del tipus privat.
   New-VMSwitch -Name $switch -SwitchType Private
   write-host("No existeix el switch parametritzat, s'ha creat un de privat anomenat: " + $switch) -foregroundColor Green
}

Passem a crear la màquina virtual pròpiament dita (New-VM), establint els paràmetres bàsics necessaris. Nom (-Name), memòria (-MemoryStartupBytes), switch (-SwitchName) i generació del maquinari (Generation). Ja sabeu aquest últim, 1 per màquines Windows 2008 R2 endarrera i 2 per màquines Windows 2012 R2 endavant. En comptes dels valors concrets, s’utilitzen les variables que s’han declarat a la primera part:

New-VM -Name $nomVM -MemoryStartupBytes $MemoriaRAM -SwitchName $switch -Generation 2

Amb la màquina virtual creada, la part bàsica, com que ocupa poc espai, és el moment de moure tots els seus fitxers a una ubicació única i controlada, que sinó després ens tornem bojos. Això és fa amb el Move-VMStorage. Indicant la màquina virtual (get-vm $nomVM) i la carpeta de destí (-DestinationStoragePath). També podeu veure que s’utilitzen variables en comptes de noms concrets.

Move-VMStorage -VM (get-vm $nomVM) -DestinationStoragePath $CarpetaVM

Afinem la configuració de la màquina virtual. Es defineix que la memòria sigui estàtica (-StaticMemory) en comptes de dinàmica, el nombre de CPUs (-ProcessorCount), que la màquina s’engegui 10 segons després iniciar l’amfitrió (-AutomaticStartAction Start i -AutomaticStartDelay 10), que la màquina es pari ordenadament al tancar l’amfitrió (-AutomaticStopAction ShutDown) i que no tingui habilitats els punts de consistència (snapshots) per defecte (-CheckpointType Disabled).

set-vm $nomVM -StaticMemory -ProcessorCount $CPUs -AutomaticStartAction Start -AutomaticStartDelay 10 -AutomaticStopAction ShutDown -CheckpointType Disabled

També es deshabilita la sincronització de l’hora des de l’amfitrió a la màquina virtual. Si això no ho teniu ben configurat i hi ha una desincronització de més de 5 minuts, esteu fora de l’Active Directory i suposa molts problemes!.

Disable-VMIntegrationService -VMName $nomVM -name *time*

La màquina virtual ja està ben definida, falta el disc dur. Crear la carpeta per allotjar els discs durs virtuals (new-item) dins la carpeta de la màquina virtual, copiar el disc dur que (copy-item) s’ha maquetat i canviar-li el nom (rename-item).

New-Item $CarpetaVHDX -type directory
Copy-item $plantillaVHDX -Destination $CarpetaVHDX
Rename-Item ($CarpetaVHDX + "Windows2016coreplantilla.vhdx") $UbicacioDisc

Afegir el nou disc dur a la màquina virtual (add-vmharddiskdrive) com a disc dur SCSI (si la màquina és de generació 1 ha de ser IDE) i configurar-lo com a mètode d’inici de la màquina virtual (set-vmfirmware). Si la màquina és de generació 1 ha de ser set-vmbios:

Add-VMHardDiskDrive -VMName $nomVM -Path $UbicacioDisc -ControllerType SCSI
Set-VMFirmware -VMName $NomVM -BootOrder (Get-VMHardDiskDrive -VMName $nomvm)

Ja està tot a punt, només queda engegar la màquina virtual (start-vm) i que el procés de maquetació acabi la seva feina. Ens podem connectar a ella directament (vmconnect):

start-vm (Get-VM $nomVM)
vmconnect localhost $nomVM

Amb tot això escrit a la part superior, ja es pot posar a la pràctica clicant el botó del play o prement la tecla F5.

Creació màquines virtuals Hyper-V. Execució script PowerShell.

Esperar una estona. Depenent de la mida de la plantilla tardarà més o menys en copiar-la. És la part més pesada d’aquests script.

Creació màquines virtuals Hyper-V. Executant l'script de PowerShell

Per acabar obrint-se una consola amb la nova màquina virtual acabant de personalitzar-se i quedar-se amb el Control + Alt + Supr llesta per treballar.

creacio-vm-hyperv-automaticament-009

 

La cosa no acaba aquí. Això només crea una màquina virtual i si en vull crear moltes de seguides? He d’estar modificant aquest script cada vegada? La resposta és NO, sinó que a partir de tot aquest codi anterior, es crea una funció (function NovaVM { }) on a dins de les claus s’hi posa el codi i en fem una petita variació, en comptes d’especificar el nom de la màquina virtual, fem que l’agafi del paràmetre ($nomVM = $args[0]) que se li passarà a la funció. La resta és tot igual (no reprodueixo tot el codi de nou (…)).

function NovaVM
{
   $nomVM = $args[0]

   $plantillaVHDX = "D:\VMs\Plantilles\Windows2016coreplantilla.vhdx"
   $switch = "swExtern" #switch virtual on connectar les màquines virtuals.
...
   start-vm (Get-VM $nomVM)
   vmconnect localhost $nomVM
}

Si ara s’executa aquest script, NO passa res, simplement s’ha definit una funció a la consola, però que no té una acció directa al sistema. No s’ha creat cap nova màquina virtual ni res de res.

Creació màquines virtuals Hyper-V. Creant la funció de PowerShell.

Per crear una nova màquina virtual utilitzant la nostra funció, s’executa el nom de la funció (NovaVM) seguida del nom de la nova màquina virtual (srvDOS).

novavm srvDOS

Per tancar, i si vull crear un entorn de varies màquines virtuals a la vegada? Per exemple una d’Active Directory (srvDC), una per Microsoft SQL Server (srvSQL) i dues per a servidor web (srvWEB1 i srvWEB2).

Es crea una funció en que se li puguin passar tots aquests noms (param) i vagi creant (foreach) una a una les màquines virtuals utilitzant la funció anterior (NovaVM).

function CrearEntornAppWeb
{
   param([string[]] $VMs)
   foreach ($VM in $VMs)
   {
      write-host("Creant màquina virtual: " + $VM) -ForegroundColor Green
      NovaVM $VM
   }
}

És una funció, per tant tampoc a fet res al executar-la, simplement s’ha donat d’alta al sistema. Però ara tenim una instrucció molt potent, poseu-vos còmodes mentre va creant i engegant les 4 màquines virtuals tot sol:

CrearEntornAppWeb srvDC,srvSQL,srvWEB1,srvWEB2

creacio-vm-hyperv-automaticament-011

Un cop finalitza de treballar per a nosaltres, tenim les quatre màquines engegades i a punt per a treballar.

Creació màquines virtuals Hyper-V. Entorn desplegat.

 

I, és clar, no escriurem cada vegada totes aquestes línies de codi!. Menú Fitxer, Guardar com. El proper cop només cal obrir-lo i executar-lo per tenir a disposició per la creació màquines virtuals. També és pot afegir a altres processos automàtics, la feina grossa ja està feta. Quin serà el teu proper pas?

 

Us deixo l’script que he creat en aquesta entrada, penjat en el repositori de GitHub, per no picar tant de codi.

 

T’ha agradat l’article? El pots compartir a les xarxes socials. També pots deixar la teva opinió, comentari o suggeriment. Gràcies!

Similar Posts by The Author: