Automatiser le traitement de l’erreur “Host IPMI Event Log Status”

Nous avons vu la dernière fois qu’une nouvelle commande localcli était disponible pour vider l’IPMI System Event Log des serveurs ESXi. Nous allons en profiter pour l’automatiser, de telle sorte à ce que nous n’ayons plus à nous en préoccuper !

Pour cela nous allons exécuter un script qui va :

  • identifier les serveurs pour lesquels l’alarme est activée
  • activer SSH pour ces serveurs
  • se connecter en ssh à l’aide de plink (un putty en ligne de commande) pour y exécuter les commandes permettant de réinitialiser l’IPMI System Event Log.
  • désactiver SSH

Tout d’abord, il nous faut préparer un fichier texte qui contient les commandes à passer via SSH:

localcli hardware ipmi sel clear
nohup /sbin/services.sh restart > foo.out 2> foo.err < /dev/null &
sleep 120
exit

Nous appellerons ce fichier CleaIPMILog-commands.txt. Il envoie la commande d’effacement des journaux, redémarre les services (en prenant soin de ne pas être lui-même déconnecté), attend 2 minutes (temps de redémarrage des services), puis se déconnecte.

Maintenant, le script.

# Variables
$vCenterName = "FQDN_du_vCenter"
$vCenterLogin = "domaine\admin_du_vCenter"
$vCenterPassword = "XXX"
$esxilogin = "root"
$esxipassword = "XXX"
$plink = "chemin_vers_plink.exe"
$plinkoptions = "-ssh -pw $esxipassword -noagent -m"
$plinkcommands = "chemin_vers_ClearIPMILog-commands.txt"

# Chargement des cmdlet powercli et démarrage du script
$VMwareManagement = Get-PSSnapin | where {$_.name -match "VMware.VimAutomation.Core"}
if (!$VMwareManagement) {
Add-PSSnapin VMware.VimAutomation.Core
}

# Connexion vCenter et récupération de la liste des hôtes
Connect-VIServer -server $vCenterName -User $vCenterLogin -Password $vCenterPassword
$esx_all = Get-VMHost | Get-View

# Parcours des hôtes à la recherche de l'alarme IPMI SEL
foreach ($esx in $esx_all){
    foreach($triggered in $esx.TriggeredAlarmState){
        $alarm = get-View -Id $triggered.Alarm
        If ($alarm.Info.Name -eq "Host IPMI System Event Log Status"){
            # si l'alarme est détectée on démarre SSH sur l'hôte
            $vmhost = get-vmhost $esx.name
            $sshService = Get-VmHostService -VMHost $vmhost | Where { $_.Key -eq “TSM-SSH”}
            Start-VMHostService -HostService $sshService -Confirm:$false
                # Connexion en SSH et envoi des commandes
                cmd /c "echo Y | $plink $plinkoptions $plinkcommands $esxilogin@$vmhost"
            # Arrêt de SSH
            Stop-VMHostService -HostService $sshService -Confirm:$false
        }
    }
}

Enregistrez le script à côté du fichier texte (par exemple dans ClearIPMILog.ps1) et modifiez les variables en en-tête du script. Tout est prêt !

L’exécution du script peut prendre plusieurs minutes (en particulier si plusieurs hôtes ont l’erreur), puisqu’il y a deux minutes d’attente après le redémarrage des services pour chaque serveur. De plus, à la suite de l’exécution il faut jusqu’à 5 minutes pour que l’erreur disparaisse du vCenter. Il ne faut donc pas être pressé !

L’idée est de lancer ce script dans une tâche planifiée, relativement régulièrement (de toutes les heures à une fois par jour, en fonction de votre environnement).

Quelques dernières remarques à propos du script :

  • On peut éviter de laisser les identifiants du vCenter en clair dans le script en gérant des fichiers de credentials ; cela sera l’objet d’un autre article.
  • On peut le faire également pour les identifiants de l’ESXi… mais pas pour plink, qui ne sait envoyer qu’un mot de passe en clair. Il n’y a donc pas le choix, et le mieux à faire est de restreindre l’accès au script autant que possible.
  • On part du principe que SSH est désactivé sur l’hôte (ce qui est recommandé). Si dans votre environnement SSH est activé vous pouvez supprimer les lignes du script qui démarrent et arrêtent ce service !

Adieu les erreurs IPMI !