preloader
26 October 2010 / #Powercli #Vsphere

Mon HostProfile n'est plus compliant !

esxHostProfile

Nous avons rencontré un problème assez intéressant concernant les HostProfile.

Pour rappel, les HostProfile correspondent à des profils (jusque là, assez logique) dans lequel sont stockées des informations de configuration et qui peuvent être utilisés afin de répliquer cette configuration à d’autres serveurs hôtes. Par exemple, vous montez un cluster vSphere avec x nodes, vous effectuez la configuration type sur un des noeuds, et la répliquer sur tous les autres.

Cela permet notamment d’assurer une unicité dans la configuration des hôtes (pour éviter des problèmes divers comme des incidents lors de vMotion si l’orthographe des noms de PortGroup sont différents) et de facilité la mise à jour (on ne met à jour que le profil que l’on rapplique sur les hôtes).

Pour en revenir à notre problème, on avait une alerte dans le vCenter comme quoi un hôte n’était pas compliant sur le profil du cluster. L’alerte remontée était :

For port group xxx network policy property spec.policy.nicTeaming.failureCriteria doesn't match

Sur la console, dans la configuration du Teaming, on avait des valeurs identiques sur tous les hôtes, par exemple :

spec.policy.nicTeaming.failureCriteria

Nous nous sommes donc posé la question de savoir ce qu’attendait le HostProfile, en l’exportant en xml, on a eu pour la configuration de ce PortGroup :

<policy>
    <id>NetworkFailoverPolicy</id>
    <policyOption>
        <id>FixedFailoverCriteria</id>
        <parameter>
            <key>criteria</key>
            <value xsi:type="HostNicFailureCriteria">
                <checkSpeed>minimum</checkSpeed>
                <speed>10</speed>
                <checkDuplex>false</checkDuplex>
                <fullDuplex>false</fullDuplex>
                <checkErrorPercent>false</checkErrorPercent>
                <percentage>0</percentage>
                <checkBeacon>false</checkBeacon>
            </value>
        </parameter>
    </policyOption>
</policy>

En voyant tous les paramètres présent dans la configuration du HostProfile et après plusieurs vérifications, on a découvert que c’était certains paramètres du Teaming qui n’étais pas visibles sur la console qui différaient.

Pour s’en assurer, on a réaliser ce script d’affichage de ces paramètres :

$clusNameToCheck = "xxx"
$portGroupToCheck = "xxx"
$report = @()

$hostsClus = Get-Cluster -Name $clusNameToCheck | Get-VMHost | Get-View

foreach($esx in $hostsClus){
    $esx.Config.Network.PortGroup | where {$_.Key -eq "key-vim.host.PortGroup-$portGroupToCheck"} | %{
        $repEsx = "" | select-Object Name, checkSpeed, speed, checkDuplex, fullDuplex, checkErrorPercent, percentage, checkBeacon
        $repEsx.Name = $esx.name
        $repEsx.checkSpeed = $_.Spec.Policy.NicTeaming.FailureCriteria.checkSpeed
        $repEsx.speed = $_.Spec.Policy.NicTeaming.FailureCriteria.speed
        $repEsx.checkDuplex = $_.Spec.Policy.NicTeaming.FailureCriteria.checkDuplex
        $repEsx.fullDuplex = $_.Spec.Policy.NicTeaming.FailureCriteria.fullDuplex
        $repEsx.checkErrorPercent = $_.Spec.Policy.NicTeaming.FailureCriteria.checkErrorPercent
        $repEsx.percentage = $_.Spec.Policy.NicTeaming.FailureCriteria.percentage
        $repEsx.checkBeacon = $_.Spec.Policy.NicTeaming.FailureCriteria.checkBeacon
        $report += $repEsx
    }
}
$report | Format-Table -Autosize

Le retour de cela pour le cluster et le PortGroup qui faisait défaut a été :

Name checkSpeed speed checkDuplex fullDuplex chErrPerc perc checkBeacon
---- ---------- ----- ----------- ---------- --------- ---- -----------
xxx                 0       False      False     False    0       False
xxx  minimum       10       False      False     False    0       False
xxx  minimum       10       False      False     False    0       False
xxx  minimum       10       False      False     False    0       False
xxx  minimum       10       False      False     False    0       False
xxx                 0       False      False     False    0       False
xxx  minimum       10       False      False     False    0       False
xxx  minimum       10       False      False     False    0       False

On voit bien que 2 des hôtes n’ont pas la même valeur que les autres (ceux qui apparaissent comme étant non-compliant)

Pour remettre les choses d’équerre, mettre le serveur hôte qui a le problème, réappliquer le HostProfile

Dans certains, cela ne suffira pas. Il sera donc possible d’effectuer cette manipulation en PowerCLI via le script suivant :

$hostESX = "xxx"</p>
$pgname = "xxx"
$vSwitch = "xxx"
$esx = Get-VMHost "$hostESX" | Get-View

$net = Get-View $esx.configmanager.networksystem

$portgroupspec = New-Object VMWare.Vim.HostPortGroupSpec
$portgroupSpec.vswitchname = $vSwitch
$portgroupspec.Name = $pgname
$portgroupspec.policy = New-object vmware.vim.HostNetworkPolicy
$portgroupspec.policy.NicTeaming = New-object vmware.vim.HostNicTeamingPolicy
$portgroupspec.policy.NicTeaming.failureCriteria = New-Object vmware.vim.HostNicFailureCriteria
$portgroupspec.policy.NicTeaming.failureCriteria.checkSpeed = "minimum"
$portgroupspec.policy.NicTeaming.failureCriteria.speed = 10

$net.UpdatePortGroup($pgname,$PortGroupSpec)

La méthode UpdatePortGroup ne provoque pas d’interruption réseau (contrairement à la modification du teaming active-standby), mais pour être sûre, tester auparavant !

LucD a réalisé un excellent document Word sur l’utilisation de PowerCLI pour le NIC Teaming sur vSphere, vous pouvez le trouver là : Portgroup - how to configure Nic Teaming, merci à lui !


> Frederic MARTIN