Akim Sissaoui

Akim aussi, il blogue. Il blogue, il blague et partage ses découvertes

Changement de stratégie multipath dans ESXi en une seule ligne

La stratégie de basculement des chemins dans ESXi est par défaut « Fixed ». Il est souvent recommandé de changer cette stratégie dépendamment du matériel de stockage que l’on a à l’autre bout. Lorsqu’on a plusieurs serveurs ESXi et plusieurs volumes, c’est vite fastidieux à faire, hôte par hôte, volume par volume.

Voici une commande qui vous aidera à faire ça rapidement en une ligne. Dans cet exemple, nous allons chercher la liste des volumes. La commande « esxcli storage nmp device list » retourne la liste détaillée des volumes. « grep naa » permet d’élimier le superflu. TOutefois, dans mon cas, il restait une ligne d’information contenant « IBM ». J’ai donc refait un grep pour éliminer ces lignes (grep -vw « IBM »). Le résultat final est donc ma liste de volume sans autre information.

Toujours dans mon cas, je suis en boot from SAN. Donc tous mes volumes peuvent utiliser RR sans distinction. Si dans votre cas, vous avez plusieurs type de stockage, il devient utile d’adapter le script en fonction de vos besoins.

for volume in `esxcli storage nmp device list | grep naa | grep -vw "IBM"`; do esxcli storage nmp device set --device $volume --psp VMW_PSP_RR;done

IBM Feature on Demand sur Emulex CNA (PureFlex x240)

Aujourd’hui, j’ai eu à activer VFA (Virtual Fabric Application) sur des cartes Emulex CN (Converged Network) OEM IBM. Ces cartes sont dans des systèmes x240 dans un chassis PureFlex, et ESXi 5.1 y est installé.

Pour activer les FoD (Feature on Demand) il faut fournir

  • le numéro de série du serveur
  • Le numéro de série de l’ASIC Emulex (ASIC S/N) … (WHAAAAAT ????? )
  • Le numéro d’autorisation (authorization code) reçu avec la commande d’activation FoD

 

Le premier élément est facile à trouver: A travers CMM, IMM, le bios, ou sur l’étiquette du serveur. Le dernier élément se trouve évidemment sur une feuille que vous aurez reçu avec votre commande. Là où j’ai galéré, c’est pour trouver l’ASIC S/N. On nous dit qu’on peut le trouver dans UEFI, mais je ne l’y ai pas trouvé. Voici comment j’ai procédé:

Sur vCenter, j’ai installé OneCommand Manager plug-in for vCenter. Attention: A l’installation, la dernière version propose les ports 80,443, qui sont, bien entendu, utilisés par vCenter. j’ai choisis 4080 et 4443. Sur les hosts ESXi, j’ai installé le dernier CIM Provider d’Emulex téléchargé sur leur site (mettre le vib sur le host en ssh, et l’installer grâce à esxcli par exemple, ou utilisez la méthode de votre choix). J’ai installé OneCommand manager sur mon poste de gestion en sélectionnant « Management Host ». Depuis mon poste, j’ai utilisé la commande suivante pour trouver les MAC de ma CNA

C:\Program Files\Emulex\Util\OCManager\hbacmd h=ip_esxi m=CIM u=root p=mot-de-passe_root_esxi listhbas

On obtient la liste des CNA (il y en a une double port) avec les adresses MAC. Ensuite

C:\Program Files\Emulex\Util\OCManager\hbacmd h=ip_esxi m=CIM u=root p=mot-de-passe_root_esxi getfodinfo adresse_MAC

Et on obtient les infos pour les FoD dont le fameux ASIC S/N qui s’appelle ici en fait FoD Identifier. Fallait le savoir.

Ne reste plus qu’à générer la licence sur le site d’IBM, et la mettre sur le serveur à l’aide de OneCommand Manager.

Ajouter/supprimer des disques dans linux sans rebooter

Dans le monde virtuel que nous vivons, il arrive souvent que nous soyons amené à ajouter ou supprimer un disque à la volée sur un serveur virtuel. Aussi, il n’est jamais aisé de savoir comment procéder sans avoir à redémarrer ladite machine virtuelle.

Heureusement, Linux contient des fichiers qui sont là pour ça. Hourra.

Vous venez donc d’ajouter un disque virtuel à votre machine Linux et vous aimeriez bien qu’il soit reconnu sans avoir à redémarrer. Pour ce faire, identifiez le contrôleur SCSI. En effet, en ajoutant le disque, vous pouvez choisir l’ID du disque. Par exemple 0:3 ou 1:0 etc… Pour paralléliser le trafic et donc améliorer potentiellement les performances, on peut choisir de mettre un disque sur un second contrôleur (1:x au lieu de 0:x). Ensuite, exécutez la commande suivante ou hostx correspond à l’ID de votre contrôleur SCSI (host0 pour 0:x ou host1 pour 1:x):

echo "- - -" > /sys/class/scsi_host/host1/scan

Le tour est joué. dmesg vous indiquera les détails du nouveau disque, fdisk -l vous présentera la table des partitions (vide) de ce disque.

L’inverse est possible aussi. On peut supprimer un disque à chaud. Bien sûr, il faut commencer par démonter le système de fichier qui serait dessus avec umount, et si c’est un volume LVM, il faut déplacer les blocks sur un autre PV, le retirer du VG, puis supprimer le PV, sinon vous aurez des erreurs LVM.

Si dans le processus vous avez supprimez un système de fichier, n’oubliez pas de le retirer de /etc/fstab, sans quoi votre VM se mettra en erreur au redémarrage.

Une fois que vous êtes sûr que votre disque virtuel a été libéré de toute contrainte, vous pouvez le supprimer de la configuration de la VM.

Toutefois, l’inode se référant au disque n’est pas supprimer par les vmware tools. Aussi, vous pouvez exécuter la commande suivante afin de le supprimer (dans l’exemple, pour retirer /dev/sdd):

echo 1 > /sys/block/sdd/device/delete

Le tour est joué.

Attention, bien entendu de supprimer le bon disque autant dans vmware que avec la commande ci-dessus, au risque d’avoir de drôles de surprises sur un système en production…

Déplacer le dossier de sauvegarde (backup repository) dans Plesk pour Windows

Par défaut, Plesk crée un dossier Backup sur le disque C: dans C:\Program Files (x86)\Parallels\Plesk\Backup (sur un windows x64). Pas très malin si on a fait un second disque pour les données. Ca remplit très vite le C: et après, bonjour la galère.

On trouve sur internet des malins qui proposent de changer le chemin des backups dans la base de registre. Moije dis STOP !!!! Une mise à jour de plesk et HOP, on prend quand meme le risque que le chemin soit remis sur C, sans qu’on s’en aperçoive.

je propose comme alternative le symbolic link. Si si, c’est aussi possible sur Windows.

Voici comment procéder. Cet exemple est pour un windows x64. Si vous êtes encore à l’âge des cavernes avec du x32, vous serez assez malin pour adapter.

  1. Créez un nouveau dossier, par exemple D:\Backup
  2. Editez les permissions et donnez l’accès complet à psaadm
  3. Déplacez les fichiers du dossier existant C:\…..\Backup vers le nouveau dossier D:\Backup
  4. Supprimez le dossier existant C:\…..\Backup
  5. Créez un lien symbolique comme suit: Ouvrez une fenêtre de commande et tapez
mklink /D "C:\Program Files (x86)\Parallels\Plesk\Backup" D:\Backup

Ceci va créer un lien symbolique de C:\……Backup vers D:\Backup

Editez ensuite les permissions du lien C:\Program Files (x86)\Parallels\Plesk\Backup et donnez accès complet à psaadm

Et voilà…

DNS secondaire pour plusieurs serveurs plesk

Je m’attaque à la création d’un serveur DNS secondaire pour mes serveurs plesk. En effet, je vais en avoir plusieurs. Je me base sur l’article cité ci-dessous en source. Mais je vais l’adapter à ma sauce. En effet, je ne veux pas avoir à maintenir un site web pour faire transiter les fichiers de zones. Je vais donc me servir de ssh pour transférer les fichiers.

Sur les serveurs plesk

Les opérations suivantes peuvent être faites sur tous les serveurs plesk.

Avant de commencer, faites une copie de sécurité du fichier /etc/named.conf. On est jamais trop prudent.

Création d’un utilisateur pour les opérations automatiques

D’abord, pour tout ce qui est automatique, je crée un nouvel utilisateur. Par exemple « robotuser », et, pour rester cohérent avec mon article sur la sécurisation d’un serveur, je l’ajoute au groupe sshusers. J’utilise sudo, toujours en accord avec l’article en question.

sudo usermod -G sshusers robotuser

Je lui génère un mot de passe très complexe. Dans mon cas, un générateur me donne un mot de passe de 30 caractères aléatoires, spéciaux, étendus, etc….

sudo passwd robotuser

Je crée ensuite une clé ssh pour cet utilisateur. Comme je ne le fais pas logué depuis l’utilisateur en question, il faudra penser à changer le propriétaire, et les droits

sudo mkdir /home/robotuser/.ssh
sudo ssh-keygen -f /home/robotuser/.ssh/id_rsa -N ""
sudo chown robotuser:robotuser /home/robotuser -R
sudo chmod 700 /home/robotuser/.ssh
sudo chmod 600 /home/robotuser/.ssh/id_rsa
sudo chmod 600 /home/robotuser/.ssh/id_rsa.pub

Nous avons donc maintenant un utilisateur robotuser qui fait partie du groupe sshusers et qui a une clé privée et une clé publique.

Scripts de création des fichiers de zones

Nous pouvons maintenant faire un script que l’utilisateur en question pourra exécuter pour récupérer la liste des zones sur le serveur plesk. Pour l’exemple, j’utiliserai 192.168.1.1 comme IP de mon serveur plesk, et 192.168.1.2 comme IP de mon serveur DNS secondaire.

Commençons par créer un dossier scripts dans /home/robotuser

sudo mkdir /home/robotuser/scripts

Dans ce dossier, nous allons créer le script qui va récupérer la liste des domaines de named.conf.

Nous y mettons les commandes suivantes. Ce script va lire le fichier named.conf et en tirer tous les noms de zones existants, et créer un fichier contenant cette liste. On va ensuite modifier le propriétaire car, comme on va le voir ci-dessous, on va l’exécuter avec sudo, et il sera donc créé en tant que root.

#!/bin/sh
#
for domain in `/bin/grep ^zone /etc/named.conf | grep -v '"."' | grep -vi in-addr | /bin/awk '{print $2}'| /bin/awk -F\" '{print $2}'`
 
do
/usr/bin/printf "zone \"${domain}\" {\n\ttype slave;\n\tfile \"slaves/${domain}.db\";\n\tmasters { 192.168.1.1; };\n};\n"
done > /robotuser/scripts/monserveur.zones
 
chown robotuser:robotuser /home/robotuser/scripts/monserveur.zones

On donne les droits d’exécution à robotuser pour ce fichier après avoir changer le propriétaire:

sudo chown robotuser:robotuser /home/robotuser/scripts/generatezones.sh
sudo chmod +x /home/robotuser/scripts/generatezones.sh

Comme named.conf n’est pas accessible, nous allons autoriser robotuser à utiliser sudo pour exécuter le script. Pour ce faire, on édite sudoers et on ajoute la commande nécessaire.

On ajoute donc à la fin de sudoers:

robotuser monserveur = NOPASSWD: /home/robotuser/scripts/generatezones.sh

On commente également la ligne Defaults requireTTY sinon cron ne pourra pas utiliser sudo.

On peut maintenant tester le script. On se logue avec l’utilsateur robotuser, et on exécute le script:

su robotuser
sudo /home/robotuser/scripts/generatezones.sh

Pour vérifier si ça a marché, d’abord, on ne doit avoir aucun message d’erreur sur la console, bien sûr. Ensuite, on peut lister le dossier /home/robotuser/scripts, et on doit avoir ceci:

[monserveur scripts]$ ls -lshtr 
4.0K -rwx------. 1 robotuser robotuser 410 Nov 12 15:58 generatezones.sh
4.0K -rw-r--r--. 1 robotuser robotuser 282 Nov 12 15:58 monserveur.zones

Ensuite, on peut vérifier le contenu du fichier monserveur.zones. Ca doit ressembler à ça.

[monserveur scripts]$ cat monserveur.zones
zone "domain1.com" {
        type slave;
        file "/etc/named/slaves/domain3.com.db";
        masters { 192.168.1.1; };
};
zone "domain3.com" {
        type slave;
        file "/etc/named/slaves/domain3.com.db";
        masters { 192.168.1.1; };
};
zone "domain3.com" {
        type slave;
        file "/etc/named/slaves/domain3.com.db";
        masters { 192.168.1.1; };
};
zone "domain3.com" {
        type slave;
        file "/etc/named/slaves/domain3.com.db";
        masters { 192.168.1.1; };
};

Envoi du fichier de zone vers le serveur secondaire

Pour continuer on ressort du contexte de l’utilisateur robotuser, pour revenir à notre utilisateur de base et on recommence a utiliser sudo comme un grand.

On a maintenant un fichier de zone prêt à être transféré vers le serveur secondaire. On va ajouter à notre script une commande scp pour l’envoyer sur le serveur secondaire. On se prend pas la tête, on le met dans le dossier /home/robotuser. Il suffit donc d’ajouter la bonne commande dans le script generatezones.sh. On va utiliser su. Car comme on a utilisé sudo pour lancer le script, il est exécuté en tant que root, mais on veut exécuter le scp en tant que robotuser.

Donc on édite à nouveau generatezones.sh

sudo nano /home/robotuser/scripts/generatezones.sh

et on ajoute:

su robotuser -C 'scp /home/robotuser/scripts/monserveur.zones 192.168.1.2:'

Avant de tester le script, il faut mettre la clé publique dans le fichier authorized_keys de l’utilisateur robotuser sur le serveur secondaire. Il faut donc créer l’utilisateur et tout le tintoin. Je la refais pas. Les instructions sont plus hautes. On prend les mêmes et on recommence. Création de l’utilisateur, création du dossier .ssh, et là on crée un fichier authorized_keys dans lequel on copie la clé public, sans oublié à la fin de mettre toutes les permissions au bon niveau, sans oublier bien sûr de changer le propriétaire. Entre mon article sur la sécurisation et celui-là, vous devriez vous en sortir.

Une fois donc l’utilisateur créé et la clé mise en place, on peut tester les script. Pour ce faire, on tape la commande suivante, et on aura besoin du mot de passe robotuser. C’est normalement les deux uniques fois (ci-dessus et ici) qu’on utilisera ce mot de passe:

su robotuser
sudo /home/robotuser/scripts/generatezones.sh

On a vérifié que ça marche ? reste plus qu’à mettre ça dans crontab pour l’utilisateur robotuser:

sudo crontab -u robotuser -e

On va exécuter le script tous les quart d’heure précis:

0,15,30,45 * * * * sudo /home/robotuser/scripts/generatezones.sh

Après 30 à 40 minutes, on peut vérifier dans /var/log/cron que notre script est bien exécuté.

Si vous avez plusieurs serveurs plesk, on fait la même chose sur chaque serveur, et ils vont tous envoyer leur fichier de zone à la meme heure. Si vraiment c’est nécessaire, on peut toujours décaler un peu les heures, des fois que vous ayez des milliers de zones. Mais on va s’arranger pour ne pas dépasser H moins 4 minutes. Parce qu’on fera la seconde partie à 05, 20, 35, et 50.

Sur le serveur de noms secondaire

On va créer un script qui va déplacer les fichiers de zones reçus dans /home/robotuser/ dans le dossier /etc/named/servers (c’est mon choix. Faites le vôtre). Ce script va devoir également changer le propriétaire pour mettre bind

A noter que j’ai chrooté bind en suivant l’article suivant: http://bachem.wordpress.com/2012/04/14/setup-dns-server-bind-chroot-centos-6-2/ Je me base donc là dessus pour le reste de cet article.

Retour donc au serveur secondeaire pour créer ce script.

On crée les dossiers /var/named/chroot/etc/named/servers et /var/named/chroot/etc/named/slaves pour accueillir les fichiers et change le owner à bind:

sudo mkdir /var/named/chroot/etc/named/servers
sudo mkdir /var/named/chroot/etc/named/slaves
sudo chown named:named /var/named/chroot/etc/named/servers
sudo chown named:named /var/named/chroot/etc/named/slaves

On crée le dossier /home/robotuser/scripts pour rester cohérent et on y crée directement le script, comme ça on s’évite une double commande chown:

sudo mkdir /home/robotuser/scripts
sudo touch /home/robotuser/scripts/fetchzones.sh
sudo chmod 700 /home/robotuser/scripts/fetchzones.sh
sudo chown robotuser:robotuser /home/robotuser/scripts -R

On édite ensuite le script:

sudo nano /home/robotuser/scripts/fetchzones.sh

et on met en place les commandes pour déplacer les fichiers dans l’environnement chrooté de bind. Ce script va également créer un fichier foreign.zones dans /var/named/chroot/etc/named/ à inclure dans le fichiers /var/named/chroot/etc/named.conf. Ceci va permettre d’ajouter des nouveaux serveurs masters sans avoir à ajouter un include manuellement dans named.conf pour chaque nouveau serveur.

#!/bin/sh
 
mv /home/robotuser/*.zones /var/named/chroot/etc/named/servers/
chown named:named /var/named/chroot/etc/named/servers -R
 
rm /var/named/chroot/etc/named/foreign.zones
touch /var/named/chroot/etc/named/foreign.zones
 
cd /var/named/chroot/etc/named/servers
for file in `ls`
    do echo "include \"/etc/named/servers/$file\";" >> /var/named/chroot/etc/named/foreign.zones
done
 
chown named:named /var/named/chroot/etc/named/foreign.zones
 
service named reload

Reste a mettre un include dans le fichier /var/named/chroot/etc/named.conf

include="/etc/named/foreign.zones";

On va de nouveau utiliser sudo pour exécuter le script. On ajoute donc à sudoers la ligne adéquate:

robotuser monserveur = NOPASSWD: /home/robotuser/scripts/fetchzones.sh

et on commente également la ligne Defaults requireTTY sinon cron ne pourra pas utiliser sudo.

On insère le job dans crontab

sudo crontab -u robotuser -e
5,20,35,50 * * * * sudo /home/robotuser/scripts/fetchzones.sh

Le tour est joué. Reste plus qu’à tester comme avant… Et espérer que ça marche… Je passe sur les tests nslookup etc… Je ferai ça quand ça aura commencer à copier les zones. Pour l’instant, ça démarre.

Source: http://forum.parallels.com/pda/index.php/t-258488.html

Erreur VM Communication Interface au démarrage des vmware tools dans CentOS 6.3

Lors du démarrage des VMWare Tools sur mes machines CentOS 6.3, j’ai systématiquement l’erreur suivante:

Starting VMware Tools services in the virtual machine:
   Switching to guest configuration:                       [  OK  ]
   VM communication interface:                             [FAILED]
   VM communication interface socket family:               [FAILED]
   File system sync driver:                                [  OK  ]
   Guest operating system daemon:                          [  OK  ]

Une simple réinstallation des vmware-tools résoud le problème.

Démarrage automatique des vmware tools sur CentOS 6 (start/stop/restart)

Lorsqu’on installe les vmware tools sur une centOS le script vmware-tools n’est plus créé automatiquement dans /etc/init.d ni ajouté à chkconfig. A la place, les VMware Tools 5 s’appuient sur Upstart. Malheureusement, pour une raison que j’ignore et que je n’ai pas réussi à identifier, Upstart ne démarre pas les scripts comme il est supposé le faire. Résultat, les vmware tools ne démarrent pas.

J’ai donc décidé de palier au problème en mettant les vmware-tools dans /etc/init.d

Pour ce faire, il suffit de copier le fichier services.sh des vmware tools vers /etc/init.d/vmware-tools

sudo cp /etc/vmware-tools/services.sh /etc/init.d/vmware-tools

Ensuite il faut ajouter les paramètres chkconfig dans le script, et ajouter le script aux paramètres de démarrage:

Ajoutez au début du fichier /etc/init.d/vmware-tools

# chkconfig: 2345 15 85

et ensuite exécutez:

sudo chkconfig --add vmware-tools

Il ne reste plus qu’à démarrer les tools:

sudo service start vmware-tools

Booter n’importe quelle ISO depuis un disque dur USB: Zalman ZM-VE200 (ZM-VE300)

UPDATE 02.11.2012: Le ZM-VE200 n’est plus sur le marché. Il est remplacé par le ZM-VE300 qui est un boitier USB 3.

Voici un produit aussi indispensable que peu connu. Il s’agit du boitier Zalman ZM-VE200. C’est un boitier de disque dur 2.5″ muni d’une interface eSATA ainsi que d’une interface USB 2.0. Rien d’extraordinaire me direz-vous. Pourtant, Zalman a embarqué un micrologiciel sur son boitier qui fait des miracles. Il est muni d’un jogdial qui permet de sélectionner le mode de fonctionnement.

En eSATA, c’est un disque dur eSATA sans autre fonctionnalité.

En USB, c’est un outil exceptionel. Les modes proposés sont:

HDD-MODE: Dans ce mode, c’est un disque dur USB comme n’importe quel autre

DUAL-MODE: Ici, il émule un lecteur optique dans lequel on peut monter n’importe quel image ISO contenue dans le dossier _iso, et il présente également le disque dur USB. Nous avons donc deux lecteurs en un.

ODD-MODE: Il s’agit de l’Optical Disk Drive mode. Il émule un lecteur optique et rien d’autre.

Il suffit donc de mettre toutes les images ISO de son choix dans le dossier _iso, puis de sélectionner le mode avec le jogdial, et ensuite de sélectionner l’image ISO que l’on souhaite grace à l’écran LCD embarqué sur le boitier.

Je l’utilise avec des linux live, ou pour installer Windows, mais également avec Clonezilla avec lequel il fait un parfait binome. En effet, grace au Dual Mode, on peut lancer l’iso de clonezilla, et faire une image que l’on va sauvegarder sur le disque USB lui-même.

Enfin quelqu’un a fait un outil utile et intelligent. Ca fait très longtemps que je n’avais pas eu une innovation aussi utile à ma passion et à mon métier. Alors MERCI ZALMAN.

Convertir des violations selinux en règles

Petite astuce pour convertir des violations selinux en règles sans se prendre la tête.

Ceci s’applique bien sûr si au préalable vous avez vérifié votre log, et surtout compris de quoi il retourne. Il ne s’agit surtout pas de prendre le risque de changer en policy des blocages légitimes de violation.

Je suis actuellement sur une CentOS 6.3. Il faut commencer par installer le paquet policycoreutils-python. Ceci installera entre autre audit2allow.

Ensuite, exécuter un grep du log d’audit, par exemple dans mon exemple, pour fail2ban.

grep "fail2ban" /var/log/messages | audit2allow

Source: SELinux Policy for Your Parallels Plesk Panel Server