Application des mises à jour du package Yum à des serveurs multiples en utilisant Fabric

Gazette Linux n°185 — avril 2011

par Ikuya Yamada ikuya@ousia.jp et Yoshiyasu Takefuji takefuji@sfc.keio.ac.jp (Copyright © 2011)

traduction par Issolah Rafik (tous droits réservés) rafikoss@hotmail.com


Introduction

Les administrateurs de serveurs multiples savent que la mise à jour des packages peut être une tâche fastidieuse. Elle demande une connexion, suivie par l'exécution d'un "yum update" ou quelque chose de similaire pour chaque serveur. Bien qu'il existe plusieurs outils permettant aux administrateurs de mettre à jour les packages automatiquement, y compris yum-updatesd et yum-cron, la mise à jour des paquets sans confirmation peut conduire à d'autres questions.

Par exemple, Yum ignore complètement les dépendances d'un logiciel compilé à partir de la source. Si le logiciel compilé a des exigences strictes de version contre la mise à jour des packages, il pourrait ne pas fonctionner correctement après la mise à jour. En outre, même si le package est installé en utilisant Source RPM avec des options de compilation personnalisées, il est écrasé par un nouveau package et les fonctionnalités spécifiées dans les options de compilation sont désactivées.

Dans cet article, nous introduisons un petit script écrit en Python qui permet aux administrateurs d'appliquer facilement des mises à jour de packages en ligne de commande sur des serveurs multiples. En utilisant ce script, l'administrateur peut confirmer manuellement quels paquets doivent être mis à jour. Intérieurement, le script exécute un "yum check-update" en séquence afin de vérifier la présence des mises à jour de packages et affiche une invite de commande qui permet à l'administrateur de choisir si les mises à jour du paquet doivent être exécutées.

Le script proposé utilise une librairie Python relativement récente appelée Fabric, ce qui permet aux utilisateurs d'exécuter des commandes sur plusieurs serveurs distants via SSH. Donc, le script a besoin de se connecter aux serveurs distants de l'utilisateur via SSH.

Bien que nous avons testé le script sur Linux CentOs 5.5, les administrateurs utilisant d'autres distributions RedHat peuvent aussi utiliser ce script.

Exemple d'erreur causée par Yum

Dans cette section, nous fournirons un exemple concret pour démontrer la question qui se pose sur la mise à jour du package Yum. Postfix, qui est un serveur de messagerie commun, implémente un support MySQL à partir de versions récentes. Toutefois, le package Postfix fourni par le référentiel par défaut de Yum n'inclut pas cette fonctionnalité, et par conséquent, de nombreux utilisateurs installent Postfix à partir du Source RPM.

Supposons que le serveur dispose d'une version précédente de Postfix installée à partir du Source RPM et utilise la configuration donnée dans Postfix MySQL Howto.

# sudo rpm -ivh PREVIOUS_POSTFIX_SOURCE_RPM_URL
# cd /usr/src/redhat/
# sudo vim SPEC/postfix.spec
< %define MYSQL 0
> %define MYSQL 1
# rpmbuild -ba SPEC/postfix.spec
# rpm -ivh RPMS/x86_64/postfix-VERSION_NUM.x86_64.rpm

Après l'exécution du "yum -y update", Yum detecte et installe la version plus récente de Postfix.

Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
(snip)
=======================================================================================================
 Package                   Arch                     Version                     Repository        Size
=======================================================================================================
Updating:
 postfix                   x86_64                   2:2.3.3-2.1.el5_2           base             3.7 M

Transaction Summary
=======================================================================================================
Install       0 Package(s)
Upgrade       1 Package(s)
(snip)
Running Transaction
  Updating       : postfix                                                                         1/2 
warning: /etc/postfix/main.cf created as /etc/postfix/main.cf.rpmnew
  Cleanup        : postfix                                                                         2/2 

Updated:
  postfix.x86_64 2:2.3.3-2.1.el5_2                                                                     

Complete!

Comme le package installé ne contient pas le support MySQL, Postfix commence à sortir les erreurs suivantes dans /var/log/maillog après son redémarrage.

Feb 18 00:31:29 jango postfix/master[29981]: warning: process /usr/libexec/postfix/local pid 6189 exit status 1
Feb 18 00:31:29 jango postfix/master[29981]: warning: /usr/libexec/postfix/local: bad command startup -- throttling
Feb 18 00:32:29 jango postfix/local[6191]: fatal: unsupported dictionary type: mysql

S'il n'y a pas eu confirmation que le package mis à jour fonctionne correctement, la mise à jour du package Yum peut parfois entraîner un échec du serveur. Donc, nous recommandons l'utilisation de notre script proposé au lieu de la mise à jour automatique de package fournie par yum-updatesd et yum-cron.

Installation de Fabric

Le script proposé nécessite plusieurs packages. Tout d'abord, le référentiel logiciels EPEL doit être installé. Les administrateurs utilisant la distribution Linux de RedHat Entrerise Linux 5 peuvent installer le référentiel en utilisant la commande suivante, les instructions d'installation peuvent également être trouvées ici.

# sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

Ensuite, plusieurs packages doivent être installés.

# sudo yum -y install gcc python26 python26-devel python26-distribute

Maintenant, Fabric peut être installé en utilisant easy_install, qui installe aussi les librairies Python nécessaires en utilisant la commande suivante.

# sudo easy_install-2.6 fabric

Script

Le script proposé est donné ci-dessous, comme Fabric utilise fabfile.py comme son nom de fichier par défaut, le script doit être introduit dans fabfile.py.

# cd INSTALL_DIR
# vim fabfile.py

#!/usr/bin/env python2.6

from fabric.api import env, run, sudo
from fabric.contrib.console import confirm

env.warn_only = True

def update():
    if run("yum check-update").return_code != 0:
        if confirm("execute yum update?", default=False) == True:
            sudo("yum -y update", pty=True)

Comme mentionné plus haut, le script exécute un yum check-update sur chaque serveur distant et affiche une invite de commande qui permet à l'utilisateur de choisir s'il faut exécuter le yum update. Notez que env.warn_only est un composant nécessaire; c'est parce que yum renvoie un code d'état non nul s'il trouve des mises à jour de packages, ce que Fabric considère à tort comme une erreur et réagit en interrompant l'exécution.

Maintenant, le script peut être exécuté. fab est la commande qui reçoit le nom de la fonction Python cible comme argument et exécute la fonction. Dans ce cas, le nom de la fonction est update, et ainsi, la commande est la suivante.

# fab -H HOST_NAME1,HOST_NAME2 update

Après l'exécution de la commande ci-dessus, le script vérifie la présence de mises à jour de packages et génère ce qui suit. Comme on peut le voir, si des mises à jour de packages existent, l'utilisateur peut choisir d'effectuer les mises à jour après avoir confirmé les packages qui doivent être mis à jour.

[qui-gon.ikuya.net] Executing task 'update'
[qui-gon.ikuya.net] run: yum check-update
[qui-gon.ikuya.net] out: Loaded plugins: fastestmirror
[qui-gon.ikuya.net] out:
[qui-gon.ikuya.net] out: bind-libs.x86_64                        30:9.3.6-4.P1.el5_5.3            updates
(snip)
[qui-gon.ikuya.net] out: udev.x86_64                             095-14.21.el5_5.1                updates

Warning: run() encountered an error (return code 100) while executing 'yum check-update'

execute yum update? [y/N]

Le nom d'utilisateur et le mot de passe peuvent être spécifiés en option en utilisant respectivement les options -u et -p.

# fab -u USER_NAME -p PASSWORD -H HOST_NAME1,HOST_NAME2 update

Les adresses du serveur distant cible peuvent également être spécifiées en utilisant la variable env.hosts dans fabfile.py.

#!/usr/bin/env python2.6

from fabric.api import env, run, sudo
from fabric.contrib.console import confirm

env.warn_only = True

env.hosts = [
    "HOST_NAME1",
    "HOST_NAME2"
]

def update():
    if run("yum check-update").return_code != 0:
        if confirm("execute yum update?", default=False) == True:
            sudo("yum -y update", pty=True)

En utilisant le script ci-dessus, l'utilisateur peut exécuter la mise à jour sans spécifier les adresses du serveur distant.

# fab update

Conclusion

Cet article a proposait un petit script qui permet aux administrateurs de serveurs d'appliquer facilement des mises à jour de packages sur des serveurs distants. Le script utilise une librairie Python appelée Fabric, et exécute des mises à jour de packages en séquence.

Notez que Fabric est une librairie Python générique et peut être utilisée pour automatiser de nombreuses autres tâches d'administration de serveur. Si vous souhaitez en savoir plus sur Fabric, référez-vous à la documentation officielle .


Ikuya Yamada

Ikuya Yamada est un entrepreneur et ingénieur logiciel experimenté. Actuellement, il est le fondateur et directeur technique de Studio Ousia Inc., une société de logiciels R & D fondée à Tokyo en 2007. Il est également chercheur invité au Keio Research Institute au SFC depuis 2010. Avant Studio Ousia, il était le directeur technique d'une société de logiciel japonaise cotée nommée Fractalist Inc. et auparavant le fondateur et PDG d'une société de R & D logiciel appelée Newrong Inc., qui a été acquise par Fractalist Inc. en 2005. Il a obtenu son B.S. (2006) et M.S. (2010) à l'université de Keio.

Yoshiyasu Takefuji

Yoshiyasu Takefuji a été fortement impliqué dans le développement d'une station de travail couleur UNIX en 1983 à l'Université de Floride du Sud. Récemment, il a contrôlé trois serveurs Linux pour voir le comportement des attaques DOS. Il est président du SecurityExpo au Japon depuis 2004 et également président du comité d'évaluation de sécurité produit du OECD TrustE au Japan, et conseiller de l'Association japonaise de sécurité réseau et CMU au Japon.


Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site http://www.traduc.org/Gazette_Linux

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.