miércoles, 30 de mayo de 2012

Fallo en la instalación del cliente de SCCM

Un par de servidores no reportaban inventario de hardware.
La solución en este caso es bastante drástica, pero por lo general, muy efectiva.

  • Desinstalar el agente de SCCM (ccmsetup.exe /uninstall)
  • Renombrar la carpeta Repository que se encuentra en C:\Windows\System32\WBEM para que Windows regenere el repositorio WMI
  • Reinstalar el cliente. 


Por lo general esta serie de pasos soluciona los problemas con el cliente que generan la ausencia de inventarios de hardware. Sin embargo, muchas veces, y sin que todavía haya encontrado una explicación al asunto, la instalación del cliente simplemente falla.
 En el log de instalación (C:\Windows\System32\CCMSetup\CCMsetup.log) encontramos este mensaje: 

Failed to create the ccmsetup service (0)

Y el mensaje no puede ser más claro. No puede crearse un servicio de Windows para el ejecutable CCMSetup.exe. La solución es muy sencilla entonces, hay que hacer que el instalador se ejecute como un proceso aislado y no como un servicio, y para ello contamos con el parámetro NoService.
Así que simplemente ejecutamos el instalador del cliente de este modo:

CCMSetup.exe /NoService

Y voila!, el cliente de SCCM se instala sin inconvenientes.

lunes, 28 de mayo de 2012

Balancear maquinas virtuales en un cluster con PowerShell

Otro Offtopic, pero no podía dejar de publicar este script de Powershell que hice para distribuir las virtuales en un cluster.
Primero vale aclarar que mis conocimientos de PowerShell son mínimos, y es un lenguaje que me resulta muy difícil de entender y aprender. Vengo del mundo de la programación dura y estructurada, y PowerShell se toma demasiadas "licencias" para mi gusto, por lo que me resulta difícil entender su comportamiento muchas veces.
Aún así hice este sencillo script cuya tarea es bastante simple. Lo que hace es contar el número de maquinas virtuales en un cluster y distribuirlas entre todos los nodos. El "balanceo" no tiene en cuenta recursos, ni nada parecido, es simplemente un conteo de virtuales, pero en mi caso y dentro de nuestra infraestructura resulta bastante útil.

Aquí el script:


Import-Module FailoverClusters

$Cluster=""

$Cluster = Read-Host "Indique nombre del cluster"

$Total=(Get-ClusterResource -cluster $Cluster | where {$_.resourcetype.name -eq "Virtual Machine"}).Count

$Nodos=Get-ClusterNode -cluster $Cluster

$CantNodos=(Get-ClusterNode -cluster $Cluster).count

Write-host "El cluster $Cluster tiene un total de $Total maquinas virtuales a distribuir en $CantNodos nodos."

$Promedio=[MATH]::ROUND($Total/$CantNodos)

Write-host "En total debería haber $Promedio maquinas virtuales por nodo."

Foreach ($Nodo in $Nodos)

{

    $PorNodo=(Get-ClusterNode $Nodo.Name -cluster $Cluster | Get-ClusterResource | where {$_.resourcetype.name -eq "Virtual Machine"}).count

    Write-Host "El nodo $Nodo tiene $PorNodo maquinas virtuales"

    if ($PorNodo -gt $Promedio)

        {

        $Diferencia=$PorNodo-$Promedio

        Write-Host "Se debe mover $Diferencia maquina/s virtual/es del nodo $Nodo"

        for($i=1; $i -le $Diferencia; $i++)

            {

            Foreach ($Nodo1 in $Nodos)

                {

                $PorNodo1=(Get-ClusterNode $Nodo1.Name -cluster $Cluster | Get-ClusterResource | where {$_.resourcetype.name -eq "Virtual Machine"}).count

                if ($PorNodo1 -lt $Promedio)

                    {

                        $Maquina=Get-ClusterNode $Nodo.Name -cluster $Cluster | Get-ClusterResource | where {$_.resourcetype.name -eq "Virtual Machine"} | Select-object -first 1

                        Write Host "Se procede a mover la maquina virtual $Maquina"

                        Move-ClusterVirtualMachineRole -Name $Maquina.OwnerGroup -Cluster $Cluster -node "$Nodo1"
                        Break

                    }

                }

            }

        }



}


Como dije, no soy experto en PowerShell, y estoy seguro de que esto puede hacerse mejor, más fácil y con menos líneas de código. Pero esto funciona y lo hace muy bien.

Las máquinas virtuales se mueven utilizando LiveMigration, así que el uso del script no implica corte de servicios, y solo es válido en cluster de Hyper-V 2008 R2.