sep
12
2017

T-SQL Tuesday #94 – Vamos a ponernos Posh! Creando máquinas virtuales con PS

tsql2sday150x150 Esta publicación forma parte del T-SQL Tuesday, que es una fiesta de blog mensual el segundo martes de cada mes. Todos son bienvenidos y tienen la oportunidad de escribir sobre SQL Server.
El anfitrión de este mes es Rob Sewell (B|T) y el tema es ¡Vamos a ponernos Posh! , y no se trata de usar sombreros de fantasía e ir a una pista de caballos, sino de Powershell como ya habrías imaginado. Así que aquí está mi pequeña aportación.

 
Antecedentes

Recientemente en el trabajo, hemos rediseñado nuestra infraestructura para proporcionar una mejor disponibilidad y recuperación de desastres (HA / DR) y eso involucra muchos servidores nuevos para redundancia que deben estar lo más cerca posible si no son iguales a los servidores a los que proporcionan failover.

La mayoría de estos servidores serán máquinas virtuales que se ejecutan en diferentes hosts de Windows 2016 Hyper-V y, por pura simplicidad, queremos minimizar el uso de la interfaz de usuario y las configuraciones manuales, así que me remangué la camisa y me puse Posh.

Un buen número de los pasos para crear una configuración de las nuevas máquinas virtuales se puede programar, lo que proporcionará resultados más consistentes y nos facilitará la vida en caso de que necesitemos crear todo de nuevo. Por ejemplo, para crear un nuevo entorno como DEV, TEST, PRELIVE, QA o más.

 
Máquinas virtuales y powershell

Hay muchos comandos para crear o manipular máquinas virtuales y todavía estoy arañando la superficie, pero aunque no me dedico a tiempo completo a PS, debo admitir que cada vez que quiero hacer algo, me resulta relativamente fácil encontrar o bien un comando de PowerShell o un script para poder hacerlo, así que me gusta bastante.

Por ejemplo, crear una máquina virtual es tan simple como un comando

New-VM

Y eso es solo el comienzo, podemos agregar los distintos componente de hardware virtual igual que haríamos en la interfaz de usuario, unidades de disco, adaptadores de red, etc. Y luego configurar la memoria, CPU y NUMA, etc.

Esta es la secuencia de comandos que estoy ejecutando más o menos para crear mis máquinas virtuales, esto en particular será un servidor de Hyper-V en sí mismo, por lo que hay un par de configuraciones interesantes que las comentaré más adelante.

##########################################################
#
# Script to create virtual machines 
# The VM created can be used as a Virtual Host (nested virtualization in Win 2016)
#
##########################################################

##########################################################
# Environment variables
##########################################################
$environment = "d"; # p = production, d = dev, t = test, q = qa
$envprefix = '';

switch ($environment){
    "p" {$envprefix = ''}
    "d" {$envprefix = "DEV"}
    "t" {$envprefix = "TEST"}
    "q" {$envprefix = "QA"}
};

$HyperVHost = "HYPERV-" + $envprefix;
$HyperVSwitchName = "Network Adapter Name";

##########################################################
# variables to create the new VM
##########################################################
$VmNodeNumber = "1"
$VmName = "HYPERV-" + $envprefix + $VmNodeNumber;
$VmMemory = 24GB;
$VmCpuCount = 8;
$VmCpuCountPerNuma = 4;
$VmNumaPerSocket = 2;
$VmMemoryPerNuma = 12GB;

##########################################################
# variables to create C drive for the new VM
##########################################################
$VirtualMachine_VM_path = "D:\"; # VM name will be added automatically
$VirtualMachine_C_path = "D:\$VmName\Virtual Hard Disks\";
$VirtualMachine_C_name = $VmName + "_C.vhdx";
$VirtualMachine_C_fullpath = $VirtualMachine_C_path + $VirtualMachine_C_name;
$VirtualMachine_C_size = 128GB;

##########################################################
# variables to create D drive for the new HyperVisor
##########################################################
$VirtualMachine_D_path = "D:\$VmName\Virtual Hard Disks\";
$VirtualMachine_D_name = $VmName + "_D.vhdx";
$VirtualMachine_D_fullpath = $VirtualMachine_D_path + $VirtualMachine_D_name;
$VirtualMachine_D_size = 896GB;

##########################################################
# path for the ISO file to install OS
##########################################################
$OsIsoFilePath = "D:\ISO\Windows Server 2016\en_windows_server_2016_x64_dvd_2342342.iso"


##########################################################
#
#
# Start the process
#
# 
##########################################################

##########################################################
# Open an remote session with the host
##########################################################
Enter-PSSession -computername $HyperVHost;


##########################################################
# Test the path where we want to create the new VHDX
##########################################################
if ( (Test-Path $VirtualMachine_C_path) -eq $false ) {
    mkdir $VirtualMachine_C_path;
}
elseif ( (Test-Path $VirtualMachine_C_fullpath) -eq $true){
    return "The VHDX file already exists";
    exit;
}

##########################################################
# Create New VM with C drive
##########################################################
New-VM -ComputerName $HyperVHost -Name $VmName -Generation 2 -MemoryStartupBytes $VmMemory -Path $VirtualMachine_VM_path -NewVHDPath $VirtualMachine_C_fullpath -NewVHDSizeBytes $VirtualMachine_C_size;


##########################################################        
# Create New D drive
##########################################################
if ( (Test-Path $VirtualMachine_D_path) -eq $false ) {
    mkdir $VirtualMachine_D_path;
}
elseif ( (Test-Path $VirtualMachine_D_fullpath) -eq $true){
    return "The VHDX file already exists";
    exit;
}

New-VHD -Path $VirtualMachine_D_fullpath -ComputerName $HyperVHost -Dynamic -SizeBytes $VirtualMachine_D_size;

Add-VMHardDiskDrive -ComputerName $HyperVHost -VMName $VmName -ControllerType SCSI -Path $VirtualMachine_D_fullpath;


##########################################################        
# Configure Vm processors and NUMA
##########################################################

Set-VMProcessor -ComputerName $HyperVHost -VMName $VmName -Count $VmCpuCount -MaximumCountPerNumaNode $VmCpuCountPerNuma -MaximumCountPerNumaSocket $VmNumaPerSocket;

Set-VMMemory -ComputerName $HyperVHost -VMName $VmName -MaximumAmountPerNumaNodeBytes $VmMemoryPerNuma;


##########################################################        
# Add ISO file to install OS
##########################################################

Add-VMDvdDrive -ComputerName $HyperVHost -VMName $VmName -Path $OsIsoFilePath;

##########################################################        
# Allow nested virtual hosts
##########################################################

Set-VMProcessor -VMName $VmName -ExposeVirtualizationExtensions $true;

##########################################################        
# Add Network adapter
##########################################################

Connect-VMNetworkAdapter -ComputerName $HyperVHost -VMName $VmName -SwitchName $HyperVSwitchName;
Set-VMNetworkAdapter -VMName $VmName -MacAddressSpoofing On; #Important for nested VMs to have access to the domain!!!!

##########################################################        
# Start the VM if we want to
##########################################################

#Start-VM -ComputerName $HyperVHost -Name $VmName;

##########################################################        
#
#
# at this point the machine is ready to get Windows installed
#
#
##########################################################

exit;

 
Hay un par de configuraciones que son específicas para los Anfitriones Virtuales anidados, una es para permitir que el procesador se virtualice y la otra para permitir que la red funcione correctamente en la Vm.

##########################################################        
# Allow nested virtual hosts
##########################################################

Set-VMProcessor -VMName $VmName -ExposeVirtualizationExtensions $true;

##########################################################        
# Add Network adapter
##########################################################

Connect-VMNetworkAdapter -ComputerName $HyperVHost -VMName $VmName -SwitchName $HyperVSwitchName;
Set-VMNetworkAdapter -VMName $VmName -MacAddressSpoofing On; #Important for nested VMs to have access to the domain!!!!

#

 
Conclusion

Conclusión

Como dije, no soy un experto en el uso de PowerShell ni en la administración de servidores Windows Server, pero parece que hay comandos para todas nuestras necesidades, lo cual es sorprendente, no solo por lo fácil que podemos hacer las cosas, sino por lo fácil que podemos repetir el proceso en caso de necesitarlo.

Todavía tengo que descubrir cómo hacer un par de cosas más, como modificar la configuración de red de la nueva VM o agregar la máquina virtual a un dominio, etc. ¡pero seguro que en breve lo consigo!

¡Gracias por leer y a @sqldbawithbeard por organizar el evento de este mes y felicitaciones por su reciente MVP!

 

One comment

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *