Le petit coin de Nicolas

Aller au contenu | Aller au menu | Aller à la recherche

Intégration

Recherche développeur PHP - Symfony pour un annuaire d'entreprise à JCDecaux

Le développeur a été trouvé ; il ne sert plus à rien de postuler

Ci-après le descriptif de la mission :

Mission :

Conception et développement du nouvel annuaire d’entreprise Globe.

Les travaux relatifs à la mission seront :

  • Participation à la spécification détaillée du système constitué d’une base de données, d’une IHM de consultation et d’un ensemble de traitements batch
  • Conception et réalisation en PHP / Symfony (incluant les tests unitaires)
  • Elaboration des tests de qualification du système

Environnement technique :

  • PHP 5.2.x
  • Framework Symfony
  • MySQL 5.0/5.1
  • Microsoft Active Directory
  • Redhat 5.x

Compétences techniques requises :

  • Rédaction de spécifications détaillées
  • Framework Symfony et PHP
  • Modèle relationnel, requêtes SQL

Compétences techniques appréciées :

  • SQL Oracle (l'existant est stocké dans une base Oracle)
  • Javascript et jQuery
  • VBS (Visual Basic Script) (pour la réalisation de scripts - compétence non bloquante car pourra au pire être réalisée en interne)
  • Active Directory

Qualités humaines recherchées :

  • Esprit d’analyse
  • Rigueur
  • Dynamisme
  • Sens de la communication

Localisation du poste :

  • Plaisir ZI Sainte-Apolline (78)
  • Pas de télé-travail possible pour cette mission

Date de démarrage souhaitée :

  • Au plus tôt

Durée de la mission :

  • 50 jours sur 3 mois

Contact :

  • nicolas POINT steinmetz AT jcdecaux POINT fr

Les vues DNS pour fluidifier la gestion de vos applications

Contexte / Objectifs

Imaginer :

  • Vous êtes dans un grosse PME multi-sites ou avec un hébergement multi-sites
  • Un applicatif est soit réparti sur chaque site, soit il est porté globalement en multi-site (ex un serveur de mail, une application web, etc)
  • Votre but est de minimiser la gestion de ces équipements tout en gardant une homogénéité au niveau de la conf (tout le monde utilise par ex mail.maboite.tld pour accéder au webmail mais cela pointe en fait sur chaque serveur de mail local).

Deux modes de gestion :

  • Au niveau de chaque site, vous avez la solution de déployer un serveur DNS qui gère les entrées correspondantes et faire ainsi la gestion de N dns lors de la modification d'une entrée.
  • Vous utilisez les vues DNS et vous déployez un serveur maitre et les vues se transmettront aux esclaves par simple transfert de zone.

Mais au fait, c'est quoi une vue DNS ???

Kezako une vue DNS ?

Pour un serveur DNS donné, celui-ci peut répondre des informations différentes suivant le client ou bien l'IP du serveur DNS utilisée pour faire sa requête.

Dans le cas de mon webmail :

  • Suppsons que la répartition entre le site A et le site B se fasse par round robin
  • le client arrive sur un Reverse Proxy (RP) qui le dispatche ensuite parmi plusieurs frontaux
  • Quand un client arrive sur le site A, le RP doit renvoyer sur les frontaux 10.8.0.102 à 10.8.0.104
  • Quand un client arrive sur le site B, le RP doit renvoyer sur les frontaux 10.9.0.102 à 10.9.0.104

Construisons une petite matrice de flux :

Vue Site A Vue Site B
Frontaux Site A X
Frontaux Site B X
RP Site A X
RP Site B X
Transfert de zone X X

Equipements

Soit 5 serveurs ayant les rôles suivants :

  • srv101 / 10.8.0.1 : RP + DNS Master site A
  • srv102 / 10.8.0.102 : Serveur Mail Site A 1
  • srv103 / 10.8.0.103 : Serveur Mail Site A 2
  • srv104 / 10.8.0.104 : Serveur Mail Site A 3
  • srv201 / 10.9.0.1 - 10.9.0.2 : RP + DNS Slave site B
  • srv202 / 10.9.0.102 : Serveur Mail Site B 1
  • srv203 / 10.9.0.103 : Serveur Mail Site B 2
  • srv204 / 10.9.0.104 : Serveur Mail Site B 3

Mise en place de la configuration DNS

Note

  • Le DNS ne doit plus écouter sur le port local
  • Il ne doit pas y avoir de règle sur localhost
    • Si localhost autorisé, alors localhost == 127.0.0.1 == IP1.DU.SERVEUR.FQDN == IP2.DU.SERVEUR.FQDN == ... => /etc/resolv.conf à renseigner avec l'IP locale sur lequel le serveur DNS écoute.
  • Pour permettre le transfert de zone, le DNS slave doit se synchroniser avec le serveur maitre en faisant des requêtes sur 2 ip distinctes pour voir les 2 vues :
    • Si le DNS slave interroge le DNS maitre avec son IP principale (10.9.0.1), alors il obtient la vue du site B
    • Si le DNS slave interroge le DNS maitre avec son IP secondaire (10.9.0.2), alors il obtient la vue du site A
  • Mise en place du transfert sur le DNS slave :
    • Installer Bind
    • Mettre en place le fichier named.conf
    • Lancez bind, il récupère alors les fichiers de zone automatiquement du serveur maitre

Conf DNS Master

Contenu de /etc/named.conf

acl "trusted" {
 localhost;
 10.0.0.0/8;
};
 
options {
    directory "/var/named";
    listen-on {
        10.8.0.1;
    };
    auth-nxdomain no;
    allow-query { trusted; };
    allow-recursion { trusted; };
};
 
# Define ACL for views
acl "frontaux_siteb" {
    10.9.0.102;
    10.9.0.103;
    10.9.0.104;
};

acl "frontaux_sitea" {
    10.8.0.102;
    10.8.0.103;
    10.8.0.104;
};
 
 acl "rpdns_sitea" {
    10.8.0.1; 
};
 
acl "rpdns_siteb" {
    10.9.0.1;
};

acl "rpdns_siteb_ext" {
    10.9.0.2;
};

 # Views definitions
view "site_a" {
	match-clients { frontaux_sitea; rpdns_sitea; };

	# Vue locale
	zone "domaine.tld" IN {
		type master;
		file "sitea.domaine.tld.zone";
		allow-update { none; };
		allow-transfer { 10.9.0.2; };
		notify yes;
	}; 
};
 
view "dns_slave" {
	match-clients { rpdns_siteb_ext; };
 
	# Vue locale
 	zone "domain.tld" IN {
		type master;
 		file "siteb.domaine.tld.zone";
		allow-update { none; };
		allow-transfer { 10.9.0.2; };
		notify yes;
	}; 
};
 
view "site_b" {
	match-clients { frontaux_siteb; rpdns_siteb; };
 
	# Vue locale
	zone "cyclo.priv" IN {
		type master;
 		file "pla.cyclo.priv.zone";
		allow-update { none; };
		allow-transfer { 10.9.0.1; };
		notify yes;
	}; 
};
 

Conf DNS Slave

acl "trusted" {
 localhost;
 10.0.0.0/8;
};
 
options {
    directory "/var/named";
    listen-on {
        10.8.0.1;
    };
    auth-nxdomain no;
    allow-query { trusted; };
    allow-recursion { trusted; };
};
 
# Define ACL for views
acl "frontaux_siteb" {
    10.9.0.102;
    10.9.0.103;
    10.9.0.104;
};

acl "frontaux_sitea" {
    10.8.0.102;
    10.8.0.103;
    10.8.0.104;
};
 
 acl "rpdns_sitea" {
    10.8.0.1; 
};
 
acl "rpdns_siteb" {
    10.9.0.1;
};

acl "rpdns_siteb_ext" {
    10.9.0.2;
};

# Views definitions
view "site_a" {
	match-clients { frontaux_sitea; rpdns_sitea; };

	# Vue locale
	zone "domaine.tld" IN {
		type slave;
		file "sitea.domaine.tld.zone";
		masters { 10.8.0.1; };
		transfer-source 10.9.0.2;
	}; 
};
 
view "dns_slave" {
	match-clients { rpdns_siteb_ext; };
 
	# Vue locale
 	zone "domain.tld" IN {
		type slave;
 		file "sitea.domaine.tld.zone";
		masters { 10.8.0.1; };
		transfer-source 10.9.0.1;
	}; 
};
 
view "site_b" {
	match-clients { frontaux_siteb; rpdns_siteb; };
 
	# Vue locale
	zone "cyclo.priv" IN {
		type slave;
 		file "siteb.domaine.tld.zone";
		masters { 10.8.0.1; };
		transfer-source 10.9.0.1;
	}; 
};
 

Conf Zone sitea.domaine.tld.zone

$TTL 864000
domaine.tld. IN SOA dns.domaine.tld. root.domaine.tld. (
        2009100101
        3600
        3600
        3600
        3600 )
@           IN      NS      domaine.tld.
dns     	IN      A       10.8.0.1
www2		IN      A       10.8.0.102
www2		IN      A       10.8.0.103
www2		IN      A       10.8.0.104
webmail 	IN		CNAME	www2

Conf Zone siteb.domaine.tld.zone

$TTL 864000
domaine.tld. IN SOA dns.domaine.tld. root.domaine.tld. (
        2009100101
        3600
        3600
        3600
        3600 )
@           IN      NS      domaine.tld.
dns     	IN      A       10.8.0.1
www2		IN      A       10.9.0.102
www2		IN      A       10.9.0.103
www2		IN      A       10.9.0.104
webmail 	IN		CNAME	www2

Conf OS

/etc/resolv.conf

Serveurs du site A :

search domaine.tld
nameserver 10.8.0.1

Serveurs du site B :

search domaine.tld
nameserver 10.9.0.1

Tests

Depuis le site A

La commande dig @10.8.0.1 webmail.domain.tld depuis un serveur du site A doit vous renvoyer une réponse en 10.8.0.x

Depuis le site B

La commande dig @10.9.0.1 webmail.domain.tld depuis un serveur du site A doit vous renvoyer une réponse en 10.9.0.x

Transfer de zone

Lorsque vous démarrez le DNS esclave, il doit récupérer automatiquement les deux fichiers de zone avec un contenu identique à celui décrit plus haut.

Sources

Pour conclure...

J'espère que c'est pas trop confus et que cela vous aura donner des idées.

Dans mon cas, j'utilise ça avec en plus une zone privée :

  • les internautes arrivent de l'extérieur avec une url publique
  • ils transitent sur le réseau interne via des urls privées

Lecture : High Performance MySQL

L'intranet du groupe JCDecaux utilisant MySQL comme base de données, et devant travailler sur les problématiques de scalabilité / Plan de reprise d'activité, je m'étais acheté le livre "High Performance MySQL", considéré comme la référence en la matière. Autant le dire de suite, je n'ai pas été déçu et s'il avait été publié chez Apress, il aurait été appelé sans aucun doute : "MySQL : The definitive guide".

Contrairement à ce que pourrait laisser croire le titre, il ne se focalise pas uniquement sur la performance. Ou sinon il faut l'entendre comme utiliser MySQL de façon performante à tous les niveaux (code, infrastructure, sécurité, backup, etc).

Le livre couvre les sujets suivants :

  • Architecture de MySQL (architecture logique, moteurs de stockage, etc)
  • Benchmark et profilage en vue de trouver les goulots d'étranglements
  • Optimisation des schema et des index
  • Optimisation des requêtes
  • Fonctionnalités avancées de MySQL (Vues, Cache, Partitionnement, Clés étrangères, etc)
  • Optimisation de la configuration du serveur MySQL
  • Optimisation système et logicielle d'un serveur MySQL
  • Réplication
  • Montée en charge et/ou haute dispo
  • Optimisation applicatives (Serveur web, Cache, etc)
  • Sauvegarde et restauration
  • Sécurité
  • Les status d'un serveur MySQL (Show status & co)
  • Outils de consultation, surveillance, analyse, etc d'un serveur MySQL

J'ai bien aimé :

  • La complétude du livre : même si je ne suis pas concerné par tous les chapitres, au moins on a au final une vue complète sur MySQL. Dans ce sens, il devrait être lu par toute personne touchant de près ou de loin à MySQL
  • La prudence / le pragmatisme / les conseils sur les aspects performance et sur les capacités de MySQL face à tel ou tel objectif.

J'aurais bien aimé :

  • Sur la réplication, un peu plus de détail sur l'implémentation de certaines typologies de réplication - seul le cas basique (maitre/esclave) est couvert techniquement. Pour les autres cas, c'est plus une présentation + SWOT qu'une implémentation qui est proposée dans le livre.
  • Peut être une meilleure formulation de certains ratios car pour réussir à en calculer certains, c'est pas aisé aisé.
  • Au niveau configuration, ils auraient pu parler de la surchage de la configuration par défaut (une mise à jour du tutoriel va arriver prochainement) via les directives include et/ou includedir.

Je n'ai pas aimé :

  • Rien :)

Par contre, moi qui était globalement un partisan de MySQL, j'avoue être un peu refroidi par certains cotés dans le cadre d'un déploiement en entreprise (lié à la lecture du livre et l'expérience d'intégration/production à JCDecaux) :

  • L'instructon "Stop Slave" jusqu'à la version 5.1.35 arrête la réplication sans attendre la fin de la transaction en cours.
  • La sauvegarde par copie physique des fichiers a l'air plus que fragile.
  • La sauvegarde par export logique (à la mysqldump) semble être la seule voie stable avec pour inconvénient de (re)jouer un grand nombre de requêtes SQL (et donc d'être plus longue qu'une sauvegarde physique)
  • La gestion des log innodb (/var/lib/mysql/ibdata* /var/lib/mysql/iblogfile*) que l'on ne peut pas purger sans reconstruire complètement son serveur. Le risque étant que ces fichiers remplissent la partition s'ils ne sont pas limitées en taille ou que si la taille est atteinte, alors votre applicatif est figé. Coté indisponibilité de service, c'est pas mal non plus...
  • Le fait de mixer des tables au format MyISAM et InnoDB créent des contraintes d'exploitation potentiellement assez intéressantes puisque suivant le type de table, il ne faudrait pas utiliser les mêmes options pour mysqldump par ex. De même au niveau tuning, vu les ressources limitées d'un serveur, l'arbitrage du tuning entre les 2 types de tables peut être globalement "sous-performant"

Du coup, je crains que MySQL, dans le contexte JCDecaux, se limite à des petits applicatifs ou avec une criticité pas trop élevée alors que SQL Server / Oracle sera utilisé pour le reste.

Apache : mutualisation, inclusion et ordre

Ordre

Une des fonctionnalités intéressante d'apache d'un point de vue administration est de pouvoir déposer des fichiers de configuration complémentaires sans avoir à toucher au fichier de configuration de base, et ce dans le répertoire /etc/httpd/conf.d/ ou /etc/apache/conf.d suivant la distribution utilisée.

Il faut néanmoins faire attention à un point, les fichiers sont chargés dans l'ordre alphabétique. Par ailleurs, dans une configuration avec une IP utilisant les virtualhost (qui ose ne pas les utiliser ?) il faut que le premier virtualhost chargé contienne la directive NameVirtualHost xxx.xxx.xxx.xxx:xx

Il vous faut donc adopter l'ordre suivant :

  1. Fichiers chargeant les modules apache requis pour le(s) site(s)
  2. Fichier chargeant le vhost avec la directive NameVirtualHost xxx.xxx.xxx.xxx:xx
  3. Reste des fichiers de configuration des virtualhosts
  4. Autres fichiers

Cela vous évitera de perdre comme moi 2h la semaine dernière à tenter de comprendre pourquoi l'authentification NTLM ne fonctionnait plus sur une url mais bien sur une autre. L'ordre alphabétique des fichiers faisait que j'avais inversé le point 1 et 2. Par contre, pour l'url d'un site situé en 3, comme le module avait été chargé en phase 2, alors l'authentification était fonctionnelle pour ce site...

Inclusion

Le module "core" d'apache fournit la directive Include très utile dans la cas où il faut reproduire une configuration identique pour plusieurs virtualhosts. Prenons le cas de deux sites réalisés avec le même outil et accessibles sous deux urls différentes (monsite.fr et monsite.com par ex). Ces deux sites possèdent le même jeu de réécriture d'url (ie celles fournit par le produit).

Une première et mauvaise façon de faire serait de créer 2 fichiers de configuration contenant à chaque fois l'ensemble de la configuration. En cas de modification d'une règle, il vous faut faire la modification à deux endroits.

Cela vous donnerait un fichier du type /etc/httpd/conf.d/www.monsite.fr.conf :

<VirtualHost *>
    ServerName www.monsite.fr
    DocumentRoot /var/www/monsite

    <Directory /var/www/monsite/>
        ...
        Ensemble d'instructions
        ...
    </Directory>

    ...
    [Jeu d'instrusctions de réécriture]
    ...

    ErrorLog ...
    AccessLog ...
</VirtualHost>

Idem pour monsite.com (/etc/httpd/conf.d/www.monsite.com.conf)

La bonne façon de faire est la suivante : /etc/httpd/conf.d/www.monsite.fr.conf

<VirtualHost *>
    ServerName www.monsite.fr
    Include /etc/httpd/application/directory.txt
    Include /etc/httpd/application/rewrite_rule.txt

    ErrorLog ...
    AccessLog ...
</Virtualhost>

et /etc/httpd/conf.d/www.monsite.com.conf

<VirtualHost *>
    ServerName www.monsite.com
    Include /etc/httpd/application/directory.txt
    Include /etc/httpd/application/rewrite_rule.txt

    ErrorLog ...
    AccessLog ...
</Virtualhost>

Avec /etc/httpd/application/directory.txt :

    DocumentRoot /var/www/monsite

    <Directory /var/www/monsite/>
        ...
        Ensemble d'instructions
        ...
    </Directory>

et /etc/httpd/application/rewrite_rule.txt :

    [Jeu d'instrusctions de réécriture]

Ainsi, on peut mutualiser au maximum au niveau de la configuration d'apache, sans se priver de pouvoir rajouter des directives propres à un virtual host en incluant des fichiers supplémentaires.

Ex si on a une couche SSO pour un site et une version anonyme :

/etc/httpd/conf.d/intranet.monsite.fr.conf

<VirtualHost *>
    ServerName intranet.monsite.fr
    Include /etc/httpd/application/directory.txt
    Include /etc/httpd/application/rewrite_rule.txt
    Include /etc/httpd/application/authentification_SSO.txt

    ErrorLog ...
    AccessLog ...
</Virtualhost>

et /etc/httpd/conf.d/intranet.monsite.com.conf

<VirtualHost *>
    ServerName intranet.monsite.com
    Include /etc/httpd/application/directory.txt
    Include /etc/httpd/application/rewrite_rule.txt
    # Include /etc/httpd/application/authentification_SSO.txt

    ErrorLog ...
    AccessLog ...
</Virtualhost>

Bien sur, vous pouvez mettre vos fichiers ailleurs que dans /etc/httpd/application :-)

Des choix techniques et d'infrastructure

Je discutais cet après-midi avec un de nos architectes sur les distributions Linux en lui faisant remarquer que CentOS 5.3 était sortie 2 mois après RHEL 5.3 et que Fedora Cora 11 (probable base de RHEL 6, à moins que cela ne soit Fedore Core 10) va sortir dans 15 jours. Personnellement, j'espère que ce sera Fedore Core 11 (PHP 5.2.9, voir 5.3 avec les updates ?) vu que PHP n'a pas été mis à jour depuis FC9 (PHP 5.2.6) et surtout parce que cela m'éviterait de recompiler les paquets PHP pour faire marcher notre intranet groupe sous eZ Publish 4.0.x

Tout ça pour aborder différents points :

De l'harmonisation / industrialisation des plate-formes

  • Personnellement, je préférerais utiliser autre chose que notre socle RHEL 5.2 car dans la mesure où je dois maintenir un certain nombre de paquets, je préférerais par exemple utiliser une Fedora ou une Slackware qui fournit nativement la (quasi) totalité des paquets dont j'ai besoin. Cela éviterait de payer des licences et un support, support auquel je ne peux surement pas ou peu faire appel vu que j'utilise des paquets autre que les paquets officiels.
  • A contrario, il y a une logique d'entreprise de capitaliser à ce jour sur 2 distributions Linux : RHEL pour l'applicatif et Slackware pour l'infrastructure.
  • En y repensant, Slackware, même si elle remplit les besoins de base pour une site LAMP classique, se verrait sûrement disqualifier dès lors qu'il faut se connecter à des bases Oracle / SQL Server (suis pas sur que les extensions Oracle / SQL Server soient fournis pour PHP par ex). Idem PostgreSQL ne fait malheureusement pas parti des paquets officiels Slack (il existe des slackbuilds certes).

Est-ce que l'infrastructure technique doit imposer des choix logiciels ou bien doit-elle s'adapter aux projets

  • A propos de se cantoner au paquets officiels, faut-il dire que l'infra pilote les pré-requis d'un projet ? Dans le cas de l'intranet groupe, si on ne s'était pas adapté aux pré-requis eZ Publish, il aurait fallu disqualifier le produit. La solution de monter une plate forme sur une autre distribution me parait exclue car n'allant pas dans la logique d'harmonisation / industrialisation.
  • Il peut certes être séduisant d'imposer une infrastructure pour des contraintes d'exploitabilité / de maîtrise du parc / ...
  • Personnellement, je pense que c'est à l'infrastructure de s'adapter dans la mesure du raisonnable. Passer à côté de solutions répondant aux problèmes des utilisateurs pour une histoire de version de composant me semble être une hérésie et symboliser l'échec de la mission d'une DSI à l'égard de ses utilisateurs. Ce doit être mon côté fonctionnel qui ressort...

Distribution commerciale vs opensource vs bleeding edge vs ...

  • Pour faire des économies en ces temps de crise, est-il judicieux par ex de monter des environnements de VABF / PREPROD sur du CentOS et la PROD sur du RHEL (Pour rappel et en schématisant CentOS == RHEL - logo Red Hat). Cela peut être séduisant mais à bien valider...
  • Pour les applis web requérant des versions "à jour / bleeding edge" de certains composants, peut-on imaginer une plate forme Fedora alors que pour les applicatifs de gestion (ie requérant des certifications RHEL comme SAP, Oracle, etc) on mise sur du RHEL (après tout, Fedora est la base / le laboratoire de RHEL et personne n'oblige à faire les mises à jour tous les matins)
  • Vaut-il mieux investir sur Fedora / RHEL plutôt que RHEL + paquets maison (un peu dans la même veine que précédemment) ? Il serait intéressant de déterminer à partir de quand le coup de possession de Fedora est moindre que celui de RHEL + Paquets maison + contexte d'infogéreur (ah les complexités de système...)
  • Ne me parlez pas d'investir sur Debian, c'est exclu ;-)

Avis ? Retours d'expériences ? Commentaires ? Questions ?

Proposition de stage / contrat d'apprentissage eZ Publish chez JCDecaux

Si vous êtes à la recherche (ou connaissez des gens susceptibles d'être intéressés) d'un stage ou d'un contrat d'apprentissage pour travailler sur des projets web avec les outils eZ Publish (Intranet groupe principalement, Sites web vélos éventuellement) ou Symfony (probabilité plus faible mais sait-on jamais), n'hésitez pas à me contacter à l'adresse : nsteinmetz AT gmail POINT com.

Le stage / contrat d'apprentissage se déroulerait à Plaisir (78)

Retour sur un an d'intégration à JCDecaux

Fêtant demain mes 1 an à JCDecaux en tant qu'intégrateur, petit retour :

  • Découverte d'une informatique de production : après 4 ans en SSII travaillant principalement sur des projets de développement, ce fut la grande découverte tant d'un point de vue technique, des processus, des procédures ou d'un point de vue organisationnel et humain. Le système _doit_ tourner, y compris pendant les PRA.
  • L'inertie que l'on peut attendre d'une production peut être assez relative et réserver des surprises.
  • Découverte de l'informatique dans un "grand" groupe avec toutes les problématiques associées ( connexions des filliales pour accéder aux ressources "corp", règles réseaux complexes ( zones publiques/relais/internes + firewall + reverse proxy + ... + multiples domain controller + ...), intégration Active Directory, Problématiques SSO, connexions inter et multi-applications, ou plus trivialement des simples architectures n-tiiers ;-) ).
  • L'industrialisation des process de livraison et de déploiement ne sont pas choses aisées.
  • Le pragmatisme : on ne fait pas un truc parce que c'est beau mais parce que ça marche (bon si c'est beau, c'est mieux quand même)
  • Nouvelles compétences / découverte de nouveaux univers : (Reverse) Proxy, IIS, Oracle, SQL Server, Solaris, etc ; Après 4 ans sur des technologies libres, ça enrichit et ça permet de relativiser certains parti pris / préjugés / point de vues biaisés par un prosélytisme de libristes (aka troll).
  • Les équipes de développement (internes ou externes) manquent (en général) d'une vue déploiement / production et cela leur joue des tours. Cela conduit malheureusement à des conflits larvés / problème de communication entre les équipes "Développement" et les équipes de "Prod", chacune accusant parfois l'autre à tord ("la prod c'est des psycho-rigides" vs "les devs font tout le temps n'importe quoi").
  • Pour rebondir sur le point précédent, heureusement, à l'intégration on a une vue transversale des projets (dans la mesure où on peut intervenir à la fois très en amont dès le début du projet dans les phases d'architecture / préparation des environnements et forcément très en aval vu qu'on est juste avant la prod et qu'on assure le support de la prod).
  • Pour continuer à rebondir : être à l'intégration alimente ma curiosité insatiable.
  • Entre faire chef de projet (et devoir assumer/gérer tous les manques du projet - en fait faut être masochiste pour être Chef de Projet), je préfère travailler sur la définition d'architectures techniques.
  • Dans une entreprise ou l'exigence et la qualité sont des standards, je ne passe plus pour un grand râleur (ou pessimiste c'est selon) et ça fait du bien.
  • Travailler dans un cadre aussi joli, c'est vraiment sympa (dommage, Google Streetview ne va pas assez loin)

Entretenir des sites sous eZ Publish

Outre le fait que la version 4.0.2 vient de sortir, il y a deux choses qu'il faut bien avoir en tête pour maintenir des sites sous eZ Publish :

  • Eviter tant que faire ce peut de devoir renseigner des identifiants de noeud (Node id) dans les fichiers de settings. Lors de la mise à jour d'un environnement par ex, vous êtes bon pour les mettre à jour ou lors d'un déploiement en production, vous ne pouvez pas compter sur les id disponibles sur un autre environnement - vous obligeant à prévoir leur mise à jour dans le cadre du déploiement.
  • Nettoyer vos settings au fur et à mesure :
    • Si des données relatives à plusieurs siteaccess deviennent identiques, alors déplacer les une bonne fois pour toutes dans "override"
    • Si des données ne sont plus utilisées, supprimer les
    • Si vous créez un siteaccess à partir d'un autre, ne gardez que ce dont vous avez besoin. Cela vous évitera de trainer des choses sans savoir pourquoi elles y sont...

Dans le cas d'une instance eZ Publish mutualisée (ie si vous utilisez plusieurs siteaccess, que ce soit des contenus différents par siteaccess ou bien la présentation traduite d'un contenu), vous devriez être en mesure de définir des modèles recensant le minimum / maximum de ce que peut contenir un siteaccess (idéalement que le spécifique). C'est d'ailleurs ce travail de définition de modèle que je compte faire prochainement afin de nettoyer des siteaccess non maintenus depuis maintenant plus d'un an et ayant eu de fortes évolutions...

Quand les mainteneurs de paquets n'en font qu'à leur tête...

Dernier exemple en date, le patch de gestion des timezones pour PHP fait par le mainteneur Red Hat et maintenant diffusé à toutes les distributions majeures (Fedora, Ubuntu, Debian, etc) ou encore les scripts de démarrage de MySQL sous Debian qui peuvent planter une base utilisant InnoDB sans oublier le paquet OpenSSL sous Debian qui générait une clé prévisible. Ou encore les dépendances un peu foireuses qui font qu'on installe le navigateur Mozilla et Gnome sur un serveur alors qu'on ne voulait qu'une librairie graphique.

Je vois le rôle d'un packager/mainteneur comme celui d'intégrateur que je suis. Packagé une application pour qu'elle fonctionne sur une architecture cible mais sans toucher au contenu de l'application.

La frontière doit être bien nette entre les différents rôles :

  • Le développeur développe l'application et la livre (exempt de défauts ou pas)
  • Le packageur / intégrateur réalise le package en vue de son installation / déploiement en fonction de l'infrastructure cible (règle de compilation, arborescence de fichiers, etc) mais sans toucher aux contenus de l'application
  • Si ce dernier trouve des bugs, il doit les faire remonter aux développeurs qui livrent une version corrigée.
  • En tous les cas, le packager/intégrateur n'introduit pas de bug potentiels et surtout pas en "pensant bien faire" ou "se simplifier la vie" et encore moins celle des autres de façon hypothétique.

Dès lors, on comprend mieux pourquoi la fondation Mozilla ne veut pas que son navigateur Firefox ou son client mail Thunderbird soient appelés par leur nom sous Debian (vu qu'ils modifient les logiciels en question). Ils n'ont en effet pas à être tenus responsables des erreurs des packageurs ou voir associer le nom de leur produit à un paquet mal ficelé. Ces pratiques ne servent pas non plus l'image de la distribution au final.

Je crois que je vais finir par donner raison à mon Responsable Sécurité qui ne jure que par Slackware - dont le packaging se limite au packaging et à rien de plus (même pas la gestion des dépendances). Au moins, cela permet de contrôler et de savoir ce qui est exactement installé sur la machine et de n'avoir que ce qui est réellement nécessaire. On pourrait certes aller au niveau des distributions sources (type gentoo, sourcemage, lfs, etc) mais dans un cadre d'entreprise, je reste sceptique...

Sur ce, je vais voir où en est l'install de Slackware 12.2 dans ma VM Virtualbox histoire de voir comment fonctionne cette chose... ;-)

Fabric : utiliser des fonctions génériques quelque soit votre environnement de destination

Dans le premier épisode, nous avons vu la notion de roles

Rappel :

 python
@roles('prod')
def clean_remote_all():
    """
    delete old html files on remote server
    """
    run("rm -rf $(remote_dir)/*")

Or on peut aussi la notion de rôle pour distinguer dans une architecture n tiers, un serveur web du serveur de base de données. On peut donc imaginer un rôle "httpd" et un rôle "rdbms".

L'astuce "du jour" consiste à faire en sorte que l'on puisse utiliser ces rôles httpd/rdbms quelque soit l'environnement cible (dev / preprod / prod).

Commençons par définir nos environnements :

 python
# Dev envts
config.rdbms_dev = ['wwwdev']
config.httpd_dev = ['dbdev']

# Preprod envts
config.rdbms_ppr = ['wwwppr']
config.httpd_ppr = ['dbppr']

# Prod envts
config.rdbms_prd = ['wwwprd']
config.httpd_prd = ['dbprd']

L'astuce consiste ensuite à affecter les valeurs définies ci-dessus aux variabled httpd et rdbms afin de pouvoir les utiliser.

 python
#
## Set hosts in functions to use fab <env> <action>
#

def dev():
    """
    Define developement server
    """
    config.rdbms, config.httpd = config.httpd_dev, config.rdbms_dev

def preprod():
    """
    Define pre-production server
    """
    config.rdbms, config.httpd = config.httpd_ppr, config.rdbms_ppr

def production():
    """
    Define production server
    """
    config.rdbms, config.httpd = config.httpd_prd, config.rdbms_prd

En invoquant l'environnement lors de l'utilisation de fab, du style :

 bash
fab dev

... alors httpd prendra pour valeur "wwwdev" et rdbms prendra la valeur "dbdev"

Si j'ajoute ensuite dans mon fichier fabfile.py :

 python
#
## Test Block
#

@roles('rdbms')
def prepare_db():
    run("echo Preparing database for deployment")

@roles('httpd')
def prepare_web():
    run("echo Preparing web servers for deployment")

@depends(prepare_db, prepare_web)
@roles('httpd')
def deploy():
    run("echo Doing final deployment things to $(fab_host)")

Je peux selon mes besoins et avec le même résultat final mais sur des environnements différents deployer mon application de la façon suivante :

 bash
fab dev deploy
fab preprod deploy
fab production deploy

Autre chose intéressante ajoutée à Fabric mais non encore testée par mes soins pour le moment : la capacité de pouvoir spécifier un hote sur lequel exécuter une commande spécifique avec une syntaxe du type :

 sh
fab ping_servers:hosts="a;b;c"

L'action "ping_servers" va être exécutée que pour les servuers a, b et c

- page 1 de 2