Utiliser le shell de ESXi

Transcription

Utiliser le shell de ESXi
Utiliser le shell de ESXi
Extrait du MosX.org
http://www.mosx.org
Utiliser le shell de ESXi
- Dossiers -
Date de mise en ligne : mardi 17 mars 2015
Description :
Jai parlé dans un article précédent de linstallation de VMware ESXi sur nos Mac. Larticle daujourdhui nest pas ciblé uniquement pour les Macs, mais dune
manière générale sur quelques notions à savoir pour la gestion des hôtes ESXi. Ce que je vais présenter ici est utile essentiellement pour les utilisateurs de la
version gratuite de ESXi qui nont pas accès à toutes les fonctionnalités de vSphere, mais pas que&
MosX.org
Copyright © MosX.org
Page 1/11
Utiliser le shell de ESXi
Introduction
Le pré-requis à ce dont je vais parler dans cet article est bien entendu d'avoir activé non seulement le shell , mais
aussi l'accès SSH sur votre serveur ESXi comme indiqué dans l'article sur l'installation de ESXi.
Il y a une chose à savoir à propos de l'hôte ESXi. Le système est démarré sur un disque virtuel, un petit volume créé
en mémoire à chaque démarrage. Cela améliore grandement les performances, mais cela complique également
beaucoup la gestion pour ceux qui ont l'habitude de mettre les mains dans le cambouis des fichiers système de leur
OS.
Je ne vais pas réécrire l'excellent article de virtuallyGhetto sur le sujet (je pourrais le traduire si la demande est faite
et si l'auteur est d'accord, mais je ne suis pas sûr de l'intérêt). Mais pour résumer :
•
•
•
tous les changements de configurations fait à partir des outils VMware (vSphere Client, vCenter, vSphere
toolkits, etc.) sont persistants.
lors de modifications manuelles des fichiers de configuration, la persistance des modifications dépend de ce qui
a été modifié
les fichiers ajoutés au disque de démarrage de ESXi sont par défaut non persistants.
En fait, ESXi fait une sauvegarde régulière de certains fichiers de configuration, vous pouvez obtenir la liste par la
commande suivante :
find /etc -follow -type f -name '.#*' 2>/dev/null | sed -e 's,.#\(.*\),\1,g'
Tous ces fichiers sont sauvegardés régulièrement (toutes les heures et à chaque arrêt du système) par le script
/sbin/auto-backup.sh
. Un système interne sauvegarde également l'état du système de fichier toutes les 10mn en cas d'arrêt inopiné du
système.
Faire des modifications persistantes
Si le fichier que vous modifiez est dans la liste des fichiers sauvegardés automatiquement, la seule chose à faire
pour être tranquille est de lancer le script
/sbin/auto-backup.sh
après vos modifications.
Copyright © MosX.org
Page 2/11
Utiliser le shell de ESXi
Si en revanche vous modifiez, par exemple, la crontab, ou que vous ajoutez des fichiers, il vous faudra alors ruser
pour que les changements restent après un démarrage.
En fait, ce n'est pas très compliqué, l'un des fichiers sauvegardés automatiquement est un script lancé à chaque
démarrage :
/etc/rc.local.d/local.sh
Il suffit donc de modifier ce script pour faire ce que l'on veut qu'il fasse. :)
Modification de la crontab
Pour modifier la crontab, tout se passe également dans le fichier local.sh, mais avec un point important à savoir. Ce
script est lancé après le démarrage de cron, il faut donc relancer cron après avoir modifié la crontab.
Voici donc un exemple d'ajout au fichier
local.sh
pour ajouter à la crontab le lancement d'un script testant la présence de mes différents datastore toutes les heures :
/bin/kill $(cat /var/run/crond.pid)
echo "0
*
*
*
*
/mosx/testDisks.sh" >>/var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond
Je commence par tuer le processus cron, puis j'ajoute ma ligne dans la crontab, et enfin, je relance le daemon crond.
Attention ! Sur les hôtes ESXi, l'heure est en UTC/GMT ! vSphere Client adapte l'heure affichée selon les réglages
de la machines cliente. Il n'est pas possible de changer le fuseau horaire et il est donc plus simple de laisser l'hôte
en UTC et de faire les réglages de la crontab en fonction. Il faut juste se rappeler que l'heure se décale 2 fois par
an…
Changement de l'heure
Si vous souhaitez tout de même changer l'heure de votre système pour simplifier la surveillance des logs ou pour
quelque-soit-la-raison, il est alors préférable de changer à la fois l'heure système et l'heure matérielle . Cette
dernière est utilisée par les VMs comme heure par défaut, dans les BIOS par exemple.
Copyright © MosX.org
Page 3/11
Utiliser le shell de ESXi
Premier point, l'utilisation de la commande
date
comme sur les unix/linux ne marche pas pour définir la date et l'heure. Il faut passer par une commande spécifique
de ESXi :
esxcli
. Nous verrons dans un autre article quelques autres exemples d'utilisation de cette commande.
Pour définir la date au 16 mars 2015 10:45:35, vous pourrez écrire la commande suivante :
esxcli system time set -d 16 -H 10 -m 45 -M 03 -y 2015 -s 35
esxcli hardware clock set -d 16 -H 10 -m 45 -M 03 -y 2015 -s 35
Vous pouvez ne mettre qu'un des arguments si vous ne pouvez changer que l'heure, par exemple.
Gestion des scripts et des sauvegardes
J'ai fait une série de petits scripts plus ou moins utiles. Je n'aime personnellement pas lancer des scripts systèmes
depuis un datastore, ne serait-ce que parce que si je change de machine, le datastore change et donc, le chemin
vers le script change.
J'ai donc choisi de mettre l'ensemble de mes scripts dans un dossier nommé mosx à la racine du volume de
démarrage. Mais, comme indiqué plus haut, ce dossier disparaitra au prochain redémarrage de l'hôte ESXi, ce qui
est légèrement gênant… :)
Persistence des scripts à chaque démarrage
Je pourrais réécrire les scripts via le script local.sh à chaque démarrage, mais ce n'est pas très propre et ça rendrait
la maintenance, des scripts et du fichier local.sh un peu compliquée. J'ai donc décidé de faire une copie de ce
dossier régulièrement sur un des datastore. Ensuite, dans local.sh, je recopie simplement ce dossier.
J'ai donc simplement ajouté à
/etc/rc.local.d/local.sh
la ligne suivante :
cp -a /vmfs/volumes/SSDMini/mosx /mosx
Copyright © MosX.org
Page 4/11
Utiliser le shell de ESXi
Et… voilà. Rien de plus compliqué :)
Sauvegarde des scripts et paramètres
Il faut donc sauvegarder ce dossier sur le datastore pour pouvoir le restaurer à chaque démarrage. Mais avant de
sauvegarder le dossier, il peut être intéressant de sauvegarder quelques autres choses avec.
La config ESXi qui comprend les paramètres spécifiques de l'hôte ESXi (les datastores, l'adresse IP, etc.) peuvent
être utiles à conserver. Cela permettrait également un retour rapide à la normale en cas de réinstallation de l'hôte.
Pour cela, il existe une commande toute prête qui génère une archive de la configuration complète de l'hôte :
/bin/vim-cmd hostsvc/firmware/backup_config
.
Il est préférable de s'assurer que la config en mémoire est bien synchronisée avec les fichiers de préférence avec la
commande :
/bin/vim-cmd hostsvc/firmware/sync_config
Il faut ensuite déplacer l'archive dans le dossier /mosx pour qu'elle soit sauvegardée avec le reste.
Il est également utile de sauvegarder le fichier
/etc/rc.local.d/local.sh
qui est très important. Ainsi, en cas de réinstallation, nous n'aurons qu'à le recopier.
Enfin, copier le dossier à l'emplacement de sauvegarde.
Voici donc le script
backupConfig.sh
:
Copyright © MosX.org
Page 5/11
Utiliser le shell de ESXi
#!/bin/sh
#########################
# Copy of ESXi config : #
/bin/vim-cmd hostsvc/firmware/sync_config
BCKPATH=$(/bin/vim-cmd hostsvc/firmware/backup_config |grep Bundle |cut -d'/' -f5-)
CLEANPATH=$(echo $BCKPATH |cut -d'/' -f1)
cp /scratch/downloads/${BCKPATH} /mosx/configBundle.tgz
rm -rf /scratch/downloads/${CLEANPATH}
###########################
# Copy of rc.local file : #
cp -a /etc/rc.local.d/local.sh /mosx/local.sh
###############################
# Copy of /mosx dir on Disk : #
cp -a /mosx /vmfs/volumes/SSDMini
Copyright © MosX.org
Page 6/11
Utiliser le shell de ESXi
Restaurer les paramètres ESXi
Nous avons plus haut sauvegardé la config de l'hôte dans une archive configBundle.tgz au cas où nous aurions à
réinstaller l'hôte ESXi.
La restauration est un peu plus compliquée que la sauvegarde parce que dans l'archive, le système stocke
l'identifiant unique de l'hôte. Lors d'une réinstallation, cet identifiant a toutes les chances de changer, et la
restauration ne marchera pas. Ceci est pour éviter de restaurer une configuration sur un système qui n'est pas le
bon.
Dans notre cas, j'ai fait un script qui change l'UUID dans l'archive pour pouvoir la réimporter dans le système
courant, que l'UUID ait changé ou pas.
Voici le script restoreConfig.sh :
#!/bin/sh
cd /mosx
tar zxf /mosx/configBundle.tgz
RSTUUID=$(cat /mosx/Manifest.txt |grep "UUID=" |cut -d'=' -f2)
/bin/vim-cmd hostsvc/firmware/sync_config
BCKPATH=$(/bin/vim-cmd hostsvc/firmware/backup_config |grep Bundle |cut -d'/' -f5-)
CLEANPATH=$(echo $BCKPATH |cut -d'/' -f1)
cp /scratch/downloads/${BCKPATH} /tmp/configTmp.tgz
rm -rf /scratch/downloads/${CLEANPATH}
cd /tmp
tar zxf /mosx/configBundle.tgz Manifest.txt
CURUUID=$(cat /tmp/Manifest.txt |grep "UUID=" |cut -d'=' -f2)
rm /tmp/Manifest.txt
cd /mosx
cat Manifest.txt |sed "s/UUID\=\(.*\)/UUID\=${CURUUID}/" > Manif.txt
mv Manif.txt Manifest.txt
tar zcf /tmp/configBundle.tgz Manifest.txt state.tgz
/bin/vim-cmd hostsvc/firmware/restore_config /tmp/configBundle.tgz
N'oubliez pas de remplacer /mosx par le nom du dossier dans lequel vous placez vos scripts et archives.
Vérification du fichier local.sh
Copyright © MosX.org
Page 7/11
Utiliser le shell de ESXi
Voici à quoi ressemble mon fichier
/etc/rc.local.d/local.sh
. Vous noterez que par soucis de sécurité, j'ai rajouté une sauvegarde du dossier mosx sur un autre datastore :
cp -a /vmfs/volumes/SSDMini/mosx /mosx
/bin/kill $(cat /var/run/crond.pid)
echo "*/5
*
*
*
*
/mosx/backupConfig.sh" >>/var/spool/cron/crontabs/root
echo "1
0
*
*
*
cp -a /mosx /vmfs/volumes/ReadyNAS-NFSShare" >>/var/spool/cron/crontabs/root
echo "0
*
*
*
*
/mosx/testDisks.sh" >>/var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond
exit 0
Voici un rappel de ce que je rajoute à la crontab : Je lance backupConfig.sh toutes les 5mn tous les jours. Je lance la
copie de mosx sur un autre datastore à 0:01 (UTC) tous les jours. Je teste les disques toutes les heures tous les
jours.
Tester et alerter en cas de problèmes disques
Au début de mes tests, j'ai eu un soucis avec mon boitier NAS, j'ai donc créé un script qui fait un touch sur les
disques voulus. En cas d'erreur lors du touch, j'envoi un courriel d'alerte :
Copyright © MosX.org
Page 8/11
Utiliser le shell de ESXi
#!/bin/sh
DISKSTOTEST="/path/To/Test/1 /path/To/Test/2"
. /mosx/sendMail.sh
[email protected]
for theDisk in $DISKSTOTEST
do
touch ${theDisk}/touch.log 2>/dev/null
[ $? -ne 0 ] && {
mySendMail ${EMAIL} "ALERTE DISQUES ESXi" "Le disque ${theDisk} n'est pas disponible !!!\r\n\r\n\r\n"
}
done
Copyright © MosX.org
Page 9/11
Utiliser le shell de ESXi
Envoyer des courriels
Vous l'avez sans doute remarqué dans le script précédent, j'ai fait un script qui permet d'envoyer des courriels voici
comment il marche. Je ne gère que l'envoi via un serveur sans authentification. Il existe des scripts (comme
xsibackup dont nous parlerons dans un autre article) qui permettent d'utiliser SMTP AUTH, je vous invite à les
consulter si vous en avez besoin.
La première chose à faire dans ce script est de vérifier que les règles de firewall de l'hôte ESXi autorisent à sortir sur
le port désiré, cela se fait avec la commande
esxcli network firewall ruleset list
. Si ce n'est pas le cas, il faut modifier le fichier /etc/vmware/firewall/service.xml pour rajouter la règle. Enfin, il faut
vérifier que la règle est bien activée.
Enfin, la fonction mySendMail(), appelée depuis les autres scripts avec le destinataire, le sujet et le corps du
message en paramètres, liste les commandes SMTP à envoyer et les place dans un fichier temporaire. Ce fichier
temporaire est enfin lu par la commande nc qui envoie les commandes au serveur spécifié.
Voici le script sendMail.sh :
Copyright © MosX.org
Page 10/11
Utiliser le shell de ESXi
#!/bin/sh
MAILHOST=my.mailsrv.org
MAILPORT=25
[email protected]
FWRes=$( esxcli network firewall ruleset list | grep "SMTPout" )
[ "$FWRes" == "" ] && {
chmod 644 /etc/vmware/firewall/service.xml
chmod +t /etc/vmware/firewall/service.xml
FWRule="\n
SMTPout\n
\n
outbound\n
tcp\n
dst\n
"$MAILPORT"\n
\n
true\n
false\n
\n
"
ADDT=`echo $FWRule |sed 's/$newline//g'`
sed -i 's,<\/ConfigRoot>,'"$ADDT"',g' "/etc/vmware/firewall/service.xml"
chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refresh
}
esxcli network firewall ruleset set --ruleset-id=SMTPout --enabled=true
mySendMail() {
echo -ne "HELO ${MAILHOST}\r\n" > /tmp/sendMail.$$
echo -ne "MAIL FROM: <${SENDER}>\r\n" >>
echo -ne "RCPT TO: ${1}\r\n" >>
echo -ne "DATA\r\n" >>
/tmp/sendMail.$$
echo -ne "To: ${1}\r\n" >>
/tmp/sendMail.$$
echo -ne "Subject: ${2}\r\n" >>
/tmp/sendMail.$$
echo -ne "\r\n" >>
/tmp/sendMail.$$
echo -ne "${3}" >>
/tmp/sendMail.$$
echo -ne ".\r\n" >>
/tmp/sendMail.$$
/tmp/sendMail.$$
/tmp/sendMail.$$
echo -ne "QUIT\r\n" >>
/tmp/sendMail.$$
/usr/bin/nc -v -i 1 ${MAILHOST} ${MAILPORT} < /tmp/sendMail.$$ >/dev/null 2>/dev/null
}
Copyright © MosX.org
Page 11/11