Août 29 2008

Centralisation des logs avec Cacti

Publié par sous Linux




J’ai cherché pendant longtemps un bon outil permettant de gérer les messages envoyés vers un serveur central de logs. Logwatch envoie des rapports par email contenant des tonnes de messages, ou alors trop axés sur certaine applications. Les logs ne sont plus passés en revue en général puis oubliés. J’ai ensuite trouvé un module Cacti qui fait exactement ce que je cherchais, rapidement et facilement.
 

Installation

Les étapes d’installation sont clairement décrites sur le forum cacti.
Je devrais mentionner que le module ne supporte que syslog-ng, et non pas syslog.
 

Configuration

J’ai filtré uniquement les messages à en ne gardant que les erreurs et les critiques. Il suffit de modifier la configuration de syslog-ng:

filter f_cacti  { level(error..emerg) and
                        not (facility(mail)
                        or facility(authpriv)
                        or facility(cron)); };

source net {
    udp();
};

destination d_mysql {
    pipe("/tmp/mysql.pipe"
    template("INSERT INTO syslog_incoming (host, facility, priority, date, time, message) VALUES ( '$HOST', '$
FACILITY', '$PRIORITY', '$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$MSG' );\n")
    template-escape(yes)
     );
};

log { source(net); filter(f_cacti); destination(d_mysql); };
log { source(s_sys); filter(f_cacti); destination(d_mysql); };

 
Il est ensuite possible de filtre les logs en utilisant des « patterns », les trier par serveur, criticité ou date, ou recevoir des alertes, comme montré sur la capture d’écran:
 
Syslog plugin for Cacti
 
Un seul regret: Il n’y a pas d’option pour marquer un log comme « En cours de traitement » ou « traité » par exemple.

 

Aucune Réponse

Juil 23 2008

Sauvegarde Mysql Ultra-rapide avec LVM

Publié par sous Mysql,Sauvegarde

C’est toujours une bonne idée de respecter les deux points suivants lors de la sauvegarde de bases de données. La backup doit être:
– consistante
– rapide
 
La consistance est réalisée facilement en mettant un read lock sur toutes les tables avant tout. Cependant, ceci n’est pas toujours mis en application, et mênera sûrement à un problème d’intégrité.
Une fois le verrou établi, la sauvegarde doit être réalisée le plus vite possible, toutes les instructions d’écritures étant mises en attente dans la queue par le lock.


Mysql et les Snapshots LVM

Voici les principales méthodes pour réaliser une sauvegarde:

  • mysqldump, fourni avec le package Mysql, est assez rapide pour les bases de petites tailles et c’est à peu près tout! On peut l’employer aussi sur des serveurs de réplication, ou si vous pouvez vous permettre de suspendre les opérations d’écritures pendant un temps assez long
  • Un simple tar sur le répertoire de données, est plus rapide mais peut rester lent, surtout si vous effectuer une backup sur le réseau
  • Un simple tar, couplé à un volume manager supportant les snapshots, comme Veritas ou ZFS. La solution de sauvegarde Mysql qui vient à l’esprit est Linux Volume Manager (LVM), maintenant fourni en standard avec la plupart des distributions Linux. Cette option verrouille les tables quelques secondes seulement si la backup est effectuée sur un snapshot!

D’autres méthodes existent bien évidemment mais ne seront pas abordées ici.


Avant de Lancer la Sauvegarde

Tout ce dont vous avez besoin est d’avoir le répertoire de données Mysql hébergé sur une partition LVM. Ainsi que 10% d’espace libre sur son volume group pour créer le snapshot. Les paramètres sont similaires au client Mysql en ligne de commandes, c’est-à-dire les mêmes options à spécifier pour le user et le mot de passe pour une utilisation facile.

Le script se connecte au serveur Mysql local, met un lock en lecture. Il crée ensuite un snapshot de la partition LVM, et libère le verrou. Le répertoire de données est alors sauvegardé avec tar et copié vers le répertoire de destination de votre choix, avant que le snapshot ne soit détruit.
Il est préférable de l’exécuter sous le compte root. Si ce n’est pas possible (ou non désiré), vous pouvez utiliser sudo pour les commandes mount et lv. Assurez-vous que les fichiers Mysql soient accessibles en lecture.
Ce script vous permettra de faire une sauvegarde de vos bases Mysql en un clin d’oeil grâce aux snapshots LVM.


Script de Sauvegarde Mysql

#!/bin/bash

user=$LOGNAME
password=
datadir=
tmpmountpoint="/mnt"
dstdir="/tmp"

usage () {
  echo "Usage: $0 [OPTION]"
  echo "-d, --dest=name       Destination directory. Default is /tmp"
  echo "-h, --help            Display this help and exit."
  echo "-p, --password[=name] Password to use when connecting to server. If password is"
  echo "                      not given it's asked from the tty."
  echo "-t                    Temporary mount point for the snapshot. Default is /mnt."
  echo "-u, --user=name       User for login if not current user"
  exit 1
}

until [ -z "$1" ]; do
  case "$1" in
    -u)
      [ -z "$2" ] && usage
      user="$2"
      shift
      ;;
    --user=*)
      user=`echo $1|cut -f 2 -d '='`
      ;;
    -p*)
      password=`echo $1|sed -e s/"^-p"//g`
      ;;
    --password)
      echo -n "Enter password: "
      stty -echo
      read password
      stty echo
      ;;
    --password=*)
      password=`echo $1|cut -f 2 -d '='`
      ;;
    -d)
      [ -z "$2" ] && usage
      dstdir="$2"
      shift
      ;;
    --dest=*)
      dstdir=`echo $1|cut -f 2 -d '='`
      ;;
    -t)
      [ -z "$2" ] && usage
      tmpmountpoint="$2"
      shift
      ;;
    * )
    usage
    ;;
  esac
  shift
done

[ -z $password ] && echo "Empty password!" && usage
[ ! -d $dstdir ] && echo "$dstdir does not exist" && exit 1

# Check if temp mount point not used
[ `mount | grep "$tmpmountpoint" | wc -l` -ne 0 ] && exit 1

# Get Mysql data directory
datadir=`mysql -u $user -p$password -Ns -e "show global variables like 'datadir'"|cut -f 2|sed -e s/"\/$"//g`
[ -z "$datadir" ] && exit 1

# Get snap name and size
vg=`mount | grep $datadir | cut -d ' ' -f 1 | cut -d '/' -f 4 | cut -d '-' -f 1`
lv=`mount | grep $datadir | cut -d ' ' -f 1 | cut -d '/' -f 4 | cut -d '-' -f 2`
[ -z $lv ] && echo "Mysql data dir must be mounted on a LVM partition!" && exit 1
snap=$lv"snap"
snapsize=$(expr `df -m $datadir | tail -1 | tr -s ' ' | cut -d ' ' -f 2` / 10)M

# Backup
echo "Locking databases"
mysql -u$user -p$password << EOF
FLUSH TABLES WITH READ LOCK;
system lvcreate --snapshot -n $snap -L$snapsize /dev/$vg/$lv;
UNLOCK TABLES;
quit
EOF
echo "Databases unlocked"

echo "Backing up databases"
mount /dev/$vg/$snap $tmpmountpoint
cd $tmpmountpoint
tar cfz $dstdir/mysql.tar.gz *
cd
umount $tmpmountpoint
lvremove -f /dev/$vg/$snap
echo "Databases backed up in $dstdir"

exit 0
 

Aucune Réponse

Juil 18 2008

Retour d’Expérience sur les Pools IPs Freeradius

Publié par sous Freeradius

Si vous vous demandez s’il vaut mieux utiliser les modules rlm_ippool ou rlm_sqlippool pour transformer votre Radius en serveur « DHCP » avec les pools IP Freeradius, lisez ceci!
 

rlm_ippool

Nous allons d’abord configurer Freeradius pour fournir des adresses IPs via le module ippool. Les IPs sont stockées dans un fichier de données binaire.


radiusd.conf

ippool main_pool {
                range-start = 192.168.0.2
                range-stop = 192.168.0.254
                netmask = 255.255.255.0
                cache-size = 800
                session-db = ${raddbdir}/db.ippool
                ip-index = ${raddbdir}/db.ipindex
                override = yes
                maximum-timeout = 0

accounting {
        main_pool
}

post-auth {
        main_pool
}

 
Users
Dans le fichier users, nous avons:

DEFAULT         Pool-Name := main_pool
                Fall-Through = Yes

Au démarrage, db.ippool et db.ipindex sont créés dans le répertoire de configuration.
 
Test
lease-duration est positionné à 10 dans sqlippool.conf à des fins de tests. Les IPs devrainet donc être relâchées au bout de 10 secondes.
 

# Vérifions le comportement lors d’une connexion
echo « Connexion de l’utilisateur test… »
echo « User-Name=\ »test\ »,User-Password=\ »test\ »,NAS-IP-Address=\ »127.0.0.1\ », NAS-Port=0″ | radclient localhost:1812 auth testing123
echo « User-Name=\ »test\ »,Acct-Session-Id=\ »6000006B\ »,Acct-Status-Type=\ »Start\ », NAS-IP-Address=\ »127.0.0.1\ »,NAS-Port=0″| radclient localhost:1813 acct testing123
# Vérification du nombre d’IPs affectées – devrait être 1 rlm_ippool_tool -c etc/raddb/db.ippool etc/raddb/db.ipindex
=> 1

echo « Déconnexion de l’utilisateur test »
echo « User-Name=\ »test\ »,Acct-Session-Id=\ »6000006B\ »,Acct-Status-Type=\ »Stop\ », NAS-IP-Address=\ »127.0.0.1\ »,NAS-Port=0″| radclient localhost:1813 acct testing123
# Vérification du nombre d’IPs affectées – devrait être 0 rlm_ippool_tool -c etc/raddb/db.ippool etc/raddb/db.ipindex
=> 0 – Bien!


# Vérifions le fonctionnement du timeout
echo « Connexion de l’utilisateur test… »
echo « User-Name=\ »test\ »,User-Password=\ »test\ »,NAS-IP-Address=\ »127.0.0.1\ », NAS-Port=0″ | radclient localhost:1812 auth testing123
echo « User-Name=\ »test\ »,Acct-Session-Id=\ »6000006B\ »,Acct-Status-Type=\ »Start\ », NAS-IP-Address=\ »127.0.0.1\ »,NAS-Port=0″| radclient localhost:1813 acct testing123
rlm_ippool_tool -c etc/raddb/db.ippool etc/raddb/db.ipindex
=> 1
# Nous attendons jusqu’à ce que le timeout soit atteint
sleep 11
rlm_ippool_tool -c etc/raddb/db.ippool etc/raddb/db.ipindex
=> 1
Le timeout ne fonctionne pas!


rlm_sqlippool

 
radiusd.conf
Il faut d’abord monter Freeradius en version 1.1.7 ou plus récente et effectuer les changements suivants dans radiusd.conf:

Décommenter « $INCLUDE  ${confdir}/sqlippool.conf », supprimer main_pool et ajouter sqlippool dans les sections accounting et post-auth sections.

accounting {
        sqlippool
}

post-auth {
        sqlippool
}

 
users

DEFAULT         Pool-Name := main_pool
                Fall-Through = Yes

 
Création de pools d’IPs SQL
Ajouter la structure de la table radippool dans la base Mysql si nécessaire (incluse dans FR):

#
# Table structure for table 'radippool'
#
CREATE TABLE radippool (
  id                    int(11) unsigned NOT NULL auto_increment,
  pool_name             varchar(30) NOT NULL,
  FramedIPAddress       varchar(15) NOT NULL default '',
  NASIPAddress          varchar(15) NOT NULL default '',
  CalledStationId       VARCHAR(30) NOT NULL,
  CallingStationID      VARCHAR(30) NOT NULL,
  expiry_time           DATETIME NOT NULL default '0000-00-00 00:00:00',
  username              varchar(64) NOT NULL default '',
  pool_key              varchar(30) NOT NULL,
  PRIMARY KEY (id)
);

Et ajouter le fichier sqlippool.conf (fourni dans Freeradius)

Ajouter le pool d’IPs dans la base

mysql> INSERT INTO radippool (pool_name, framedipaddress) VALUES ('main_pool', '192.168.0.1');
mysql> INSERT INTO radippool (pool_name, framedipaddress) VALUES ('main_pool', '192.168.0.2');
[...]


Résultats

Les mêmes tests fonctionnent avec le module rlm_sqlippool. Les IPs sont relâchées après 10 secondes.

rlm_ippool conserve de plus en plus d’IPs et le pool finit par se remplir. Finalement, on doit remettre le pool à zéro ainsi que les connexions des clients, d’où diminution du taux de disponibilité!
De plus, SQLippool est intéressant lorsque l’on a plusieurs serveurs Radius servant les mêmes clients. Les pools d’IPs sont gérés au niveau de la base de données, ce qui est très appréciable dans ce cas précis.

 

Aucune Réponse

Avr 19 2008

Trucs et astuces Xen

Publié par sous Linux,Virtualisation

Désactiver les fichiers images




Xen crée habituellement des images de ses domaines dans /var/lib/xen/save pour accélérer entre autres, leur redémarrage, ce qui peut causer un /var full sur le dom0. Pour désactiver cette fonction, éditer /etc/sysconfig/xendomains ou /etc/default/xendomains et remplacer

"XENDOMAINS_SAVE=/var/lib/xen/save"

par

"XENDOMAINS_SAVE="

Ceci envoie un signal shutdown à toutes les machines virtuelles avant que dom0 ne reboote. Un timeout de 300 secondes par défaut est défini avant d’interrompre l’OS où il aurait planté pendant la phase d’arrêt.
 

Routes statiques

Le fichier /etc/sysconfig/static-routes est toujours supporté mais les routes sont suppromées après que le démon ait été lancé. Depuis Redhat Enterprise Linux 3, il est recommandé d’utiliser /etc/sysconfig/network-scripts/route-ethX. Le fichier doit contenir des informations similaires à ceci par exemple:

GATEWAY0=10.25.207.163
NETMASK0=255.255.252.0
ADDRESS0=10.22.40.0

GATEWAY1=10.25.207.163
NETMASK1=255.255.252.0
ADDRESS1=10.22.208.0

 

Accès console virtuelle

2 méthodes sont possibles pour accéder à la console du domU:

  • « xm console xenhost » Si la machine virtuelle est arrétée, « xm create -c xenhost » la boote et lance sa console. Néanmoins, les messages de l’espace utilisateur ne sont pas affichés – comme le démarrage des services.
  • La 2me option est de lancer vncviewer qui émule une console couleur.
    Chaque hôte virtuel Xen a son propre port VNC sur la machine physique. Ils sont de la forme 590X. On peut trouver les ports avec netstat par exemple.
    Ouvrir un gestionnaire X11 sur son poste puis sur la machine physique:

    export DISPLAY=10.22.41.229:0.0
    vncviewer localhost:590X
    

 

Clavier sous VNC

Avant Redhat Enterprise 5.1, le clavier est toujours en qwerty dans un mode minimaliste. En effet, seuls les caractères alphabétiques sont accessibles. Il faut mettre le dom0 à jour (au moins RHEL5.1) pour accéder à tous les caractères et spécifier la map voulue.
Ajouter le mot-clé « keymap » au fichier de configuration Xen. Exemple:

vfb = [ "type=vnc,keymap=fr" ]

 

Console série

Pour accéder à la console d’une machine avec noyau Xen par le port série, Grub doit ˆtre reconfiguré de cette mainère:

title vmlinuz-2.6.18-53.el5xen
       root (hd0,0)
       kernel /xen.gz-2.6.18-53.el5 com2=115200,8n1 pnpacpi=off console=com2L
       module /vmlinuz-2.6.18-53.el5xen ro root=/dev/sys1liege/rootfs console=xvc xencons=xvc
       module /initrd-2.6.18-53.el5xen.img

L’entrée suivante doit aussi être ajoutée dans /etc/inittab

7:2345:respawn:/sbin/agetty -L 115200 ttyS1 vt102 ou
co:2345:respawn:/sbin/agetty xvc0 115200 vt100-nav

Ajouter « xvc » dans /etc/securetty peut aussi être nécessaire.

 

NTP

Le service NTP n’a pas besoin d’être lancé sur les machines virtuelles. Le temps est synchronisé avec la machine hôte.

 

Aucune Réponse

Fév 25 2008

Eviter le Reboot après Modifications Fdisk

Publié par sous Linux

Après avoir modifier la table des partitions, fdisk retourne souvent des messages d’erreur « Périphérique ou ressource occupé »:

AVERTISSEMENT: la re-lecture de la table de partitions a échoué
avec l'erreur 16: Périphérique ou ressource occupé.   
Le kernel va continuer d'utiliser l'ancienne table.   
La nouvelle table sera utilisé lors du prochain réamorçage.   
Synchronisation des disques.
AVERTISSEMENT: la re-lecture de la table de partitions a échoué: Périphérique ou ressource occupé.

 
Partprobe fourni avec le paquetage « parted » permet de contourner ce problème, évitant ainsi un reboot inutile. De la description du man:
« Partprobe est un programme qui informe le noyau de l’OS des changements de la table des partitions, en forçant sa relecture. »
 

Périphérique ou ressource occupé fdisk


Périphérique occupé et Fdisk

Ajoutons une nouvelle partition sur le serveur Linux avec fdisk. /dev/cciss/c0d0 pourrait être /dev/sda ou tout autre.
 

[root@linux ~]$ fdisk /dev/cciss/c0d0
The number of cylinders for this disk is set to 8854.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/cciss/c0d0: 72.8 GB, 72833679360 bytes
255 heads, 63 sectors/track, 8854 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

           Device Boot      Start         End      Blocks   Id  System
/dev/cciss/c0d0p1   *           1          16      128488+  83  Linux
/dev/cciss/c0d0p2              17        1060     8385930   8e  Linux LVM
/dev/cciss/c0d0p3            1061        2104     8385930   8e  Linux LVM
/dev/cciss/c0d0p4            2105        8854    54219375    5  Extended
/dev/cciss/c0d0p5            2105        5144    24418768+  8e  Linux LVM

Command (m for help): n
First cylinder (5145-8854, default 5145):
Using default value 5145
Last cylinder or +size or +sizeM or +sizeK (5145-8854, default 8854): +1000M

Command (m for help):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

 
La nouvelle partition reste invisible du système. fdisk -l montrerait la même chose.
Je crée des partitions LVM mais le message serait similaire avec ext3 ou ext4.

[root@linux ~]$ ls /dev/cciss/
c0d0  c0d0p1  c0d0p2  c0d0p3  c0d0p4  c0d0p5

 
L’exécution de partprobe relit la table des partitions et rend la nouvelle accessible:

[root@linux ~]$ partprobe
[root@linux ~]$ ls /dev/cciss/
c0d0  c0d0p1  c0d0p2  c0d0p3  c0d0p4  c0d0p5  c0d0p6

 
Il est maintenant possible de formater et de monter la partition sans rebooter le serveur.

 

Aucune Réponse

« Précédent - Suivant »