Creación de vm automatizado – PowerCli

Hola de nuevo!

Os traigo el script en PowerCli para desplegar máquinas virtuales de forma masiva.

Necesitais un .csv con los siguientes campos alojado en el mismo path del script.

No meja ponerlos en una sola linea pero estos son los titulos para las columnas del csv

vCenter Template Cluster VMName Notas
Ipaddr Subnet Gateway Vlan Customization Ram
VirtualCPUtotal SocketCoreDown

Y este es el script:

 


 

cls
 Write-host "#########################################################################################################" -foregroundcolor green
 # Cabecera Ayuda.
 Write-host
 {
 ################################################
 ##    IMFORMACION PREVIA  (Alta de maquina)   ##
 ################################################

1.Rellenar el archivo vmWindows.csv
 Template: Plantilla
 Datastore: DTS donde alojar la VM
 Vmhost: Host ESXi donde alojar la VM
 Customization: Custom con toda la configuracion
 Vmname: Nombre de VM
 Ipaddr: IP de VM
 Subnet: Mascara subred
 Gateway: Puerta de enlace
 Pdns: DNS
 Vlan: VLAN ID
 Ram: Memoria RAM
 VirtualCPUtotal: CPUs Total
 SocketCoreDown: Cores por procesador (desplegable de abajo en el "Edit Settings")

2.Conectate al VCENTER

3.Una vez terminado el script, esperar a que cada maquina haga el sysprep, duracion 10 min aprox.

4.La maquina contestara a ping y cuando nos logemos la primera vez entrara en dominio e instalara los agentes (Se reiniciara sola)

5.Despues ya podremos hacer la siguiente operativa:
 5.1Revisar vmTools.
 5.2Revisar el HOST y Datastore

}

Write-host "#########################################################################################################" -foregroundcolor green
 Read-Host "--> Si estas seguro de todos los pasos pulsa ENTER para continuar... (Si no, CTRL+C)"

#Declaración de variables
 $vmlist = Import-CSV -Delimiter ";" vmWindowsv2.csv
 foreach ($item in $vmlist)
 {
 # Mapeo de las variables con los datos del CSV
 $Cluster = $item.cluster
 $Template = $item.template
 $customization = $item.customization
 $vmname = $item.vmname
 $ipaddr = $item.ipaddr
 $subnet = $item.subnet
 $gateway = $item.gateway
 $pdns ="****"
 $vlan = $item.vlan
 $RAM = $item.ram
 $virtualCPUtotal = $item.virtualCPUtotal
 $socketCoreDown = $item.socketCoreDown
 $disksize = 40 + $RAM
 $notas = $item.Notas
 $env = $vmname.Substring(1,4)
 $s = "S"
 $v = "*"
 $server= "$s$env$v"

$esx = Get-Cluster $Cluster | Get-VMHost -name $server
 $vmhost = $esx | Get-Random

if ($env -eq "****") {
 $Luns = Get-Datastore  -vmhost $vmhost | where {$_.Name -LIKE "****" -AND $_.FreeSpaceMB -gt 600000}
 $datastore = $luns | Get-Random

}
 else {

$Luns = Get-Datastore  -vmhost $vmhost | where {$_.Name -LIKE "****" -AND $_.FreeSpaceMB -gt 600000}
 $datastore = $luns | Get-Random

}

Write-host Generando instalacion para $item.vmname -foregroundcolor yellow
 $item
 Write-host Tamaño disco C: $disksize -foregroundcolor yellow
 Write-host Host: $vmhost -foregroundcolor yellow
 Write-host Datastore: $datastore -foregroundcolor yellow
 Write-host
 Write-host Clonando maquina... -foregroundcolor green

Get-oscustomizationspec $customization | Get-OSCustomizationNicMapping | where {$_.Position -eq 1}| Set-OSCustomizationNicMapping -IpMode UseStaticIp -IpAddress $ipaddr -SubnetMask $subnet -DefaultGateway $gateway -dns $pdns | out-null

#Comando para la clonación
 New-VM -Name $vmname -Template $Template -Datastore $datastore -VMHost $vmhost | Set-VM -OSCustomizationSpec $customization -RunAsync  -Confirm:$false

#Configuramos VLAN
 $eth1 = Get-NetworkAdapter -vm $vmname | where {$_.name -eq "Network Adapter 1"}| Set-NetworkAdapter -NetworkName $vlan -Confirm:$false | out-null

#Ampliacion disco C
 Get-HardDisk $vmname | where {$_.Name -eq "hard disk 1"} | Set-HardDisk -CapacityGB $disksize -Confirm:$false | out-null

#Configuramos RAM y CPU
 Write-host Configuramos RAM y CPU -foregroundcolor yellow
 $RAM = Set-VM $vmname -MemoryGB $ram -Confirm:$false
 $spec=New-Object –Type VMware.Vim.VirtualMAchineConfigSpec –Property @{“NumCoresPerSocket” = $socketCoreDown}
 (Get-VM –Name $vmname).ExtensionData.ReconfigVM_Task($spec)
 get-vm $vmname | set-vm -numcpu $virtualCPUtotal -Confirm:$false

#Plantilla Usada
 Set-VM $vmname -Description $notas -Confirm:$false | out-null

# Actualizamos HW
 # Comprobamos versión esxi
 $HWversion = Get-VMHost $vmhost | select | % {$_.version}

#######################################
 ##   ESXi version  |   HW Version    ##
 ##        ESXi 6.0    |        11          ##
 ##        ESXi 5.5     |        10          ##
 ##        ESXi 5.1     |        9          ##
 ##        ESXi 5.0     |        8          ##
 #######################################

write-host Version del esxi $HWversion -foregroundcolor green
 $hwstr6= $HWversion.Substring(0,1)
 $hwstr5= $HWversion.Substring(2,1)

if ($hwstr5 -eq 1) {Set-VM -VM $vmname -Version v10 -Confirm:$false | out-null}    # 5.1.0
 if ($hwstr5 -eq 5) {Set-VM -VM $vmname -Version v10 -Confirm:$false | out-null}    # 5.5.0
 if ($hwstr6 -eq 6) {Set-VM -VM $vmname -Version v11 -Confirm:$false | out-null}    # 6.0.0

$HWvm = Get-VM $vmname | select | % {$_.version}

write-host
 write-host Se actualiza el hw de la maquina a la ultima version -foregroundcolor green
 write-host El HW actual de la máquina es: $HWvm -foregroundcolor green
 write-host

#Arrancamos la maquina

Start-VM -VM $vmname | out-null
 write-host "  --> Maquina creada y arrancada"    -foregroundcolor green
 write-host

}

Write-host --> Finaliza el alta de maquinas -foregroundcolor green

———————————————————————————

 

 

 

 

 

 

 

Automatizar procesos, ¿si o no?

Como sabéis los administradores de sistemas nos encontramos con situaciones o proyectos repetitivos, tediosos y como los llamo yo… “trabajos atomicos”

También nos podemos encontrar que a veces por intentar automatizar procesos nos metemos en un bucle que no salimos y acabamos tardando más en hacer el script que en ejecutar la tarea a mano. Yo tengo en cuenta los siguientes criterios para valorar si merece la pena o no invertir tiempo en automatizar la tarea:

 

  1.  Tener claro el fin del automatismo y todos sus pasos.
  2.  Ser conscientes de todos los puntos en común entre distintos objetos a consultar o modificar, por ejemplo, que la longitud del nombre sea la misma o si es distanta en los objetos.
  3.  Pensar en futuro, si inviertes tiempo en algo puntual o lo puedes utilizar más adelante o estandarizar en un departamento como operativa a seguir.
  4. Escalabilidad, que se puedan incluir más parametros o mas acciones si son necesarias en el futuro sin tener que hacer un desarrollo nuevo.
  5. Facíl de explicar y de comprender, sabemos que automatizar una tarea repetitiva y cambiarle el modo de realizar puede ser poco aceptada por los compañeros.
  6. Sobre todo, que todo el mundo vea la utilidad y esto sea valorado.

 

 

Script revision host ESXi – PowerCli

Hola!

Aqui tenéis el script, en PowerCli, para revisar que todos los host de tu vCenter cumplan tu standard y tengas un entorno homogeneo. Si necesitais agregar algún parametro a revisar lo podemos añadir.

Parametros:

Versión ESXi
DNS
SSH (Activo y sin alarma)
NTP
Cantidad de vlans
Cantidad de DTS
Cluster

Código (de momento copialo y pegalo en un notepad o notepad ++ para poder leerlo mejor)

—————————————————————————————————————-

 

<#

Scrip para la comprobación del vcenter:

Nos conectamos al vcenter en cuestion (Connect-VIServer)
 Nos situamos en la ruta donde tengamos el script
 Ejecutamos ./CheckHost.ps1
 Esperamos a que termine y comprobamos en el excel que realiza para ver donde teniamos problemas.
 Para estar seguro de que todo esta correcto se puede lanzar otra vez.

#>

cls

#Declaramos variables

$vmhost = get-vmhost | select | % {$_.name}
 $vmhostname = get-vmhost | select Name
 $Random = $vmhost | get-Random
 $vcenterlarge = Get-VMHost $Random| get-view | % {$_.client.ServiceUrl}
 $vcenter = $vcenterlarge.Substring(8,24)

Write-host Check del vCenter $vcenter -foregroundcolor yellow
 Write-host ""
 Write-host Revisamos version host
 Write-host     "    " -Comprobar que todos tengan la misma version
 Write-host ""
 Write-host Revisamos DNS
 Write-host     "    " -Nuestro DNS: ********
 Write-host ""
 Write-host Revisamos SSH
 Write-host     "    " -Si el valor de SSHalarm es 1: es correcto
 Write-host ""
 Write-host Revisamos NTP
 Write-host "    " En Policy, si aparece ON esta correcto.
 Write-host ""
 Write-host Revisamos el numero de VLAN.
 Write-host "    " Ojo! Si el host es de Admin tendra menos vlan
 Write-host ""
 Write-host Revisamos el numero de DTS.
 Write-host ""
 Write-host Revisamos a que CLUSTER pertenece.
 Write-host ""

$Report2 = @()
 foreach ($item in $vmhostname)
 {

$CheckINFO = {} | Select Name,Version,DNS,SSHrunning,SSHpolicy,SSHalarm,NTPenabled,NTPrunning,NTPpolicy,NTPip,NumVLAN,NumDTS,Cluster

$Name = $item.name
 $DNS = ***************
 $NTP = ***************

$CheckINFO.Name = $name

$numbuild = Get-VMHost $name | get-view | % {$_.Config.Product.FullName}
 $build = $numbuild.Substring(31,7)
 $numversion = $numbuild.Substring(7,10)
 [string]$CheckINFO.version = $numversion,$build

$CheckINFO.DNS = Get-VMHost $name | Get-VMHostNetwork | Select | % {$_.DNSAddress}

$VLAN = Get-VirtualPortGroup -VMHost $name | Where-Object {$_.Name -match "vlan"} | select name
 $CheckINFO.NumVLAN = $VLAN.count

$DTS = Get-VMHost $name | Get-Datastore | select name
 $CheckINFO.NumDTS = $DTS.count

$CheckINFO.Cluster = Get-VMHost $name | get-cluster | select | % {$_.name}

if ($CheckINFO.DNS -ne "$DNS") {Write-host "El dns del servidor $name esta incorrecto, generando ps1 para solucion..." -foregroundcolor magenta

Get-VMHostNetwork -VMHost $name | Set-VMHostNetwork -DomainName ad.bbva.com -DNSAddress $DNS -Confirm:$false | out-null

}

$CheckINFO.SSHrunning = get-vmhost $name | Get-VMHostService | Where { $_.Key -eq "TSM-SSH"} | select | % {$_.Running}
 if ($CheckINFO.SSHrunning -ne "Running") {Write-host "La configuracion SSH (Servicio Parado) en $name no es correcta, solucionando..." -foregroundcolor magenta

Get-vmhost $name | Foreach {Start-VMHostService -HostService ( $_ | Get-VMHostService | Where { $_.Key -eq "TSM-SSH"} )} | out-null

}
 $CheckINFO.SSHpolicy = get-vmhost $name | Get-VMHostService | Where { $_.Key -eq "TSM-SSH"} | select | % {$_.Policy}
 if ($CheckINFO.SSHpolicy -ne "on") {Write-host "La configuracion SSH (Arranque Automatico) en $name  no es correcta, solucionando..." -foregroundcolor magenta

Get-VMHost $name | Foreach {Get-VMHostService -VMHost $name | Where-Object {$_.Key -eq "TSM-SSH"} | Set-VMHostService -policy "on" -Confirm:$false}  | out-null

}
 $CheckINFO.SSHalarm = get-vmhost $name | Get-AdvancedSetting | Where {$_.Name -eq "UserVars.SuppressShellWarning"} | select | % {$_.value}
 if ($CheckINFO.SSHalarm -ne "1") {Write-host "La configuracion SSH (Alerta Sumary) en $name  no es correcta, solucionando..." -foregroundcolor magenta

Get-VMHost $name | Get-AdvancedSetting | Where {$_.Name -eq "UserVars.SuppressShellWarning"} | Set-AdvancedSetting -Value "1" -Confirm:$false | out-null

}
 $CheckINFO.NTPenabled = Get-VMHostFirewallException -VMHost $name | where {$_.Name -match "NTP"} | select | % {$_.Enabled}
 if ($CheckINFO.NTPenabled -ne "True") {Write-host "La configuracion NTP (Cliente Parado) en $name no es correcta, solucionando..." -foregroundcolor magenta

Get-VMHostFirewallException -VMHost $name | where {$_.Name -match "NTP"} | Set-VMHostFirewallException -Enabled:$true | out-null

}

$CheckINFO.NTPrunning = get-vmhost $name | Foreach {Start-VMHostService -HostService ($_ | Get-VMHostService | Where { $_.Key -eq "ntpd"} )} | select | % {$_.Running}
 if ($CheckINFO.NTPrunning -ne "Running") {Write-host "La configuracion NTP (Servicio Parado) en $name no es correcta, solucionando..." -foregroundcolor magenta

Get-vmhost $name | Foreach {Start-VMHostService -HostService ($_ | Get-VMHostService | Where { $_.Key -eq "ntpd"} )} | out-null

}

$CheckINFO.NTPpolicy = get-vmhost $name | Foreach {Start-VMHostService -HostService ($_ | Get-VMHostService | Where { $_.Key -eq "ntpd"} )} | select | % {$_.Policy}
 if ($CheckINFO.NTPpolicy -ne "on") {Write-host "La configuracion NTP (Arranque Automatico) en $name no es correcta, solucionando..."    -foregroundcolor magenta

$ntp = Get-VmHostService -VMhost $name | Where {$_.Key -eq 'ntpd'}
 Set-VMHostService -HostService $ntp -policy "on" | out-null

}
 $CheckINFO.NTPip = Get-VMHost $name | Get-VMHostNtpServer
 if ($CheckINFO.NTPip -ne "$NTP") {Write-host "La configuracion NTP (Servidor Correcto) en $name no es correcta, solucionando..." -foregroundcolor magenta

Add-VmHostNtpServer -NtpServer $NTP -VMHost $name -Confirm:$false | out-null

}

Write-host ""
 $Report2 += $CheckINFO

}

Write-host "    "vCenter revisado Todos los host cumplen el standard -foregroundcolor green
 Write-host ""
 $Report2 | Export-Csv vCENTERcompliance.csv -NoTypeInformation

 

—————————————————————————————————————-