Scripts de gestion des chemins FC sous ESXi avec VPlex

English sum-up :
Some shell scripts to statically select a preferred path within all FC paths availables on an ESXi connected via VPlex metro.

MAJ 30 Novembre 2014 : quelques corrections de bug dans les scripts (test de connexion notamment).

Je vous en avais parlé il y a quelques mois (voir ce billet), nous n’utilisons pas – encore – PowerPath VE pour nos serveurs ESXi et nous travaillons donc avec le MPIO intégré en mode « Fixed/Preferred » de VMWare. Pour le coup, cela nous oblige à sélectionner « à la main » des chemins préférés correspondant bien au cluster local de chaque ESXi dans notre infra VPlex Metro. Pour plus de précision à ce sujet, je vous renvoie une seconde fois au billet précédent sur ce sujet.

Nos scripts historiques étaient certes très précis et fonctionnaient bien, mais il leur manquait une qualité importante : la vitesse ! En effet, pour parcourir l’ensemble des devices FC d’un ESXi, vérifier les chemins préférés et les modifier éventuellement, cela prenait du temps… beaucoup de temps, via les commandes esxcfg-XXX et esxcli. Désormais, il n’est pas rare d’avoir, pour un ESXi donné, quasiment une centaine de devices différents. Au final, cela représentait des heures de parcours sur l’ensemble de nos machines.

Il fallait accélérer tout cela et c’est désormais chose faite ! Vous allez le voir dans la suite, les nouveaux « turbo-scripts » sont beaucoup plus rapides (une à deux minutes par serveur disposant de plusieurs dizaines de device), mais il a fallut sacrifier un peu les tests préalables et l’inspection de chaque device, l’un après l’autre. La nouvelle méthode traite tous les devices en une seule fois, sans vérifier si toutes les commandes sont couronnées de succès. Ceci étant, l’expérience nous a montré que dans l’ensemble, toute cette mécanique fonctionnait globalement très bien et de manière fiable. La confiance aidant, voici donc le résultat : des scripts simples, efficaces, rapides et directement « publiables » sur ce blog car extrèmement génériques (contrairement aux précédents).

L’objectif est donc de forcer un chemin préféré sur l’ensemble des devices d’un ESXi qui pointent vers un directeur précis de notre VPlex (on peut l’utiliser pour tout autre chose que VPlex ceci dit !). Ces scripts sont exécutés, chez nous, sur une appliance « VMA » 5.5 disposant de toutes les fonctions et commandes nécessaires. Nous n’utilisons que 3 commandes : esxcfg-scsidevs, esxcfg-mpath et esxcli .

Le script principal effectue en une seule passe la modification de l’ensemble des chemins FC du serveur ESXi via 3 étapes. En entrée il faut indiquer l’ip ou le FQDN de la machine cible ainsi que le WWN de la cible SCSI à « préférer ». Pour un VPlex « mono-engine » en Metro-Cluster avec du cross-connect, chaque device FC connecté dispose potentiellement de 8 chemins différents (2 par directeur, donc 4 par engine). Par exemple dans notre cas :

vi-admin@caladanvma:~/scripts$ esxcfg-mpath --server bacassab2 --username root --password xxxxxxxx  -L | grep " naa.6000144000000010200c338525b5e6e1"
vmhba3:C0:T1:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba3 0 1 9 NMP active fc.2000a0481ce4c142:1000a0481ce4c142 fc.5000144047200c33:50001442800c3300
vmhba3:C0:T0:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba3 0 0 9 NMP active fc.2000a0481ce4c142:1000a0481ce4c142 fc.5000144047300c33:50001442900c3300
vmhba3:C0:T3:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba3 0 3 9 NMP active fc.2000a0481ce4c142:1000a0481ce4c142 fc.5000144047300e28:50001442900e2800
vmhba3:C0:T2:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba3 0 2 9 NMP active fc.2000a0481ce4c142:1000a0481ce4c142 fc.5000144047200e28:50001442800e2800
vmhba4:C0:T0:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba4 0 0 9 NMP active fc.2000a0481ce4c143:1000a0481ce4c143 fc.5000144047300c33:50001442900c3301
vmhba4:C0:T3:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba4 0 3 9 NMP active fc.2000a0481ce4c143:1000a0481ce4c143 fc.5000144047300e28:50001442900e2801
vmhba4:C0:T2:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba4 0 2 9 NMP active fc.2000a0481ce4c143:1000a0481ce4c143 fc.5000144047200e28:50001442800e2801
vmhba4:C0:T1:L9 state:active naa.6000144000000010200c338525b5e6e1 vmhba4 0 1 9 NMP active fc.2000a0481ce4c143:1000a0481ce4c143 fc.5000144047200c33:50001442800c3301

Vous noterez que les 8 cibles se terminent par les WWN des différents directeurs du VPlex :
50001442800c3300
50001442900c3300
50001442900c3301
50001442800c3301
50001442900e2800
50001442800e2800
50001442900e2801
50001442800e2801

Il faut donc indiquer au script quel WWN, parmi cette liste, doit devenir la cible préférée des devices de l’ESXi. Voici donc les 3 étapes en question :
1. On récupère la liste des devices et surtout de leur identifiant unique « naa.XXXXXXXXXXX »
2. On récupère la liste des chemins SCSI détectés par le module MPIO de l’ESXi
3. On parcours l’ensemble des devices (par identifiant) et on isole les chemins correspondants au WWN cible
4. On modifie le chemin par défaut en conséquence

Mais, trève de blabla :

USER=root
PWD=XXXXXXXX

if [ "$2" == "" ]; then
        echo "USAGE : $0   -b"
        exit 0
fi

srv=$1
defaultpathid=$2

if [ "$3" != "-b" ]; then
        echo "Serveur : $srv"
        echo "Suffixe defaultpath : $2"

        echo -n "Test de connexion ... "
        result=`esxcli --server $srv --username $USER --password $PWD system version get`
        echo $result | grep "Version:" >/dev/null 2>&1
        if [ $? -eq 1 ]; then
                echo "erreur, stop"
                exit 1
        else
                echo "ok"
        fi
fi

echo -n "Recuperation liste des devices du serveur $srv ... "
esxcfg-scsidevs --server $srv --username $USER --password $PWD -c | grep -v "^Device" | awk '{print $1}' >/tmp/naa$$
nb=`cat /tmp/naa$$ | wc -l`
echo "nb device = $nb"

echo -n "Recuperation liste des chemins compatible avec la cible $defaultpathid ... "
esxcfg-mpath --server $srv --username $USER --password $PWD -L | grep $defaultpathid >/tmp/mpath$$
nb=`cat /tmp/mpath$$ | wc -l`
echo "nb compatible = $nb"
if [ $nb -eq 0 ]; then
        echo "Aucun resultat. Stop"
        exit 1
fi

for device in `cat /tmp/naa$$`
do
        echo -n "Traitement du device $device ... "
        cible=`cat /tmp/mpath$$ | grep $device`
        if [ "$cible" != "" ]; then
                echo -n "cible trouvee : "
                newpath=`echo $cible | awk '{ print $1 }'`
                echo "$newpath -> set"
                esxcli --server $srv --username $USER --password $PWD storage nmp psp fixed deviceconfig set -d $device -p $newpath
        else
                echo "aucune cible trouvee"
        fi

done

rm /tmp/naa$$
rm /tmp/mpath$$
exit 0

Au final, ce script produit une sortie de ce type :

vi-admin@caladanvma:~/scripts$ time sh forcepref.sh shirkaXXXXX 900e2801
Serveur : shirkaXXXXX
Suffixe defaultpath : 900e2801
Test de connexion ... ok
Recuperation liste des devices du serveur shirkaXXXXX ... nb device = 48
Recuperation liste des chemins compatible avec la cible 900e2801 ... nb compatible = 47
Traitement du device naa.6000144000000010200c338525b5e6ec ... cible trouvee : vmhba4:C0:T1:L10 -> set
Traitement du device naa.6000144000000010200c338525b5e6b5 ... cible trouvee : vmhba4:C0:T1:L4 -> set
Traitement du device naa.6000144000000010200c338525b5e6f3 ... cible trouvee : vmhba4:C0:T1:L11 -> set
Traitement du device naa.6000144000000010200c338525b5eae5 ... cible trouvee : vmhba4:C0:T1:L0 -> set
Traitement du device naa.6000144000000010200c338525b5eae6 ... cible trouvee : vmhba4:C0:T1:L46 -> set
Traitement du device naa.6000144000000010300c3356f0ff7321 ... cible trouvee : vmhba4:C0:T1:L25 -> set
Traitement du device naa.6000144000000010200c338525b5e6bc ... cible trouvee : vmhba4:C0:T1:L5 -> set
Traitement du device naa.6000144000000010300c3356f0ff7362 ... cible trouvee : vmhba4:C0:T1:L32 -> set
Traitement du device naa.6000144000000010300c3356f0ff72c5 ... cible trouvee : vmhba4:C0:T1:L23 -> set
Traitement du device naa.6000144000000010300c3356f0ff7367 ... cible trouvee : vmhba4:C0:T1:L31 -> set
Traitement du device naa.6000144000000010200c338525b5e6fa ... cible trouvee : vmhba4:C0:T1:L12 -> set
Traitement du device naa.6000144000000010300c3356f0ff73e8 ... cible trouvee : vmhba4:C0:T1:L41 -> set
Traitement du device naa.6000144000000010300c3356f0ff73e9 ... cible trouvee : vmhba4:C0:T1:L42 -> set
Traitement du device naa.6000144000000010300c3356f0ff732e ... cible trouvee : vmhba4:C0:T1:L26 -> set
Traitement du device naa.6000144000000010300c3356f0ff736c ... cible trouvee : vmhba4:C0:T1:L30 -> set
Traitement du device naa.6000144000000010200c338525b5e6c4 ... cible trouvee : vmhba4:C0:T1:L6 -> set
Traitement du device naa.6000144000000010300e2870fd440b53 ... cible trouvee : vmhba4:C0:T1:L29 -> set
Traitement du device naa.6000144000000010300e2870fd440b58 ... cible trouvee : vmhba4:C0:T1:L28 -> set
Traitement du device naa.6000144000000010200c338525b5e68c ... cible trouvee : vmhba4:C0:T1:L2 -> set
Traitement du device naa.6000144000000010200c338525b5e6cb ... cible trouvee : vmhba4:C0:T1:L7 -> set
Traitement du device naa.6000144000000010300c3356f0ff7371 ... cible trouvee : vmhba4:C0:T1:L38 -> set
Traitement du device naa.6000144000000010300c3356f0ff7376 ... cible trouvee : vmhba4:C0:T1:L37 -> set
Traitement du device naa.6000144000000010300c3356f0ff7573 ... cible trouvee : vmhba4:C0:T1:L43 -> set
Traitement du device naa.6000144000000010300e2870fd440b5d ... cible trouvee : vmhba4:C0:T1:L27 -> set
Traitement du device naa.6000144000000010300c3356f0ff733b ... cible trouvee : vmhba4:C0:T1:L24 -> set
Traitement du device naa.6000144000000010300c3356f0ff737b ... cible trouvee : vmhba4:C0:T1:L36 -> set
Traitement du device naa.6000144000000010200c338525b5ed67 ... cible trouvee : vmhba4:C0:T1:L14 -> set
Traitement du device naa.6000144000000010200c338525b5ed68 ... cible trouvee : vmhba4:C0:T1:L20 -> set
Traitement du device naa.6000144000000010300e2870fd440b62 ... cible trouvee : vmhba4:C0:T1:L35 -> set
Traitement du device naa.6000144000000010300e2870fd440b67 ... cible trouvee : vmhba4:C0:T1:L34 -> set
Traitement du device naa.6000144000000010200c338525b5e9f0 ... cible trouvee : vmhba4:C0:T1:L15 -> set
Traitement du device naa.6000144000000010200c338525b5e9f1 ... cible trouvee : vmhba4:C0:T1:L16 -> set
Traitement du device naa.6000144000000010200c338525b5e9f2 ... cible trouvee : vmhba4:C0:T1:L17 -> set
Traitement du device naa.6000144000000010200c338525b5e9f3 ... cible trouvee : vmhba4:C0:T1:L18 -> set
Traitement du device naa.6000144000000010200c338525b5e9f4 ... cible trouvee : vmhba4:C0:T1:L19 -> set
Traitement du device naa.6000144000000010200c338525b5ee88 ... cible trouvee : vmhba4:C0:T1:L21 -> set
Traitement du device naa.6000144000000010200c338525b5e6da ... cible trouvee : vmhba4:C0:T1:L8 -> set
Traitement du device naa.6000144000000010300c3356f0ff7381 ... cible trouvee : vmhba4:C0:T1:L39 -> set
Traitement du device naa.6000144000000010300e2870fd440b6c ... cible trouvee : vmhba4:C0:T1:L33 -> set
Traitement du device naa.6000144000000010300c3356f0ff7586 ... cible trouvee : vmhba4:C0:T1:L44 -> set
Traitement du device naa.600508b1001c4ffcfc48d05a3bd51d1d ... aucune cible trouvee
Traitement du device naa.6000144000000010200c338525b5e708 ... cible trouvee : vmhba4:C0:T1:L13 -> set
Traitement du device naa.6000144000000010200c338525b5e709 ... cible trouvee : vmhba4:C0:T1:L22 -> set
Traitement du device naa.6000144000000010300c3356f0ff75cf ... cible trouvee : vmhba4:C0:T1:L45 -> set
Traitement du device naa.6000144000000010200c338525b5e6e1 ... cible trouvee : vmhba4:C0:T1:L9 -> set
Traitement du device naa.6000144000000010200c338525b5ead3 ... cible trouvee : vmhba4:C0:T1:L1 -> set
Traitement du device naa.6000144000000010300e2870fd440b72 ... cible trouvee : vmhba4:C0:T1:L40 -> set
Traitement du device naa.6000144000000010200c338525b5e6ad ... cible trouvee : vmhba4:C0:T1:L3 -> set

real    0m20.703s
user    0m14.485s
sys     0m0.640s
vi-admin@caladanvma:~/scripts$

Vous noterez que le forçage des quelques 47 device s’est fait en moins de 20 secondes. A titre de comparaison, nos précédents scripts réalisaient tout cela en plus de 15 minutes… Bien entendu, le script ne vérifie pas si ses actions on réellement porté leurs fruits, mais par sécurité, on peut passer un script (un peu plus long) qui va vérifier que tous les chemins préférés on bien été modifiés comme il se doit. Le voici (il ressemble beaucoup au premier) :

USER=root
PWD=XXXXXXXX

if [ "$2" == "" ]; then
        echo "USAGE : $0   -b"
        exit 0
fi

srv=$1
defaultpathid=$2

if [ "$3" != "-b" ]; then
        echo "Serveur : $srv"
        echo "Suffixe defaultpath : $2"

        echo -n "Test de connexion ... "
        result=`esxcli --server $srv --username $USER --password $PWD system version get`
        echo $result | grep "Version:" >/dev/null 2>&1
        if [ $? -eq 1 ]; then
                echo "erreur, stop"
                exit 1
        else
                echo "ok"
        fi
fi

echo -n "Recuperation liste des devices du serveur $srv ... "
esxcfg-scsidevs --server $srv --username $USER --password $PWD -c | grep -v "^Device" | awk '{print $1}' >/tmp/naa$$
nb=`cat /tmp/naa$$ | wc -l`
echo "nb device = $nb"

echo -n "Recuperation liste des chemins compatible avec la cible $defaultpathid ... "
esxcfg-mpath --server $srv --username $USER --password $PWD -L | grep $defaultpathid >/tmp/mpath$$
nb=`cat /tmp/mpath$$ | wc -l`
echo "nb compatible = $nb"
if [ $nb -eq 0 ]; then
        echo "Aucun resultat. Stop"
        exit 1
fi

ko=0
for device in `cat /tmp/naa$$`
do
        echo -n "Traitement du device $device ... "
        cible=`cat /tmp/mpath$$ | grep $device`
        if [ "$cible" != "" ]; then
                echo -n "cible trouvee : "
                newpath=`echo $cible | awk '{ print $1 }'`
                echo -n "$newpath -> verif -> "

                verifpath=`esxcli --server $srv --username $USER --password $PWD storage nmp psp fixed deviceconfig get --device $device | tail -1 | awk '{ print $3 }'`
                if [ "$verifpath" == "$newpath" ]; then
                        echo "OK"
                else
                        echo "KO: actuel $verifpath"
                        ko=$(( $ko + 1 ))
                fi
        else
                echo "aucune cible trouvee"
        fi

done

rm /tmp/naa$$
rm /tmp/mpath$$
if [ $ko -ne 0 ]; then
        echo "KO detectes, check !"
        exit 1
fi
exit 0

En sortie, on obtient un listing du style :

vi-admin@caladanvma:~/scripts$ sh checkpref.sh shirkaXXXXX 900c3301
Serveur : shirkaXXXXX
Suffixe defaultpath : 900c3301
Test de connexion ... ok
Recuperation liste des devices du serveur shirkaXXXXX ... nb device = 48
Recuperation liste des chemins compatible avec la cible 900c3301 ... nb compatible = 47
Traitement du device naa.6000144000000010200c338525b5e6ec ... cible trouvee : vmhba4:C0:T1:L10 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6b5 ... cible trouvee : vmhba4:C0:T1:L4 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6f3 ... cible trouvee : vmhba4:C0:T1:L11 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5eae5 ... cible trouvee : vmhba4:C0:T1:L46 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5eae6 ... cible trouvee : vmhba4:C0:T1:L0 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7321 ... cible trouvee : vmhba4:C0:T1:L24 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6bc ... cible trouvee : vmhba4:C0:T1:L5 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7362 ... cible trouvee : vmhba4:C0:T1:L33 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff72c5 ... cible trouvee : vmhba4:C0:T1:L23 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7367 ... cible trouvee : vmhba4:C0:T1:L34 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6fa ... cible trouvee : vmhba4:C0:T1:L12 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff73e8 ... cible trouvee : vmhba4:C0:T1:L41 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff73e9 ... cible trouvee : vmhba4:C0:T1:L42 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff732e ... cible trouvee : vmhba4:C0:T1:L26 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff736c ... cible trouvee : vmhba4:C0:T1:L35 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6c4 ... cible trouvee : vmhba4:C0:T1:L6 -> verif -> OK
Traitement du device naa.6000144000000010300e2870fd440b53 ... cible trouvee : vmhba4:C0:T1:L36 -> verif -> OK
Traitement du device naa.6000144000000010300e2870fd440b58 ... cible trouvee : vmhba4:C0:T1:L37 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e68c ... cible trouvee : vmhba4:C0:T1:L2 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6cb ... cible trouvee : vmhba4:C0:T1:L7 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7371 ... cible trouvee : vmhba4:C0:T1:L27 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7376 ... cible trouvee : vmhba4:C0:T1:L28 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7573 ... cible trouvee : vmhba4:C0:T1:L43 -> verif -> OK
Traitement du device naa.6000144000000010300e2870fd440b5d ... cible trouvee : vmhba4:C0:T1:L38 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff733b ... cible trouvee : vmhba4:C0:T1:L25 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff737b ... cible trouvee : vmhba4:C0:T1:L29 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5ed67 ... cible trouvee : vmhba4:C0:T1:L14 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5ed68 ... cible trouvee : vmhba4:C0:T1:L20 -> verif -> OK
Traitement du device naa.6000144000000010300e2870fd440b62 ... cible trouvee : vmhba4:C0:T1:L30 -> verif -> OK
Traitement du device naa.6000144000000010300e2870fd440b67 ... cible trouvee : vmhba4:C0:T1:L31 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e9f0 ... cible trouvee : vmhba4:C0:T1:L15 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e9f1 ... cible trouvee : vmhba4:C0:T1:L16 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e9f2 ... cible trouvee : vmhba4:C0:T1:L17 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e9f3 ... cible trouvee : vmhba4:C0:T1:L18 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e9f4 ... cible trouvee : vmhba4:C0:T1:L19 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5ee88 ... cible trouvee : vmhba4:C0:T1:L21 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6da ... cible trouvee : vmhba4:C0:T1:L8 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7381 ... cible trouvee : vmhba4:C0:T1:L39 -> verif -> OK
Traitement du device naa.6000144000000010300e2870fd440b6c ... cible trouvee : vmhba4:C0:T1:L32 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff7586 ... cible trouvee : vmhba4:C0:T1:L44 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e708 ... cible trouvee : vmhba4:C0:T1:L13 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e709 ... cible trouvee : vmhba4:C0:T1:L22 -> verif -> OK
Traitement du device naa.6000144000000010300c3356f0ff75cf ... cible trouvee : vmhba4:C0:T1:L45 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6e1 ... cible trouvee : vmhba4:C0:T1:L9 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5ead3 ... cible trouvee : vmhba4:C0:T1:L1 -> verif -> OK
Traitement du device naa.600508b1001ca79acd464e3bbe94a9b4 ... aucune cible trouvee
Traitement du device naa.6000144000000010300e2870fd440b72 ... cible trouvee : vmhba4:C0:T1:L40 -> verif -> OK
Traitement du device naa.6000144000000010200c338525b5e6ad ... cible trouvee : vmhba4:C0:T1:L3 -> verif -> OK

A votre disposition pour des détails ou précisions au sujet de ces outils, comme toujours !