JESUISUNGEEK.COM - Mot-clé - linux2022-10-15T08:24:27+02:00urn:md5:80fcbbbeeb78d335e0ba1eaeec99fb37DotclearConnexion en LDAPS avec Icingaurn:md5:09ce0dac9aabf317caf6b181d701f1342016-05-24T12:30:00+02:002016-05-24T12:56:26+02:00Jean-Baptiste LangloisBidouillesicingaldaplinux<p>Authentification sur Icinga via un serveur LDAP nécessitant un certificat</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/.icinga-ssl_s.png" alt="Icinga avec LDAPS" style="float:left; margin: 0 1em 1em 0;" title="Icinga avec LDAPS, mai 2016" /> Ce problème m'a été posé au bureau, et comme je n'ai pas trouvé de page traitant de ce problème, j'en détaille la configuration.<br />
Le serveur LDAPS utilisé dans ma société est permissif et autorise les connexions sans certificats. Il est être remplacer par un serveur forçant la connexion via un certificat en SHA-256. Quant à moi, je suis chargé de m'occuper de la migration correcte pour le serveur <a href="https://www.icinga.org/" hreflang="fr">Icinga</a>. La plupart des applicatifs dans ma société étant basé sur Java, plus qu'un certificat, il s'agit d'un TrustKeyStore (JKS) qui est fourni pour réaliser la migration.<br />
Dans Icinga, l'authentification LDAP s'effectue à travers Icinga-Web. A savoir dans les fichiers suivants (dans le cas d'une installation par défaut) :</p>
<ul>
<li><strong>/usr/share/icinga-web/app/modules/AppKit/config/auth.xml</strong></li>
<li><strong>/etc/icinga-web/conf.d/auth.xml</strong></li>
</ul>
<p>On y trouve la partie suivante :</p>
<pre class="brush: xml">
<setting name="provider">
<ae:parameter name="openldap-ldap1">
<ae:parameter name="auth_module">AppKit</ae:parameter>
<ae:parameter name="auth_provider">Auth.Provider.LDAP</ae:parameter>
<ae:parameter name="auth_enable">true</ae:parameter>
<ae:parameter name="auth_authoritative">true</ae:parameter>
<ae:parameter name="auth_create">true</ae:parameter>
<ae:parameter name="auth_update">true</ae:parameter>
<ae:parameter name="auth_map">
<ae:parameter name="user_firstname">givenName</ae:parameter>
<ae:parameter name="user_lastname">sn</ae:parameter>
<ae:parameter name="user_email">email</ae:parameter>
</ae:parameter>
<ae:parameter name="ldap_allow_anonymous">false</ae:parameter>
<ae:parameter name="ldap_dsn">ldaps://serveur1:636</ae:parameter>
<ae:parameter name="ldap_start_tls">false</ae:parameter>
<ae:parameter name="ldap_basedn">ou=people,dc=societe</ae:parameter>
<ae:parameter name="ldap_binddn">uid=userdn,ou=Applis,dc=societe</ae:parameter>
<ae:parameter name="ldap_bindpw"><![CDATA[mot_de_passe_userdn]]></ae:parameter>
<ae:parameter name="ldap_filter_user"><![CDATA[(&(uid=__USERNAME__))]]></ae:parameter>
</ae:parameter>
</setting>
</pre>
<p>Le paramètre <code>ldap_start_tls</code> semble attirant mais malheureusement ne correspond pas à mon cas où le serveur s'attend à trouver un certificat client sur la machine interrogeant l'annuaire.<br />
En fait, après plusieurs recherches, j'ai réalisé que Icinga-Web délègue l'intégralité du processus de connexion LDAP à PHP, en se basant sur les fonctions <a href="http://php.net/manual/fr/function.ldap-connect.php" hreflang="en">ldap_connect()</a> et <a href="http://php.net/manual/fr/function.ldap-search.php" hreflang="en">ldap_search()</a>, elles-mêmes s'appuyant sur la configuration locale.<br /></p>
<h3>Récupération du certificat</h3>
<p>Comme indiqué, je pars d'un <a href="https://en.wikipedia.org/wiki/Keystore" hreflang="en">Keystore</a> duquel je dois extraire le certificat nécessaire. Tout d'abord, je récupère l'alias du certificat que je compte extraire :</p>
<pre>
[root@icinga]# keytool -list -keystore mon_keystore.jks -storepass mot_de_passe_keystore
</pre>
<p>Ensuite, j'extrais le certificat (au format PEM) du Keystore (j'ai choisi le répertoire par défaut pour y stocker le certificat) :</p>
<pre>
[root@icinga]# keytool -exportcert -keystore mon_keystore.jks -storepass mot_de_passe_keystore -rfc -alias alias_du_certificat > /etc/openldap/cacerts/alias_du_certificat.pem
[root@icinga]# chmod 644 /etc/openldap/cacerts/alias_du_certificat.pem
</pre>
<p>Et je vérifie si l'algorithme de ce certificat est bien, comme demandé du SHA-256.</p>
<pre>
[root@icinga]# openssl x509 -text -noout -in /etc/openldap/cacerts/alias_du_certificat.pem | grep Algorithm
Signature Algorithm: sha256WithRSAEncryption
Public Key Algorithm: rsaEncryption
Signature Algorithm: sha256WithRSAEncryption
</pre>
<h3>Configuration du client LDAP</h3>
<p>Comme je l'ai dit plus haut, Icinga-Web se base, à travers PHP, sur la configuration locale, à savoir, <ins>l'environnement de l'utilisateur exécutant Apache</ins> (généralement <strong>www</strong>) :</p>
<pre>
[www@icinga]$ cat > ~/.ldaprc << EOF
TLS_REQCERT never
TLS_CACERT /etc/openldap/cacerts/alias_du_certificat.pem
EOF
</pre>
<p>On peut alors tester le bon fonctionnement de cette configuration :</p>
<pre>
[www@icinga]$ ldapsearch -H ldaps://serveur2:636 -d 1 2>&1 | grep TLS
TLS: loaded CA certificate file /etc/openldap/cacerts/alias_du_certificat.pem.
TLS: certificate [CN=server2,OU=0002,O=SOCIETE,C=TEST] is valid
...
</pre>
<p>Si le résultat est concluant, ne pas oublier de <ins>redémarrer Apache</ins>.</p>
<h3>Reconfiguration de Icinga-Web</h3>
<p>Finalement, je modifie le fichier auth.xml de Icinga-Web, et je vide le cache.</p>
<pre>
[icinga@icinga]$ sed -i.bak 's/serveur1/serveur2/1' /etc/icinga-web/conf.d/auth.xml
[icinga@icinga]$ /usr/share/icinga-web/bin/clearcache.sh
Cachedir: /usr/share/icinga-web/cache
Deleting cache from config (69 files) ... ok
Deleting cache from Squished (4 files) ... ok
</pre>
<p>Si aucune erreur n'a été faite, on devrait pouvoir se connecter avec ses <em>credentials</em> LDAP sur l'interface graphique de Icinga-Web <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /></p>http://www.jesuisungeek.com/index.php?post/2016/05/24/Connexion-en-LDAPS-avec-Icinga#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/250Bonne Année 2015 !urn:md5:3fafc6b994eb310cda7fdccdc59a23bd2015-01-05T16:44:00+01:002016-02-15T14:20:07+01:00Jean-Baptiste Langlois3615 Ma viechiyokodessinlinux<p>Ah ah! Il ne sera pas dit que ce blog n'hébergerai pas, au moins une fois, mes voeux du nouvel An !</p> <p><img src="http://www.jesuisungeek.com/public/pictures/divers/mini-chiyoko.png" alt="mini-chiyoko.png" style="float:left; margin: 0 1em 1em 0;" title="mini-chiyoko.png, janv. 2015" />Ah ah! Il ne sera pas dit que ce blog n'hébergera pas, au moins une fois, mes voeux du nouvel An ! Non, mais ! Mais bon, voilà qui est fait ! Il ne faudra dès lors plus s'attendre à ce que je me livre à ce genre d'exercices. Non, mais, c'est vrai, quoi ? Annoncer des résolutions qu'on ne tiendra pas ? Se baffrer à en être malade le lendemain ? Picoler ? (Ah, quoique, sur ce dernier argument, ça vaut peut-être le coup <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /> ).<br />
Bref, je souhaite, je souhaite. D'où acte. Bonne année. Voilà qui est dit...<br />
Mais à vrai dire, si je poste ce message sur mes voeux en cette belle journée du 5 janvier (Oui, pas la fête non plus, j'avais la flemme de faire ça le 1er...), c'est surtout pour partager le dernier dessin de ma femme qui est justement de saison, avec un petit plus geek (Bah oui, sinon je l'aurai pas posté ici <img src="/dotclear/themes/chestnut/smilies/tongue.gif" alt=":-P" class="smiley" /> ).<br />
<a href="http://www.chiyoko-langlois.com" hreflang="fr" title="Bonne année 2015, les pingouins !!"><img src="http://www.jesuisungeek.com/public/pictures/divers/.bonne-anne-2015-linux_m.png" alt="Bonne Année 2015" style="display:block; margin:0 auto;" title="Bonne Année 2015, janv. 2015" /></a><br />
Et une plus qui a succombé au libre, c'est pas mignon ? <img src="/dotclear/themes/chestnut/smilies/mdr.gif" alt=":mdr:" class="smiley" />
Si vous voulez davantage de jolis dessins de ce genre, je vous invite à vous rendre ici : <a href="http://www.chiyoko-langlois.com" hreflang="ja" title="Promenade avec Taro">Promenade avec Taro</a>.</p>http://www.jesuisungeek.com/index.php?post/2015/01/05/Bonne-Ann%C3%A9e-2015-%21#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/245Temporisation des sous-titresurn:md5:47d328f93c7d05ac5820f8fce7aeca292014-05-09T13:56:00+02:002014-05-09T14:02:25+02:00Jean-Baptiste LangloisBidouillesbashlinuxmacsous-titre<p>Pour les amateurs non-anglophones de séries américaines...</p> <p><img src="http://www.jesuisungeek.com/public/pictures/divers/Gnome_Subtitles_Icon.png" alt="Gnome_Subtitles_Icon.png" style="float:left; margin: 0 1em 1em 0;" title="Gnome_Subtitles_Icon.png, mai 2014" />Récemment, ma femme m'a demandé quels étaient les séries à la mode en Occident. Comme elle est fan de tout ce qui est fantastique, je lui ai proposé de regarder <em><a href="http://en.wikipedia.org/wiki/Game_of_Thrones" hreflang="fr" title="Game of Thrones">Game Of Thrones</a></em> (Bon, alors, j'avoue, elle n'a que moyennement apprécié les viols et autres décapitations <img src="/dotclear/themes/chestnut/smilies/tongue.gif" alt=":-P" class="smiley" /> ). Toutefois, afin que ce soit plus facile à comprendre pour elle, j'ai décidé de chercher des sous-titres en japonais (<strong>N.B.</strong>: Monsieur Hadopi, si tu me lis, je parle ici des épisodes de <em>Game Of Thrones</em> en DVD que j'ai acheté <img src="/dotclear/themes/chestnut/smilies/whistle.gif" alt=":siffle:" class="smiley" /> Tu peux toujours venir vérifier, mais n'oublie pas d'apporter le pop-corn <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /> ). J'ai finalement pu trouver mon bonheur sur <a href="http://www.podnapisi.net/fr/ppodnapisi/search?sJ=11" hreflang="en" title="Podnapisi">Podnapisi</a>. A propos, il y a assez peu de sites proposant des sous-titres en japonais donc je vais rajouter cette page en lien.<br />
Toutefois, tous les sous-titres télécharger sont décalés par rapport aux épisodes que je regarde (la faute au fait que je n'ai pas les <em>Previously on Game of Thrones</em> sur ma version DVD... Du coup, c'est bien gentil mais... Strictement inutilisable !<br />
Du coup, plus que de tous réencoder à la main, j'ai décidé de créer un script qui modifie la temporisation des sous-titres ; ce script est très simple dans son fonctionnement : il a pour but de modifier toutes les données de l'entrée standard (au format <a href="http://fr.wikipedia.org/wiki/SubRip" hreflang="fr" title="SRT">SRT</a>) en les augmentant ou les diminuant d'une certaine valeur. Ainsi l'invocation est très simple :</p>
<pre>
[mithweth@himiko ~]$ retime_sub.sh -1:20 < sous_titres.srt
</pre>
<p><em>Diminue le moment d'apparition des sous-titres de 1 minute et 20 secondes (ainsi, un sous-titre devant apparaître à 3 minutes 30 seondes, apparaîtra à 2 minutes 10)</em></p>
<pre>
[mithweth@himiko ~]$ retime_sub.sh +1:0:5 < sous_titres.srt
</pre>
<p><em>Augmente le moment d'apparition des sous-titres de 1 heure et 5 secondes</em></p>
<pre>
[mithweth@himiko ~]$ retime_sub.sh -12 < sous_titres.srt
</pre>
<p><em>Diminue le moment d'apparition des sous-titres de 12 secondes</em></p>http://www.jesuisungeek.com/index.php?post/2014/05/09/Temporisation-des-sous-titres#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/239Installation et configuration d'un clusterurn:md5:c78d41a47ae2b126195d7564a42166872013-05-09T16:12:00+02:002016-07-07T12:57:30+02:00Jean-Baptiste LangloisBidouillesclustergpllinuxredhat<p>Depuis un certain temps, je m'intéresse à la Haute Disponibilité et jusqu'à présent, je n'ai jamais eu le loisir d'installer mon propre cluster. Je comble donc ici ma propre ignorance.</p> <p><img src="http://www.jesuisungeek.com/public/pictures/divers/.lvs4p-200_t.jpg" alt="LVS Project Logo" style="float:left; margin: 0 1em 1em 0;" title="LVS Project Logo, mai 2013" /><strong>Cluster</strong> ! Le mot est lancé et il fait peur !! Mot compliqué et lié à des termes abscons comme <q>Node</q> ou <q>Concentrateur</q>. Et puis, sur le marché, ça fait sérieux et ça coute cher, donc c'est clairement pas le truc à refiler à des débutants !!<br />
... Enfin, c'est l'idée que j'en avais, car au final, c'est pas si compliqué que ça ; tout ce qu'il faut, ce sont des bonnes connaissances en réseau.<br />
<br />
<ins>Qu'est-ce que j'appelle ici <em>Cluster</em> ?</ins><br />
Il s'agit d'un mécanisme double, permettant l'accès à une information quel que soit l'état de mes ressources. Ainsi, je veux pouvoir être en état d'accéder à ce que je souhaite même si la moitié de mon infra est morte. Pour cela, trois notions sont habitellement associés :</p>
<ul>
<li>Le <ins>cluster failover</ins> qui permet de basculer sur une ressource secondaire si le serveur primaire en <em>down</em></li>
<li>Le <ins>load balancer</ins> qui permet de répartir équitablement l'usage des ressources pour ne pas laisser tout s'executer sur la même (ce qui permet d'une part, de ne pas la faire flancher trop rapidement et, d'autre part, d'avoir de meilleures perfs)</li>
<li>La <ins>redondance</ins> d'information entre les ressources constituant le cluster afin de ne pas perdre de données en cas de bascule (légérement hors-sujet, je dois l'avouer, mais fortement lié à l'architecture désirée)<br /></li>
</ul>
<p><br />
<ins>Un peu de vocabulaire</ins><br /></p>
<ul>
<li>On appelle <em>node</em>, le serveur effectuant la tâche demandé par le client. C'est sur ce serveur que l'applicatif désiré par le client se trouve.<ins>Un peu de vocabulaire</ins><br /></li>
<li>On appelle <em>node</em>, le serveur effectuant la tâche demandé par le client. C'est sur ce serveur que l'applicatif désiré par le client se trouve.</li>
<li>On appelle <em>concentrateur</em> (on voit aussi le terme de <em>directeur</em>, parfois), le serveur prenant en charge la requête du client et la répartie en fonction de la charge (<em>load balancer</em>) ou de l'état des <em>Nodes</em> (<em>failover</em>).</li>
</ul>
<p>On le voit ici (et également dans le schéma ci-dessous), le concentrateur ne fait juste office de <q>passerelle intelligente</q> se s'occupe que de router les paquets sur les nodes les plus adaptés. Pour l'utilisateur, c'est transparent (car il se connecte toujours via la même IP) mais il est fort probable que les divers traitements demandés soient gérés par des serveurs différents.<br /></p>
<ul>
<li>On appelle <em>concentrateur</em> (on voit aussi le terme de <em>directeur</em>, parfois), le serveur prenant en charge la requête du client et la répartie en fonction de la charge (<em>load balancer</em>) ou de l'état des <em>Nodes</em> (<em>failover</em>).</li>
</ul>
<p>On le voit ici (et également dans le schéma ci-dessous), le concentrateur ne fait juste office de <q>passerelle intelligente</q> se s'occupe que de router les paquets sur les nodes les plus adaptés.<br /></p>
<p><ins><strong>0. Présentation de l'infrastructure</strong></ins><br />
<a href="http://www.jesuisungeek.com/public/pictures/real/cluster-apache.png" title="Infrastructure Cluster"><img src="http://www.jesuisungeek.com/public/pictures/real/.cluster-apache_m.jpg" alt="Infrastructure Cluster" style="display:table; margin:0 auto;" title="Infrastructure Cluster, mai 2013" /></a>
Ce que je souhaite réaliser ici est l'un des usages les plus communs pour un cluster : un serveur Web doit être <em>up</em> 100% du temps. Pour ce faire, on monte un cluster avec 2 nodes strictement identiques dans leur configuration : même serveur Apache, même version, et même SGBDR (Car dès lors que l'on a un petit site Web, on a forcément besoin d'une base de données). La difficulté ici, est que si un node tombe,comment se passera le stockage dans le base de données ? Même question pour quand le node remontera ? Ici, on a beaucoup de chances, car MySQL gère un type de connexion Maître/Maître qui permet la mise-à-jour du cluster quel que soit le node sur lequel les données ont été écrites.<br />
Au regard du schéma, je sens poindre une question : <q>Oui, mais si le concentrateur tombe, comment qu'on fait ?</q> Question très judicieuse mais qui ne sera pas abordé ici (sachez toutefois que des solutions existent). Dans le cas présent, j'ai postulé que le Concentrateur, c'est le petit frère de Rambo, il a fait le Viet-Nam, la Thailande, la Corée du Nord, alors merde, c'est pas une petit coupure de courant qui va le faire chier !!<br />
<br />
N'ayant pas des masses de matos, j'ai cloné 2 fois la même VM sur <a href="https://www.virtualbox.org" hreflang="fr" title="Virtual Box">VirtualBox</a> de façon à avoir des machines strictement identiques. Tout juste ai-je rajouté MySQL et Apache sur les deux nodes.<br />
<br />
<strong><ins>1. Autoriser le transfert des paquets sur Concentrateur</ins></strong><br />
Pour ceux qui ont déjà monté des <em>gateway</em>, cette opération devrait déjà être réalisé <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /> Il s'agit juste d'autoriser le transfert des paquets du sous-réseau des nodes, vers le réseau global. En effet, comme le montre le schéma au-dessus, le concentrateur a deux interfaces pour permettre le NAT entre les deux réseaux. Du coup, il suffit d'autoriser le transfert de paquet et de rajouter une règle de NAT à iptables :</p>
<pre>
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
</pre>
<p>A noter que, dans mon cas, l'interface vers le réseau public étant <q>eth0</q>, ma règle <em>iptables</em> route les paquets vers cette interface.<br />
<br />
<ins><strong>2. Préparation des nodes</strong></ins><br />
Dès lors que le <em>forwarding</em> des paquets a été autorisés, on peut tenter d'accéder au réseau global à partir des nodes (en reconfigurant <strong>/etc/resolv.conf</strong>, vous pouvez même faire vos mises à jour <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /> ).</p>
<pre>
ping 192.168.1.1
</pre>
<p>Si le ping répond comme il faut, il ne reste plus qu'à bloquer le transfert de paquets <ins><strong>SUR</strong></ins> cette machine, puis créer une page bidon pour tester Apache (j'ai utilisé <code>ip addr show</code> car l'IP apparaît bien, mais n'importe quoi fera l'affaire)</p>
<pre>
echo 0 > /proc/sys/net/ipv4/ip_forward
ip addr show > /var/www/html/index.html
service httpd restart
</pre>
<p><ins><strong>3. Installation load balancer</strong></ins><br />
Pour la mise en place de ma solution de <em>load balancing</em>, comme souvent, de nombreuses possibilités s'offraient à moi. Dans le cas présent, j'ai décidé d'utiliser <a href="http://www.linuxvirtualserver.org" hreflang="en" title="Linux Virtual Server">LVS</a> car c'est un projet récent, sympa et bien supporté. En plus, les RPMs existent et sont déjà diffusés par Red Hat <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /></p>
<pre>
[root@localhost ~]# yum install ipvsadm
</pre>
<p>Une fois LVS, installé, il faut charger ses modules dnas le noyau mais <ins>attention !</ins> Des modules supplémentaires doivent être défini. En effet, ce qui rend un Concentrateur spécial et qui fait de lui plus qu'une gateway est sa capacité à définir sur quel node doit être envoyé les informations transmises. Pour cela, plusieurs algorithmes de décisions existent tels que le <em>Round Robin</em> (RR, accès séquentiel) ou le <em>Weighted Round Robin</em> (WRR, accès séquentiel ou une node de poids double est deux fois plus sollicité que les autres). Dans mon cas, j'ai décidé de rester sur du <em>Round Robin</em> classique.</p>
<pre>
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# modprobe ip_vs_rr
[root@localhost ~]# ipvsadm -A -t 192.168.1.35:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.1.35:80 -r 192.168.0.2:80 -m -w 1
[root@localhost ~]# ipvsadm -a -t 192.168.1.35:80 -r 192.168.0.3:80 -m -w 1
</pre>
<p>Je charge donc les modules nécessaires et précise à <strong>ipvsadm</strong> que l'algorithme de décision sur le port 80 (puisqu'on tente de faire un cluster avec un serveur Web) se fera sur la base de <em>Round Robin</em>. Ensuite, j'ajoute des serveurs à cette règle de clusters en faisant du NAT vers les ports 80 de mes deux nodes avec un poids de 1.<br />
<div class="dcnote noteclassic">
<p>Comme on ne fait que du <em>Round Robin</em>, on n'a, <em>a priori</em>, pas besoin de spécifier un poids quelconque. Toutefois, par défault, LVS ne prendra pas en compte un node de poids 0 (ce qui, d'ailleurs, se tient)</p>
</div>
Voilà, la configuration du <em>load balancer</em> est terminée !! Facile, non ?<br />
<br />
<ins><strong>4. Test avec le poste client</strong></ins><br />
Il ne reste donc plus qu'à tester le fonctionnement. Pour cela, à partir du poste client (une machine hors du cluster), je lance plusieurs <strong>curl 192.168.1.35</strong> vers le concentrateur qui redirige tout ça vers les différents nodes. Un résultat équivalent à celui ci-dessous devraient confirmer le bon fonctionnement du cluster :</p>
<pre>
iMac-de-Jean-Baptiste-Langlois:~ mithweth$ curl 192.168.1.35
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:d3:5b:e9 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
inet6 fe80::a00:27ff:fed3:5be9/64 scope link
valid_lft forever preferred_lft forever
iMac-de-Jean-Baptiste-Langlois:~ mithweth$ curl 192.168.1.35
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:6c:73:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.0.3/24 brd 192.168.0.255 scope global eth0
inet6 fe80::a00:27ff:fe6c:730a/64 scope link
valid_lft forever preferred_lft forever
</pre>
<p>On voit bien que, alors qu'on effectue le même appel, la valeur affichée est différente.<br />
<br />
<ins><strong>5. Haute disponibilité</strong></ins><br />
<div class="dcnote noteimportant">
<p>A faire APRES conf du load balancer : En effet, l'idée est d'ajouter ou supprimer des enresgistrements à ipvsadm en fonction de l'état des serveurs, donc il faut qu'auparavant <strong>ipvsadm</strong> soit correctement configuré.</p>
</div>
Dans le cas de mise en Haute Disponibilité d'un cluster, la plupart du temps, c'est <a href="http://www.linux-ha.org/wiki/Heartbeat" hreflang="en" title="Heartbeat">Heartbeat</a> qui est la solution recommandée. Toutefois, bien que connu et supporté, Heartbeat gère surtout l'état d'un node (<em>up</em> ou <em>down</em>) mais pas l'état d'un <em>daemon</em> installé sur ce node. Or, dans mon cas, je me moque de savoir si mon serveur tombe, dès lors que Apache fonctionne correctement. Pour superviser l'état de service et déclencher des scripts sous certaines conditons, j'ai pris le parti d'utiliser plutôt <a href="https://mon.wiki.kernel.org/index.php/Main_Page" hreflang="en" title="Mon">Mon</a>. Celui-ci peut vérifier l'état de plusieurs <em>daemons</em> ou l'état de certains flux réseaux, et le signaler ou bien exécuter un script pour, par exemple, le relancer. Dans notre cas présent, il faudrait que si Apache ne répond pas, le node inhérent soit retiré de la liste de <strong>ipvsadm</strong>.<br />
Pour installer MON, on peut très bien télécharger et recompiler les sources, mais j'ai trouvé des packages RPM de la dernière version (mon-1.2.0-8.el6.i686.rpm ou mon-1.2.0-8.el6.x86_64.rpm) que j'ai attaché à ce post. Toutefois, comme les RPMs semblent avoir été compilé avec les pieds, voici comment installer le RPM qui va bien sur votre RedHat de vos rêves ; Ne vous inquiétez pas, ça marche !! (Au moins avec ma CentOS 6.4 <img src="/dotclear/themes/chestnut/smilies/cool.gif" alt="8-)" class="smiley" /> ).</p>
<pre>
yum -y install perl-CPAN make gcc pam-devel # Installe pkg de dev
perl -MCPAN -e 'install "Time::HiRes"; install "Time::Period"; install "Convert::BER"; install "Authen::PAM"'
rpm -ivh --nodeps mon-1.2.0-8.el6.x86_64.rpm # ne pas oublier le --nodeps
yum -y remove make gcc pam-devel # desInstalle pkg de dev
</pre>
<p><strong>Mon</strong> est désormais bien installé. Il ne reste plus qu'à configurer le fichier de configuration de Mon <code>/etc/mon/mon.cf</code>. Copier ainsi le fichier ci-dessous, en changeant l'IP des ondes à la ligne <q>hostgroup</q></p>
<pre>
cfbasedir = /etc/mon
pidfile = /var/run/mon.pid
statedir = /var/lib/mon/state.d
logdir = /var/lib/mon/log.d
dtlogfile = /var/lib/mon/log.d/downtime.log
alertdir = /usr/lib64/mon/alert.d
mondir = /usr/lib64/mon/mon.d
maxprocs = 20
histlength = 100
randstart = 60s
authtype = pam
userfile = /etc/mon/userfile
hostgroup servers 192.168.0.2 192.168.0.3
watch servers
service http
interval 5s
monitor http.monitor
period wd {Sun-Sat}
upalert ha.alert
alert ha.alert
</pre>
<p>En fait, la partie importante est situé dans <code>watch <hostgroup_name></code>. Ici, la configuration précise de faire le test d'état du port 80 toutes les 5 secondes du Dimanche à Samedi sur les serveurs du <em>hostgroup</em> et qu'en cas d'erreur lancer le script <q>ha.alert</q>. En cas de rétablissement après une panne, il faudra relancer le script <q>ha.alert</q>.
<div class="dcnote noteclassic">
<p>En fait, en cas de rétablissement d'un service, le script indiqué est toujours exécuté avec le paramètre <code>-u</code>, ce qui permet de différencier les actions à effectuer dans un seul et même script.</p>
</div>
Ce script <q>ha.alert</q> n'apparait toutefois pas dans le répertoire <code>/usr/lib64/mon/alert.d</code> pour la simple et bonne réponse que c'est un script que j'ai fait moi-même : si un des <em>daemons</em> générant une réponse sur le port 80 (Apache) le script désactive l'enregistrement de <strong>ipvsadm</strong> permettant le routage vers le mode concerné. Cette désactivation consiste à changer le poids de ce routage de 1 à 0 et vice versa en cas de rétablissement du <em>daemon</em>.</p>
<pre class="brush: bash">
#!/bin/sh
read SERVER
WEIGHT=0
while getopts "s:g:h:t:l:u" opt; do
case $opt in
u) WEIGHT=1;;
s) SERVICE=$OPTARG;;
*) ;;
esac
done
GW=`grep GATEWAY /etc/sysconfig/network | cut -d = -f 2`
IFACE=`netstat -rn | grep $GW | awk '{print $NF;}'`
DFTIP=`grep IPADDR /etc/sysconfig/network-scripts/ifcfg-$IFACE | cut -d = -f 2`
logger -i -p local3.info -t mon "node $SERVER weight is now $WEIGHT"
ipvsadm -e -t $DFTIP:$SERVICE -r $SERVER:$SERVICE -m -w $WEIGHT
</pre>
<p>Il faut donc copier le script ci-dessus, le nommer <q>ha.alert</q>, lui donner les droits d'exécution et redémarrer <strong>mon</strong>.</p>
<pre>
chmod a+x /usr/lib64/mon/alert.d/ha.alert
service mon restart
</pre>
<p><br />
<strong><ins>6. Réplication de MySQL</ins></strong><br />
Comme indiqué plus haut, peu importe le serveur Apache avec lequel on communique, il faut que les données échangées avec la base de données soient les mêmes pour donner l'illusion qu'un unique serveur est à l'oeuvre. Pour cela, la réplication de Maitre à Maitre de MySQL va nous aider. Tout comme Apache, il faut que la configuration des nodes concernés soit strictement la même, ainsi la configuration suivante est à reporter sur chacun des nodes.<br />
<br /><ins>Node 1</ins><br />
<br />
Ajouter la ligne suivante dans <code>/etc/sysconfig/iptables</code></p>
<pre>
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
</pre>
<p>Ajouter les lignes suivantes dans le fichier <code>/etc/my.cnf</code> (Configuration MySQL)</p>
<pre>
server-id=2
log-bin=mysql-bin
</pre>
<p>On redémarre alors <strong>iptables</strong>, <strong>mysqld</strong> et on se connecte au serveur MySQL où on va créer un utilisateur spécifiquement pour la réplication (changer le <code><mot de passe></code> par le mot de passe de votre choix)</p>
<pre>
mysql> grant replication slave on *.* to 'replication'@'%' identified by '<mot de passe>';
mysql> change master to master_host='192.168.0.2', master_port=3306, master_user='replication', master_password='<mot de passe>';
mysql> slave start;
</pre>
<p><br />
<br /><ins>Node 2</ins><br />
<br />
Ajouter la ligne suivante dans <code>/etc/sysconfig/iptables</code></p>
<pre>
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
</pre>
<p>Ajouter les lignes suivantes dans le fichier <code>/etc/my.cnf</code> (Configuration MySQL)</p>
<pre>
server-id=3
log-bin=mysql-bin
</pre>
<p>On redémarre alors <strong>iptables</strong>, <strong>mysqld</strong> et on se connecte au serveur MySQL où on va créer un utilisateur spécifiquement pour la réplication (changer le <code><mot de passe></code> par le mot de passe de votre choix)</p>
<pre>
mysql> grant replication slave on *.* to 'replication'@'%' identified by '<mot de passe>';
mysql> change master to master_host='192.168.0.3', master_port=3306, master_user='replication', master_password='<mot de passe>';
mysql> slave start;
</pre>
<p><br />La réplication est enfin configurée ! Pour le vérifier il suffit de taper, dans la console MySQL, la commande suivante :</p>
<pre>
mysql> show slave status\G
</pre>
<p>Si, parmi les instructions retournés, les deux lignes suivantes apparaissent, c'est que la réplication est fonctionnelle.</p>
<pre>
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
</pre>http://www.jesuisungeek.com/index.php?post/2013/05/09/Installation-et-configuration-d-un-cluster#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/228Installer Kibana par Puppet (5/5)urn:md5:5de1c917075b3c23c70052da28ac48e52013-02-11T15:50:00+01:002013-02-13T15:04:38+01:00Jean-Baptiste LangloisBidouillesforemangplkibanalinuxmrepopuppetsvn<p>Déploiement et configuration automatique de Kibana par Puppet</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/kibana-logo.png" alt="kibana-logo" style="float:left; margin: 0 1em 1em 0;" title="kibana-logo, janv. 2013" />A présent, que tout est correctement installé, il ne reste plus qu'à configurer l'ensemble pour que Kibana se déploie sans soucis.<br /></p>
<ul>
<li><strong>Configuration du <em>Foreman-Proxy</em></strong><br /></li>
</ul>
<p>L'intérêt de Foreman est la forte intégration à Puppet. En effet, une fois les deux applications correctement configurés, Puppet peut très bien être configurés intégralement à travers l'interface Web de Foreman et sans plus mettre à jour les fichiers de configuration. Foreman s'occupe de tout, automatiquement ! <img src="/dotclear/themes/chestnut/smilies/whistle.gif" alt=":siffle:" class="smiley" /> Toutefois, Foreman n'étant lui-même qu'une interface Web passive, il n'a pas les compétences pour la collecte d'information de la part de Puppet. La solution consiste à utiliser un <em>Smart Proxy</em> réalisant cette tâche... Or, le hasard faisant bien les choses, Foreman fournit justement un <em>Smart Proxy</em> personnalisé, le bien nommé <strong>Foreman-Proxy</strong> <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /> (Pour ceux qui n'ont pas compris, c'est ce <em>Smart Proxy</em> que j'ai décidé de configurer)<br />
A l'instar de Foreman, Foreman-Proxy tourne grâce à Ruby et nécessite de se connecter à la base de données pour la collecte et le dépot d'informations. Ainsi, il faut installer la bibliothèque permettant à Ruby de se connecter, dans notre cas, à MySQL.</p>
<pre>
[root@sophie conf.d]# yum -q -y install ruby-mysql
[root@sophie conf.d]# service foreman-proxy restart
</pre>
<p>Le proxy écoutant sur le port 8443, il ne faut pas oublier d'ajouter une nouvelle règle pour <em>iptables</em> dans <code>/etc/sysconfig/iptables</code>.</p>
<pre>
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8443 -j ACCEPT
</pre>
<ul>
<li><strong>Configuration du <em>Foreman-Proxy</em> et de <em>Foreman</em></strong><br /></li>
</ul>
<p>Tout d'abord, <em>Foreman</em> dispose de deux modes d'utilisations (Désolé pour les anglicismes, j'ai pas trouvé de bonne traduction <img src="/dotclear/themes/chestnut/smilies/sad.gif" alt=":-(" class="smiley" /></p>
<ul>
<li>Le <strong>mode <em>attended</em></strong> permet la gestion de machines déjà installés et sur lesquels <em>Puppet</em> est déjà installé. La configuration est plus rapide mais nécessite une intervention initiale sur les serveurs à déployer.</li>
<li>Le <strong>mode <em>unattended</em></strong> permet la gestion de machines dès l'installation, moment où sont créés les modèles d'installation (<em>Preseed</em> ou <em>Kickstart</em>). La configuration est plus complète mais permet la totale automatisation du processus de déploiement.</li>
</ul>
<p>Par défaut, Foreman s'installation en mode <em>unattended</em>, mais nécessite donc énormement d'information sur le serveur à configurer (Adresse MAC, domaine, etc.). A moins d'avoir un réel besoin d'installer des serveurs via <em>Foreman</em>, mieux vaut désactiver l'option, c'est plus rapide. Dans mon cas, ma machine cliente <em>charlotte</em> étant déjà installé, je n'en ai pas besoin et l'ai donc désactivé :</p>
<pre>
[root@sophie conf.d]# sed -i "s/:unattended: true/:unattended: false/g" /etc/foreman/settings.yaml
[root@sophie conf.d]# service httpd restart
</pre>
<p>L'avantage d'utiliser un <em>Smart Proxy</em>, c'est que cela rend vraiment la gestion de Foreman plus simple <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /> En deux trois coups de Puppet à pot, on peut obtenir un environnement fonctionnel.</p>
<ol>
<li>Se connecter à Foreman avec les droits d'administrateur</li>
<li>Créer un nouveau <em>Smart Proxy</em> dont l'URL est <q>https://sophie.localdomain:8443</q></li>
<li>Dans <em>Settings</em>, changer le <em>modulepath</em> en <q>/etc/puppet/svn/modules</q></li>
<li>Dans <em>Settings</em>, changer le <em>puppet_server</em> en <q>sophie.localdomain</q></li>
<li>Dans <em>Settings</em>, changer le <em>foreman_url</em> en <q>sophie.localdomain</q></li>
<li>Dans <em>Settings</em>, changer le <em>remote_addr</em> en <q>127.0.0.1</q></li>
<li>Dans <em>Environnment</em>, cliquer sur <q>Import from Proxy</q> et importer environnements et classes</li>
</ol>
<p>C'est tout <img src="/dotclear/themes/chestnut/smilies/cool.gif" alt="8-)" class="smiley" /> Le serveur est dorénavant bien configuré ! Il ne reste qu'à ajouter des serveurs à la liste des <q>Hosts</q>.</p>
<pre>
[root@sophie ~]# puppetd -t
</pre>
<p>En saisissant la commande ci-dessus sur <em>sophie</em>, ce serveur-ci est ajouté au <em>Foreman</em>.<br /></p>
<ul>
<li><strong>Intégration de <em>charlotte</em> dans <em>Foreman</em></strong><br /></li>
</ul>
<p>Tout d'abord, comme rien n'est encore installé sur <em>charlotte</em>, il faut commencer par installer le client <em>Puppet</em> afin que ce serveur puisse communiquer avec le PuppetMaster. Le <em>package</em> nécessaire se trouvant dans les sources <a href="http://fedoraproject.org/wiki/EPEL" hreflang="en" title="EPEL">EPEL</a>, on ajoute un lien pour <em>YUM</em> vers ce dépot :</p>
<pre>
[root@charlotte etc]# cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=epel
baseurl=http://mirrors.ircam.fr/pub/fedora/epel/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=http://mirrors.ircam.fr/pub/fedora/epel/RPM-GPG-KEY-EPEL-6
EOF
</pre>
<p>On peut alors installer le client demandé :</p>
<pre>
[root@charlotte etc]# yum -q -y install puppet
</pre>
<p>A présent, le client est installé. Toutefois, la configuration du fichier <code>/etc/puppet/puppet.conf</code> est celle par défaut et ne correct pas à la configuration présente. Il faut donc modifier ce fichier.</p>
<pre>
[root@charlotte etc]# cat >> /etc/puppet/puppet.conf << EOF
report = true
pluginsync = true
masterport = 8140
environment = production
certname = charlotte.localdomain # le FQDN du serveur client
server = sophie.localdomain # le FQDN du puppetmaster
listen = false
EOF
</pre>
<p>Il ne reste pas qu'à lancer une requête auprès du serveur Puppet...</p>
<pre>
[root@charlotte etc]# puppetd -t
</pre>
<p>...requête qui plantera lamentablement... Car, <strong>oui!</strong> <em>charlotte</em> n'ayant pas été ajouté au PuppetMaster, celui-ci refuse la connexion, prétextant qu'il ne reconnait pas ce client (ce qui n'est pas entièrement faux, il faut le reconnaître...). Toutefois, le serveur <em>sophie</em> a noté le <em>fingerprint</em> de <em>charlotte</em> et l'a placé en <q>attente de validation</q>. Ainsi, si ce serveur est considéré comme <q>validé</q>, il obtiendra l'insigne honneur de communiquer avec cette bonne <em>sophie</em>. Sur le serveur, on peut faire la liste des serveurs en <q>attente de validation</q>.</p>
<pre>
[root@sophie puppet]# puppetca -l
"charlotte.localdomain" (75:65:48:27:49:F0:6F:2C:F4:D6:B5:8B:A7:7A:EA:0C)
</pre>
<p>Il suffit alors de <q>signer</q> ce serveur (c'est-à-dire reconnaître sa clé SSH) pour qu'il soit considéré comme <q>validé</q> par le serveur</p>
<pre>
[root@sophie puppet]# puppetca -s charlotte.localdomain
</pre>
<p>Ceci étant fait, il ne reste qu'à relancer une requête auprès du serveur Puppet, via le client.</p>
<pre>
[root@charlotte etc]# puppetd -t
</pre>
<p>Tout un ensemble d'informations appraissent (heureusement en vert <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /> ), preuve que le client a bien été reconnu par le serveur. Toutefois rien d'autre ne se passe... Cela s'explique par le fait que, bien que le client est reconnu, aucun module n'a été chargé à partir du serveur. Une honte ! C'est donc le moment de procéder à l'installation de Kibana <img src="/dotclear/themes/chestnut/smilies/oops.gif" alt=":oops:" class="smiley" /> <br /></p>
<ul>
<li><strong>Installation du serveur <a href="http://kibana.org/" hreflang="en" title="Kibana">Kibana</a></strong><br /></li>
</ul>
<p>Comme j'ai indiqué sur la <a href="http://www.jesuisungeek.com/index.php?post/2013/01/31/Installer-Kibana-par-Puppet-partie-1">première page de ce tutoriel</a>, <em>Kibana</em> est très simple à installer, sauf quand il n'y a pas de réseau et là, ça devient un enfer (foutues <a href="https://rubygems.org/" hreflang="en" title="Rubygems">Gems</a> <img src="/dotclear/themes/chestnut/smilies/aww.gif" alt=":-C" class="smiley" /> ). Hormi, ce fait, il faut installer des serveurs <a href="http://www.elasticsearch.org/" hreflang="en" title="ElasticSearch">ElasticSearch</a> et <a href="http://redis.io/" hreflang="en" title="Redis">Redis</a>, sans oublier <a href="http://logstash.net/" hreflang="en" title="LogStash">LogStash</a> qui a pour tâche d'expédier les flux qui vont bien là où il faut ; bref, un beau foutoir à configurer. Pour simplifier l'installation de toutes les machines, j'ai donc créé un module <q>kibana</q> pour <em>Puppet</em> et c'est ce module qui se chargera de tout installer.<br />
On télécharge donc les fichiers du module de classe et on les charge sur <em>sophie</em> grâce à <em>Subversion</em> :</p>
<pre>
[jbl@bulow ~]$ wget http://www.jesuisungeek.com/public/files/rhel/kibana-puppet.tar.gz -O - | tar zxvf - -C /répertoire/dépot/svn/local
[jbl@bulow ~]$ cd /répertoire/dépot/svn/local
[jbl@bulow local]$ svn add kibana && svn commit
</pre>
<p><div class="dcnote noteimportant">
<p>Dans le cas où, comme indiqué plus haut, il est impossible de télécharger à partir d'Internet sur notre client SVN, les fichiers d'archives sont attachés à ce post. Dans ce cas, il suffit de transférer et tout décompresser dans le répertoire du dépot SVN local avant de l'ajouter à SVN</p>
</div>
Grâce à la magie des <em>hooks</em>, le serveur SVN a été mis automatiquement à jour et il ne reste plus qu'à mettre à jour les modules gérés par <em>Foreman</em>. Pour cela, sur le <em>Foreman</em> de <em>sophie</em></p>
<ol>
<li>Dans les options, choisir l'option <q>Puppet Classes</q>, puis cliquer sur <q>Import</q> pour ajouter la nouvelle classe <code>kibana</code>.</li>
<li>Ajouter la classe <q>kibana</q> à <code>sophie</code></li>
<li>Ajouter la classe <q>kibana::server</q> à <code>charlotte</code></li>
<li>Aller dans <em>Global Parameters</em> et ajouter une variable <q>kibana_server</q> (ici : 192.168.1.48)</li>
</ol>
<p><a href="http://www.jesuisungeek.com/public/pictures/real/kibana_-_puppetclass.png" title="Foreman - Puppet classes"><img src="http://www.jesuisungeek.com/public/pictures/real/.kibana_-_puppetclass_m.jpg" alt="Foreman - Puppet classes" style="display:block; margin:0 auto;" title="Foreman - Puppet classes, fév. 2013" /></a>
Il ne reste plus qu'à déployer les classes demandés sur <em>charlotte</em> et <em>sophie</em>. Toutefois, les deux serveurs échangeront les informations à logguer via <em>Redis</em>, ne pas oublier d'ouvrir le port nécessaire (ici <q>161</q>) en ajoutant une nouvelle règle pour <em>iptables</em> dans <code>/etc/sysconfig/iptables</code>.</p>
<pre>
-A INPUT -m state --state NEW -m tcp -p tcp --dport 161 -j ACCEPT
</pre>
<p>Ensuite, il ne reste qu'à relancer l'agent <em>Puppet</em> sur les deux serveurs</p>
<pre>
[root@charlotte etc]# puppetd -t
[root@sophie etc]# puppetd -t
</pre>
<p>Après que <em>Puppet</em> ait déroulé les informations de modification de configuration, il suffit d'attendre quelqus minutes (le temps que l'ensemble des logs commence à être remonté) pour se connecter à <code>http://charlotte:8080</code> pour constater le bon fonctionnement de l'ensemble.<br />
<a href="http://www.jesuisungeek.com/public/pictures/real/kibana_-_logs.png" title="Kibana - Fonctionnement"><img src="http://www.jesuisungeek.com/public/pictures/real/.kibana_-_logs_m.jpg" alt="Kibana - Fonctionnement" style="display:block; margin:0 auto;" title="Kibana - Fonctionnement, fév. 2013" /></a></p>http://www.jesuisungeek.com/index.php?post/2013/02/11/Installer-Kibana-par-Puppet-%285/5%29#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/223Modification sur le disque d'une VM Linuxurn:md5:102e7c29da68639635befbdacc031e702013-02-05T12:16:00+01:002014-04-07T13:10:00+02:00Jean-Baptiste LangloisGeekerieslinuxlvmvmware<p>Méthode pour redimensionner un <em>physical disk</em> d'un Linux sans redémarrer la VM.</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/vmware-workstation.png" alt="WMWare Workstation - Logo" style="float:left; margin: 0 1em 1em 0;" title="WMWare Workstation - Logo, fév. 2013" />A la création d'une VM, on décide souvent d'une taille de disques qu'on juge comme <strong>largement</strong> suffisant. Sauf que, peu importe la taille décidée, celle-ci n'est jamais suffisante, et on en vient à vouloir profiter des avantages conjoints de la virtualisation (je parle ici de <em>VMWare</em> mais ça devrait fonctionner avec n'importe lequel des concurrents) et de <a href="http://sourceware.org/lvm2/" hreflang="en" title="LVM2 Resource Page">LVM</a>. Le processus est simple : On arrête la VM, on agrandit le disque et on redémarre la VM et paf ! le <em>physical disque</em> est correctement redimensionné, agrandissant par la même occasion la taille disponible sur le <em>volume group</em>. Mais parfois, on veut agrandir le <em>physical disk</em> de la VM sans pour autant arrêter le service (dans le cas de serveur de prod, par exemple).<br />
Voilà donc la marche à suivre<br /></p>
<ul>
<li>Dans le programme de virtualisation Hôte (j'ai testé pour VMWare, mais normalement, c'est partout pareil... Quoi que <em>VirtualBox</em>...), modifier à la hausse la taille du disque désiré.</li>
<li>Démonter tous les systèmes de fichiers qui sont montés sur ce disque. Si toi aussi, tu es un <q>warrior qui est ouf dans sa tête</q>, tu peux t'amuser à balancer un bon <code>umount -a</code></li>
<li>Dans le Linux <em>guest</em>, il faut saisir la commande <code>echo 1 > /sys/block/sdb/device/rescan</code> où <q>sdb</q> représente le disque concerné (ça peut être tout aussi bien <q>sda</q>, par exemple). <em>/sys/block/sdb/device/rescan</em> est un fichier spécial et l'appelle de celui-ci aura pour effet de rescanner le disque concerné, comme l'OS le fait au démarrage. Pratiquement :</li>
</ul>
<pre>
root@linux-prod:~# fdisk -l /dev/sdb
Disk /dev/sdb: 32.2 GB, 34574486733 bytes
64 heads, 32 sectors/track, 32768 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
root@linux-prod:~# echo 1 > /sys/block/sdb/device/rescan
root@linux-prod:~# fdisk -l /dev/sdb
Disk /dev/sdb: 34.4 GB, 36936718746 bytes
64 heads, 32 sectors/track, 32768 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
</pre>
<ul>
<li>Le changement de taille ayant été bien pris en compte, il ne reste plus qu'à redimensionner le <em>physical disk</em> (avec <code>pvresize</code>) et constater son augmentation de taille.</li>
</ul>
<pre>
root@linux-prod:~# pvdisplay /dev/sdb
--- Physical volume ---
PV Name /dev/sdb
VG Name data_vg
PV Size 30.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 7679
Free PE 179
Allocated PE 7500
PV UUID RioeiT-5HnL-eOhh-33xd-uiy2-FzjJ-puERws
root@linux-prod:~# pvresize /dev/sdb
root@linux-prod:~# pvdisplay /dev/sdb
--- Physical volume ---
PV Name /dev/sdb
VG Name data_vg
PV Size 32.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 8191
Free PE 691
Allocated PE 7500
PV UUID RioeiT-5HnL-eOhh-33xd-uiy2-FzjJ-puERws
</pre>
<ul>
<li>Le <em>volume group</em> ayant été étendu par la même occasion (du moins dans le cas de cas : <q>1 PV = 1 VG</q>, dans le cas contraire, <code>vgextend</code> est ton ami...), il ne reste plus qu'à remonter tous les systèmes de fichiers et que même si t'es pas <q>warrior qui est ouf dans sa tête</q>, tu peux faire un <code>mount -a</code>, ça sera toujours plus rapide que de tout remonter à la main...</li>
</ul>http://www.jesuisungeek.com/index.php?post/2013/02/05/Redimensionner-le-disque-d-une-VM-Linux-sans-red%C3%A9marrer#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/222Installer Kibana par Puppet (4/5)urn:md5:d679ca8b0018e44611531f2d56e4f85b2013-02-04T15:15:00+01:002013-02-11T15:50:50+01:00Jean-Baptiste LangloisBidouillesforemangpllinuxmrepopuppetRed Hatsvn<p>Dans cette partie, on s'occupe du <em>versioning</em> des modules Puppet via SVN</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/kibana-logo.png" alt="kibana-logo" style="float:left; margin: 0 1em 1em 0;" title="kibana-logo, janv. 2013" /></p>
<ul>
<li><strong>Installation et configuration de <a href="http://subversion.tigris.org/" hreflang="en" title="Subversion">Subversion</a></strong><br /></li>
</ul>
<p>Il ne reste plus qu'à configurer notre serveur Subversion. Celui-ci permettra de mettre à jour plus facilement les modules puppet à partir de machines clients et de garder une trace des modifications apportées aux fichiers. Afin de gagner du temps dans la configuration, tout comme <em>Puppermaster</em>, <em>Foreman</em> et <em>MRepo</em>, celui-ci fonctionne grâce à <em>Apache</em> via le module <strong>SVN/WebDAV</strong>. Pource faire, on commecne tout d'abord par installer les packages nécessaires :<br /></p>
<pre>
[root@sophie conf.d]# yum -y -q install subversion mod_dav_svn
</pre>
<p>L'installation du package <em>mod_dav_svn</em> va, au passage, créé un fichier de configuration pour <em>Apache</em>. Dès lors, il n'y a qu'à le modifier :</p>
<pre>
[root@sophie conf.d]# cat >> /etc/httpd/conf.d/subversion.conf << EOF
<Location /svn>
DAV svn
SVNPath /var/svn
AuthType None
</Location>
EOF
</pre>
<p>Il ne reste plus qu'à affecter les droits du dépot SVN à l'utilisateur <strong>apache</strong> puisqu'à travers WebDAV, c'est cet utilisateur qui gérera l'envoi et le téléchargement des données du dépot :</p>
<pre>
[root@sophie conf.d]# mkdir -p /var/svn
[root@sophie puppet]# chown -R apache:apache /var/svn/*
[root@sophie puppet]# chmod -R 775 /var/svn/*
[root@sophie conf.d]# service httpd restart
[root@sophie conf.d]# svnadmin create /var/svn
</pre>
<p>Maintenant que <em>Subversion</em> est installé, il faut créer le dépot local et y déposer les premiers modules développés. Ces modules sont ceux qui ont été créés par <em>Foreman</em> et se situe par défault dans le répertoire <code>/etc/puppet/modules</code>. On peut très bien imaginer prendre le répertoire <code>/etc/puppet</code> comme racine pour <em>Subversion</em>, mais on devra alors se farcir les fichiers de configuration de Puppet. Le plus propre est donc de mettre tous les modules dans un répertoire <code>/etc/puppet/svn</code> qui deviendra notre racine <em>Subversion</em>.</p>
<pre>
[root@sophie puppet]# mkdir /etc/puppet/svn/
[root@sophie puppet]# mv /etc/puppet/modules/ /etc/puppet/svn/
[root@sophie puppet]# chown -R apache:apache /etc/puppet/svn/
[root@sophie puppet]# chmod -R 775 /etc/puppet/svn/
</pre>
<p>Tout est prêt pour envoyer la liste des module vers le serveur <em>Subversion</em>. Toutefois, comme <em>Subversion</em> est généré à travers <em>Apache</em>, il faut que ce soit l'utilisateur Apache qui est tous les droits sur le serveur SVN. Pour ce faire, il faut que l'utilisateur <strong>apache</strong> ajoute les modules au dépot :</p>
<pre>
[root@sophie puppet]# su apache -s /bin/sh
sh-4.1$ svn co http://sophie/svn /etc/puppet/svn/
sh-4.1$ cd /etc/puppet/svn/ && svn add * && svn commit
sh-4.1$ exit
</pre>
<p>Les données étant dorénavant correctement envoyés au serveur, n'importe quel serveur peut télécharger et modifier ces modules, sous couvert que le dit serveur ait accès au port 80 du serveur Foreman/Puppet/MRepo/SVN (ca commence à faire long <img src="/dotclear/themes/chestnut/smilies/ouch.gif" alt=":-s" class="smiley" /> ). A-t'on fini ?? NON ! Ne surtout pas qu'on a modifié la configuration du serveur puppet ; les modules, auparavant dans <code>/etc/puppet/</code>, sont maintenant dans <code>/etc/puppet/svn/</code> et il faut donc l'indiquer dans le fichier de configuration de Puppet, puis le redémarrer :</p>
<pre>
[root@sophie puppet]# sed -i "s@/etc/puppet/modules@/etc/puppet/svn/modules@g" /etc/puppet/puppet.conf
[root@sophie puppet]# service puppet restart
</pre>
<p><br /></p>
<ul>
<li><strong>Mises à jour automatiques de <em>Subversion</em></strong><br /></li>
</ul>
<p>Waow, c'est cool, on a un serveur <em>Subversion</em> flambant et ça claque ! Mais dans les faits, si à chaque modification d'un utilisateur, l'administrateur est obligé de se connecter pour balancer un <code>svn update</code> dans <em>/etc/puppet/svn</em>, non seulement c'est pas pratique mais la mauvaise humeur de l'admin va aller croissante avec le nombre de développeurs... Le mieux, ça serait de pouvoir mettre à jour automatiquement le répertoire des modules Puppet dès qu'un <code>svn commit</code> est soumis par un des utilisateurs. Pour cela nous avons utilisé les <q>hooks</q> de <em>Subversion</em> qui (contrairement au capitaine éponyme qui sert à rien) permettent de déclencher des actions au moment de certains événements. Dans notre cas, <ins>après</ins> qu'un <code>svn commit</code> a eu, on souhaite qu'un <code>svn update</code> soit executé dans le répertoire <em>/etc/puppet/svn</em> du serveur. On va utiliser pour cela le <q>hook</q> (Rien à voir non plus à voir avec un quelconque bibliothèque d'une quelconque Université de l'Invisible) dit de <strong>post-commit</strong>.</p>
<pre>
[root@sophie hooks]# cat > /var/svn/hooks/post-commit << EOF
#!/bin/sh
cd /etc/puppet/svn
svn up
EOF
[root@sophie hooks]# chmod 775 /var/svn/hooks/post-commit
</pre>
<p><br /></p>
<ul>
<li><strong>Un <q>hook</q> pour les corriger tous (facultatif}</strong><br /></li>
</ul>
<p>Un <strong>post-commit</strong>, c'est bien, mais un <strong>pre-commit</strong>, c'est mieux ! OK, la mise à jour automatique du dépot est très pratique pour le serveur mais, comme à terme, le serveur est censé déployé un code sur tous ses clients, que se passera-t-il si le code est <ins>faux</ins> ?? La question se pose d'autant plus qu'à présent, le code est mis à jour sur le serveur <ins>sans aucune vérification</ins>. C'est pour cela que j'ai mis en place ce <q>hook</q> de <strong>pre-commit</strong> qui contrôle la syntaxe des fichiers soumis. Si celle-ci n'est pas conforme, le <em>commit</em> est interrompy jusqu'à correction du code erroné.</p>
<pre>
[root@sophie puppet]# yum -y -q install rubygem-puppet-lint
</pre>
<p>On installe donc tout d'abord <em><a href="https://github.com/rodjek/puppet-lint" hreflang="en" title="Puppet-Lint">puppet-lint</a></em> donc la seule tâche est de vérifier le code Ruby soumis pour Puppet. C'est grâce à lui que mon code Ruby sera toujours propre et joli à lire <img src="/dotclear/themes/chestnut/smilies/smile.gif" alt=":-)" class="smiley" /></p>
<pre>
[root@sophie hooks]# cat > /var/svn/hooks/pre-commit << EOF
#!/bin/sh
REPOS="\$1"
TRANS="\$2"
for FILE in \$(svnlook changed -t "\$TRANS" "\$REPOS" | cut -b 5-); do
if [ "\${FILE: -3}" == '.pp' ]; then
svnlook cat -t "\$TRANS" "\$REPOS" "\$FILE" > /tmp/puppet-lint.check
puppet-lint --no-autoloader_layout-check /tmp/puppet-lint.check >&2
RETVAL=\$?
rm -f /tmp/puppet-lint.check
if [ \$RETVAL -ne 0 ]; then
echo "Commit error: Syntax error in \$FILE" >&2
exit 1
fi
fi
done
exit 0
EOF
[root@sophie manifests]# chmod 775 /var/svn/hooks/pre-commit
</pre>http://www.jesuisungeek.com/index.php?post/2013/02/04/Installer-Kibana-par-Puppet-partie-4#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/221Installer Kibana par Puppet (3/5)urn:md5:6d5106ffe42df55defb5431f8f2afa1a2013-02-03T13:45:00+01:002013-02-11T16:07:01+01:00Jean-Baptiste LangloisBidouillesgpllinuxmrepopuppetRed Hat<p>Installation du serveur MRepo avec en prime la configuration pour Apache !</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/kibana-logo.png" alt="kibana-logo" style="float:left; margin: 0 1em 1em 0;" title="kibana-logo, janv. 2013" />Si on regarde un peu les commentaires qu'on peut trouver sur le site de <a href="http://kibana.org" hreflang="en" title="Kibana">Kibana</a>, on remarquera que tout le monde s'accorde à dire que c'est super simple à installer. Seulement, voilà : quand on a accès à Internet à partir de son serveur, oui, c'est simple. Mais quand on n'a pas de réseau (comme c'est souvent le cas dans un réseau d'entreprise), ça devient un enfer : les librairies ne correspondent pas, des dépendances manquants sont encore à télécharger, impossible de trouver une source correcte pour <q>bundler</q>, ... De surcroit, même avec le réseau, si l'objectif est de faire un module Puppet, les commandes de téléchargement et de compilation font qu'il est quasi-impossible d'écrire un module (ou tout du moins, d'écrire un module <ins>propre</ins>). C'est pour tout cela que j'ai créé des RPMs pour toutes les dépendances et fichiers nécessaires !<br /></p>
<ul>
<li><strong>Installation de <a href="http://dag.wieers.com/home-made/mrepo/" hreflang="en" title="MRepo">MRepo</a></strong><br /></li>
</ul>
<p>Bien entendu, même avec des RPMs, il faut pouvoir les diffuser jusqu'au serveur sur lequel kibana doit être installé. C'est à cet effet que j'installe MRepo qui permet de créer son propre dépôt de RPM local. C'est à travers ce dépot que seront installés les RPMs nécessaires au projet.<br />
Tout d'abord, on installe les packages nécessaires :</p>
<pre>
[root@sophie ~]# yum -y -q install createrepo mrepo
</pre>
<p>Par défaut, un répertoire <em>/etc/mrepo.conf.d</em> est créé pour y stocker la configuration de nos sources de dépôt. C'est donc là qu'on y copie notre fichier de configuration de notre dépôt <em>kibana</em> :</p>
<pre>
[root@sophie mrepo.conf.d]# cat > /etc/mrepo.conf.d/kibana.conf << EOF
[kibana]
name = Kibana for \$arch
arch = x86_64
metadata = repomd repoview
kibana = file:///var/data/mrepo/kibana
EOF
</pre>
<p>Il faut comprendre de ce fichier de configuration qu'un dépot nommé <em>kibana</em> sera créé à partir des RPMs trouvés dans <em>/var/data/mrepo/kibana</em>. On crée donc ce répertoire et on y télécharge les RPMs nécessaires :</p>
<pre>
[root@sophie mrepo.conf.d]# mkdir -p /var/data/mrepo
[root@sophie mrepo.conf.d]# wget http://www.jesuisungeek.com/public/files/rhel/kibana-repo.el`facter lsbmajdistrelease`.tar.gz -O - | tar zxvf - -C /var/data/mrepo
[root@sophie mrepo.conf.d]# chown -R apache:apache /var/mrepo/kibana-x86_64/kibana/
[root@sophie mrepo.conf.d]# chmod -R 755 /var/mrepo/kibana-x86_64/kibana/
</pre>
<p><div class="dcnote noteclassic">
<p>L'instruction utilisé dans le <em>wget</em> <code>facter lsbmajdistrelease</code> renvoie <strong>5</strong> pour une <em>CentOS 5</em> (ou <em>RHEL 5</em>) et <strong>6</strong> pour une <em>CentOS 6</em> (ou <em>RHEL 6</em>). Cela permet de télécharger uniquement le bon jeu de RPMs.</p>
</div>
<div class="dcnote noteimportant">
<p>Dans le cas où, comme indiqué plus haut, il est impossible de télécharger à partir d'Internet sur le serveur sur lequel on souhaite installer <em>Kibana</em>, les fichiers d'archives sont attachés à ce post. Dans ce cas, il suffit de transférer et tout décompresser dans le répertoire <em>/var/data/mrepo</em></p>
</div>
Il ne reste plus qu'à générer le dépôt désiré :</p>
<pre>
[root@sophie mrepo.conf.d]# mrepo -ugv
</pre>
<p>Normalement, si tout se passe bien, on obtient un affichage comme celui-ci :</p>
<pre>
kibana-x86_64: Updating Kibana for x86_64
kibana-x86_64: Mirror packages from file:///var/data/mrepo/kibana to /var/mrepo/kibana-x86_64/kibana
kibana-x86_64: Repository kibana changed (new: 24, removed: 0)
kibana-x86_64: Distribution updated (new: 24, removed: 0)
Sending mail to: root@localhost
kibana-x86_64: Generating Kibana for x86_64 meta-data
mrepo: kibana-x86_64: Version of createrepo could not be found. Assuming newer than 0.4.6.
kibana-x86_64: Create repomd repository for kibana
</pre>
<p>Où on voit bien apparaitre que 24 nouveaux packages ont été ajoutés au dépot (ce qui correspond au nombre des RPMs téléchargés). Le dépôt étant bien généré, il faut à présent, modifier la configuration de Apache pour que les machines clients puissent télécharger les RPMs désirés par HTTP. Par convention, j'ai décidé d'affecter le port 8080 au MRepo, mais n'importe quel autre port fera l'affaire. Dans tous les cas, il ne pas oublier d'autoriser les flux entrants vers ce port.<br />
Dans mon vas, j'ai ajouté la ligne suivante au fichier <em>/etc/sysconfig/iptables</em> :</p>
<pre>
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
</pre>
<p>Pour en revenir à MRepo, la modification est assez simple : en effet, l'installation du RPM de MRepo a ajouté des fichiers de configuration dans le répertoire <em>/etc/httpd/conf.d</em> donc il n'y a plus qu'à les modifier :</p>
<pre>
[root@sophie conf.d]# cat >> /etc/httpd/conf.d/mrepo.conf << EOF
Listen 8080
<VirtualHost sophie:8080>
DocumentRoot /var/www
</VirtualHost>
EOF
</pre>
<p>Et bien, entendu, ne pas oublier de redémarrer Apache, de façon pour que la nouvelle configuration soit prise en compte :</p>
<pre>
[root@sophie conf.d]# service httpd restart
</pre>
<p>En se connectant à l'adresse <code>http://sophie:8080/mrepo</code>, on peut voir désormais naviguer parmi l'arborescence du dépôt.
<img src="http://www.jesuisungeek.com/public/pictures/real/.kibana-mrepo_m.jpg" alt="MRepo configuré" style="display:block; margin:0 auto;" title="MRepo configuré, fév. 2013" /><br /></p>http://www.jesuisungeek.com/index.php?post/2013/02/03/Installer-Kibana-par-Puppet-partie-3#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/220Installer Kibana par Puppet (2/5)urn:md5:a5ae3b2157af088114ee0ee01a24a7c92013-02-01T13:23:00+01:002013-02-11T16:04:21+01:00Jean-Baptiste LangloisBidouillesforemangpllinuxpuppetRed Hat<p>Suite de nos avantures sur l'installation d'un serveur centralisé de log</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/kibana-logo.png" alt="kibana-logo" style="float:left; margin: 0 1em 1em 0;" title="kibana-logo, janv. 2013" />Suite de nos aventures avec, aujourd'hui, la configuration de Foreman et Puppet sur <strong>sophie</strong>.<br />
<br /></p>
<h3><ins><strong>Un peu de sécurité</strong></ins><br /></h3>
<p><br /></p>
<ul>
<li><strong>Ajout de règles <a href="http://www.netfilter.org/projects/iptables/" hreflang="fr" title="iptables">iptables</a></strong><br /></li>
</ul>
<p>Au terme de l'installation de Foreman, il faudrait que le service Web soit accessible de <strong>bulow</strong> car c'est plus facile d'avoir de gérer une interface Web avec un navigateur moderne plutôt qu'un truc en ligne de commande comme <em><a href="http://lynx.browser.org/" hreflang="en" title="Lynx Browser">lynx</a></em> (En plus, je suis pas sûr que <em>lynx</em> et l'Ajax soient très copains...) donc il va falloir permettre les connexions extérieures à <strong>sophie</strong>.<br />
Pour ce faire, il faut ajouter les lignes suivantes dans le fichier <code>/etc/sysconfig/iptables</code> :</p>
<pre>
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
</pre>
<p><div class="dcnote noteimportant">
<p>Attention à bien ajouter ces lignes <ins>avant</ins> l'instruction COMMIT car, dans le cas contraire, elles ne seront pas prises en compte</p>
</div>
Ne pas oublier de rédemarrer pour appliquer la nouvelle configuration :</p>
<pre>
[root@sophie foreman]# service iptables restart
</pre>
<ul>
<li><strong>Désactivation de <a href="http://doc.fedora-fr.org/wiki/SELinux" hreflang="fr" title="SELinux">SELinux</a></strong><br /></li>
</ul>
<p>Dans le même ordre d'idées, <a href="https://www.phusionpassenger.com/" hreflang="en" title="Phusion Passenger">Passenger</a> et SELinux n'étant pas très enclins à se faire des bisous, j'ai désactivé SELinux. Si quelqu'un trouve une meilleure péthode, je suis tout ouïe...<br /></p>
<pre>
[root@sophie httpd]# echo 0 >/selinux/enforce
[root@sophie httpd]# cat > /etc/selinux/config << EOF
SELINUX=disabled
SELINUXTYPE=targeted
EOF
</pre>
<p><br /></p>
<h3><ins><strong>Attaquons les choses sérieuses !</strong></ins><br /></h3>
<p><br />
Bon, voilà que les prérequis sont là, on va pouvoir attaquer les choses sérieuses et installer Puppet et Foreman. En fait, si on se réfère au site de Foreman, on comprend que ce qui est nommé <a href="http://theforeman.org/manuals/1.1/quickstart_guide.html" hreflang="en" title="Foremand installer">installeur</a> est en fait une ligne d'instruction permettant de télécharger et d'installer Foreman grâce à Puppet. Ainsi, la première chose à faire est de s'occuper de Puppet.<br />
<br /></p>
<ul>
<li><strong>Installation de <a href="http://www.mysql.fr/" hreflang="fr" title="MySQL">MySQL</a></strong><br /></li>
</ul>
<p>C'est pour cela qu'on installe... MySQL !! En effet, tant Puppet que Foreman ont besoin d'une base de données pour enregistrer leur configuration, donc on a, avant toute chose, besoin d'une base de données. A noter que <em>sqllite</em> fait aussi l'affaire mais je ne connais pas du tout ce SGBDR (D'ailleurs, c'est un SGBDR ?? <img src="/dotclear/themes/chestnut/smilies/ouch.gif" alt=":-s" class="smiley" /> )<br />
Du coup, on commence par un petit :</p>
<pre>
yum install mysql-server
</pre>
<p>Suivi d'un non moins utile :</p>
<pre>
mysqladmin -u root password 'MotDePasseTropBienDeLaMort'
</pre>
<p>car, à l'installation (et alors là, ça dépend de : la version, du packageur <ins>et</ins> de l'âge du capitaine !), il arrive que le mot de passe <code>root</code> ne soit pas (ou mal) défini, donc c'est mieux de le resaisir. A noter que j'ai pris <q>MotDePasseTropBienDeLaMort</q> comme mot de passe parce que j'aime trop les blagues trop LOL, mais on est libre de choisir n'importe quel autre mot de passe (tel que <q>Pastis51</q> ou encore <q>Biere1664</q>). Il ne reste plus qu'à créer la base de données pour <em>puppet</em> ainsi que l'utilisateur qui aura le droit de se connecter à cette base :</p>
<pre>
[root@puppet ~]# mysql -u root -p
mysql> CREATE DATABASE puppet;
mysql> GRANT ALL ON puppet.* TO puppet@localhost IDENTIFIED BY 'MotDePasseTropBienDifferentDeRoot';
</pre>
<p><br /></p>
<ul>
<li><strong>Installation de <a href="https://puppetlabs.com/" hreflang="en" title="PuppetLabs">Puppet</a></strong><br /></li>
</ul>
<p>Histoire de ne pas réinventer la roue, on peut gagner du temps en installant directement les RPMs existants de Puppet. Comme les RPMs sont packagés par EPEL, on ajoute ce dépot :</p>
<pre>
[root@sophie yum.repos.d]# cat /etc/yum.repos.d/epel.repo
[epel]
name=epel
baseurl=http://mirrors.ircam.fr/pub/fedora/epel/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=http://mirrors.ircam.fr/pub/fedora/epel/RPM-GPG-KEY-EPEL-6
</pre>
<p>Puis on installe les outils nécessaires :</p>
<pre>
[root@sophie yum.repos.d]# yum -y -q install puppet-server puppet
</pre>
<p>Bon, avec le jeu des dépendances, <em>puppet</em> <q>seul</q> n'est pas installé. <a href="http://augeas.net/" hreflang="en" title="Augeas">Augeas</a> et <a href="http://projects.puppetlabs.com/projects/facter" hreflang="en" title="Facter">Facter</a> font partie de la bande, aussi, hein (Facter est d'ailleurs fondamental pour l'installation de Foreman). Il ne reste plus qu'à configurer <em>puppet</em> de façon à ce qu'il puisse stocker la configuration de chaque client dans notre toute nouvelle et pimpante base de données MySQL. <br />
Pour ce faire, il éditer le fichier /etc/puppet/puppet.conf, puis repérer la partie débutant par <code><a href="http://www.jesuisungeek.com/index.php?post/2013/02/01/master" title="master">master</a></code> et y ajouter les lignes suivantes (En prenant soin, bien entendu de faire correspondre <q>MotDePasseTropBienDifferentDeRoot</q> avec le mot de passe défini pour l'utilisateur <em>puppet</em> dans la base de données éponyme).<br /></p>
<pre>
storeconfigs = true
dbadapter = mysql
dbuser = puppet
dbpassword = MotDePasseTropBienDifferentDeRoot
dbserver = localhost
dbsocket = /var/lib/mysql/mysql.sock
</pre>
<p><br /></p>
<ul>
<li><strong>Installation de <a href="http://theforeman.org/" hreflang="en" title="Foreman">Foreman</a></strong><br /></li>
</ul>
<p>MySQL est fonctionnel, Puppet se porte comme un charme, le grand moment est arrivé 8-) ! Installons Foreman!<br />
Comme indiqué précédemment, Foreman nécessite une installation correct de Puppet car c'est au travers de ce dernier qu'il s'installe. En effet, l'installeur (tel qu'il est appelé), télécharge dans un premier temps les packages nécessaire à partir de Git, puis applique la configuration grâce à Puppet.</p>
<pre>
export MODULE_PATH="/etc/puppet/modules/common"
mkdir -p $MODULE_PATH
for mod in apache foreman foreman_proxy git passenger puppet tftp xinetd; do
mkdir -p $MODULE_PATH/$mod
wget http://github.com/theforeman/puppet-$mod/tarball/master -O - | tar xzvf - -C $MODULE_PATH/$mod --strip-components=1
done;
</pre>
<p><div class="dcnote notetip">
<p>Dans le cas où l'on doit réaliser une installation de Foreman <ins>sans</ins> réseau, il faut télécharger les fichiers suivants :</p>
<pre>
http://github.com/theforeman/puppet-apache/tarball/master
http://github.com/theforeman/puppet-foreman/tarball/master
http://github.com/theforeman/puppet-foreman_proxy/tarball/master
http://github.com/theforeman/puppet-git/tarball/master
http://github.com/theforeman/puppet-passenger/tarball/master
http://github.com/theforeman/puppet-puppet/tarball/master
http://github.com/theforeman/puppet-tftp/tarball/master
http://github.com/theforeman/puppet-xinetd/tarball/master
</pre>
<p>et les décompresser dans le répertoire <code>/etc/puppet/modules/common</code> du serveur Puppet.
</p>
</div>
Il ne reste plus qu'à faire executer les fichiers de configuration par Puppet :</p>
<pre>
echo include puppet, puppet::server, foreman, foreman_proxy | puppet apply --modulepath /etc/puppet/modules/common
</pre>
<p>La bécane devrait turbiner pendant quelques minutes, affichant de temps en temps des jolis messages en couleurs (tant que c'est que du bleu, c'est bon <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /> ).
<div class="dcnote notewarning">
<p>
Si le programme sort avec une erreur indiquant qu'il n'arrive pas à trouver le Fact <code>fqdn</code>, éditer le fichier <code>/etc/syconfig/network</code>, puis rajouter un domaine au <em>hostname</em> (<q>.localdomain</q>, ça claque <img src="/dotclear/themes/chestnut/smilies/mdr.gif" alt=":mdr:" class="smiley" /> ), avant de redémarrer et de relancer la commande d'installation.
</p>
</div>
Durant l'installation, diverses tâches sont effectués : modification des scripts Puppet, configuration d'Apache (Foreman s'exécutant via Passenger, l'installeur configure Apache en ce sens) ou encore ajout d'un repository de RPMs pour la gestion de plugins pour Foreman. De ce fait, peu de tâches sont nécessaires en post-install. Toutefois, il faut faire s'interfacer Foreman avec l'environnement existant. Dans notre cas, il faut qu'il puisse s'enregistrer dans la base de données. <br />
On installe donc le plugin de gestion de MySQL :</p>
<pre>
[root@sophie foreman]# yum -y -q install foreman-mysql2
</pre>
<p>Puis, on lui précise les informations de connexion à la base de données précedemment créée (En prenant soin, bien entendu de faire correspondre <q>MotDePasseTropBienDifferentDeRoot</q> avec le mot de passe défini pour l'utilisateur <em>puppet</em> dans la base de données éponyme) :</p>
<pre>
[root@sophie foreman]# cat > /etc/foreman/database.yml << EOF
production:
adapter: mysql2
database: puppet
username: puppet
password: MotDePasseTropBienDifferentDeRoot
host: localhost
socket: "/var/lib/mysql/mysql.sock"
EOF
</pre>
<p><div class="dcnote noteclassic">
<p>Faire bien attention à l'identation, celle-ci est primordiale, ici !</p>
</div>
On peut alors lancer la création et le remplissage des tables, puis redémarrer Apache pour prendre en compte la nouvelle configuration de Passenger.</p>
<pre>
[root@sophie foreman]# cd /usr/share/foreman
[root@sophie foreman]# RAILS_ENV=production rake db:migrate
[root@sophie foreman]# service httpd restart
</pre>
<p>Voilà, c'est installé ! Un petit <code>http://sophie</code>, à partir de <strong>bulow</strong>, fait apparaitre la fenêtre de connexion classique de Foreman. Par défault le login est <q>admin</q> et le mot de passe est <q>changeme</q>.<br />
<br />
<img src="http://www.jesuisungeek.com/public/pictures/real/kibana-foreman.png" alt="Foreman - Login" style="display:block; margin:0 auto;" title="Foreman - Login, fév. 2013" /></p>http://www.jesuisungeek.com/index.php?post/2013/02/01/Installer-Kibana-par-Puppet-partie-2#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/219Installer Kibana par Puppet (1/5)urn:md5:d110ae4b93ba3c294f104bd4b1c3f3ca2013-01-31T10:52:00+01:002016-02-15T14:20:46+01:00Jean-Baptiste LangloisBidouillesforemangplkibanalinuxlogstashpuppet<p>Pour ceux qui souhaitent monter leur serveur de log à domicile...</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/kibana-logo.png" alt="kibana-logo" style="float:left; margin: 0 1em 1em 0;" title="kibana-logo, janv. 2013" />Je parle assez peu de mon travail... Quand on me demande "ça va le boulot ?", j'ai du mal à être précis sur mon activité réelle (ma hierarchie à deja du mal a comprendre, alors, pensez, des non-techos...)<br />
Ma tâche actuelle au travail consiste à monter un serveur centralisé de logs, projet qui me tient a cœur et ce pour plusieurs raisons :<br /></p>
<ul>
<li>Les responsables projet ayant reçu l'autorisation de se connecter directement en root, il est de bon ton de surveiller tout ce qu'ils s'amusent à faire avec le serveur<br /></li>
<li>C'est motivant !<br /></li>
</ul>
<p>En effet, au-delà de l'aspect simple de monter un serveur centralisé de logs, c'est toute l'architecture qui est à penser. Comme précédemment évoqué, mon environnement de travail se compose d'un serveur Puppet qui provisionne la configuration prévue au travers d'un serveur Foreman. Bien entendu, alors qu'il serait simple de décompresser l'archive Kibana et de la copier la ou ça va bien, c'est l'intégration à l'environnement existant qui nécessite le plus de temps.<br />
Cela faisant à présent presque 2 semaines que je travaille la-dessus, je me dis que ça serait dommage de perdre l'expérience que j'ai acquise. Alors, sous couvert de la mise en place de la même archi dans mon petit chez moi (ah là là, ces geeks ! Combien de célibataires à un serveur Foreman chez soi??), je compte partager mon expérience sous forme de HOWTO.<br />
<br /></p>
<h3><ins><strong>Infrastructure :</strong></ins><br /></h3>
<p><br />
C'est la ou le bat blesse (ça y est, on n'a pas encore commencé que je présente les faiblesses du produit... Par chance, je suis pas commercial, hein <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /> ). Même si j'ai une pelletée d'ordi a domicile, la grande majorité sont des portables et donc sont très mal adaptés à la configuration en tant que serveurs. C'est pourquoi, j'ai pas mal lutter pour définir quels serveurs les serveurs utilisés. Au final, voici les machines que j'utiliserai :</p>
<ul>
<li>A ma gauche, mon tout nouveau nouvel ordi basé sur un Core i5 et tout son stockage en SATA3. Spécialement acheté pour joué à SWTOR, il a été récémment réinstallé avec une CentOS 6.3, depuis que je ne joue plus ; Vainqueur incontesté du benchmark de Panneau de conf Windows 7, veuillez accueillir : <strong>sophie</strong> !!</li>
<li>A ma droite, caché tout au fond de mon placard dans un vieux disque dur USB2, une image virtuelle CentOS 6.1 (mis à jour pour l'occasion) s'executant au travers de VirtualBox, merci d'applaudir : <strong>charlotte</strong> !</li>
<li>Sans oublier, ce bon vieux <strong>bulow</strong> dont le role sera de jeter un oeil sur le bon fonctionnement de Kibana et qui sera le point d'entrée des sources que j'ai déjà développé.<br /></li>
</ul>
<p><br /></p>
<h3><ins><strong>Architecture :</strong></ins><br /></h3>
<p><br />
Au vu du peu de serveurs dont je dispose, les machines seront serveurs les unes des autres. Ainsi, alors que <strong>sophie</strong> sera serveur Puppet/Foreman pour <strong>charlotte</strong>, celle-ci sera le serveur Kibana pour les logs provenant de <strong>sophie</strong>.<br />
<img src="http://www.jesuisungeek.com/public/pictures/real/kibana-archi1.png" alt="kibana-archi1.png" style="display:block; margin:0 auto;" title="Architecture Puppet" /><br />
La configuration (déjà créé, je la joindrais aux posts concernés, histoire de ne pas réinventer la roue <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /> ) sera envoyé sur <strong>sophie</strong> à partir de <strong>bulow</strong> Cette configuration sera appliqué au serveur Foremand qui "demandera" à Puppet de la déployer sur <strong>charlotte</strong>. Cette configuration créera un nouveau <em>repository</em> local (à partir du MRepo de <strong>sophie</strong>) à partir duquel sera téléchargé les packages de Kibana et ses petits copains.<br />
<img src="http://www.jesuisungeek.com/public/pictures/real/kibana-archi2.png" alt="kibana-archi2.png" style="display:block; margin:0 auto;" title="Architecture Kibana" /><br />
Une fois la configuration prévue sera déployé (client sur <strong>sophie</strong> et serveur sur <strong>charlotte</strong>), Logstash récupérera les logs de syslog de <strong>sophie</strong> et l'enverra à Redis sur <strong>charlotte</strong>. Ces logs seront envoyés par ce même Logstash vers Elasticsearch auquel se connecte Kibana pour afficher les logs récupérés sur son interface Web.</p>http://www.jesuisungeek.com/index.php?post/2013/01/31/Installer-Kibana-par-Puppet-partie-1#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/218Liens utiles pour Puppeturn:md5:fc4b01c2f412aa8e5b49734dc507247c2012-11-02T13:45:00+01:002012-11-02T14:03:19+01:00Jean-Baptiste LangloisGeekeriesforemangpllinuxmacpuppetrubywindows<p>Quelques ressources pour Puppet qui m'ont été bien utile dans mon boulot...</p> <p><img src="http://www.jesuisungeek.com/public/pictures/divers/.puppet_labs_400_s.jpg" alt="puppet_labs_400.png" style="float:left; margin: 0 1em 1em 0;" title="puppet_labs_400.png, nov. 2012" />Actuellement en prestation chez Total, je travaille principalement sur Puppet et Foreman, logiciels libres que je ne connaissais pas avant de venir ici.<br />Puppet, qu'est-ce que c'est ?? Selon <a href="http://fr.wikipedia.org/wiki/Puppet" hreflang="fr">Wikipedia</a> :</p>
<blockquote><p>Puppet est un logiciel libre permettant la gestion de la configuration de serveurs esclaves (Linux, Mac OS X et Windows).</p></blockquote>
<p>En fait, même si c'est exact, cette explication ne permet pas de montrer les avantages de <a href="http://www.puppetlabs.com/" hreflang="en">Puppet</a> sur d'autres gestionnaires de configuration (En outre, ce n'est pas que limité à ces OS ; personnellement, je l'utilise aussi pour AIX...)<br />
En fait, le gros avantage du Puppet est qu'il est développé en Ruby et de nombreux modules et type de données peuvent être ajoutés (aujourd'hui, on utilise un module pour <em>Control-M</em>, <em>Oracle</em>, ou encore <em>SAP</em>). Les services et les utilisateurs étant gérés nativement (ainsi que <a href="http://docs.puppetlabs.com/references/latest/type.html" hreflang="en">d'autres</a>), personne ne peut changer son mot de passe si l'administrateur n'en est pas averti (pratique pour le mot de passe <em>root</em>, non ? <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /> ). D'autres part, un <em>daemon</em> arrêté sera automatiquement redémarré lors de la prochaine application.<br />
Ah oui, par contre, l'application de la conf s'effectuant par <code>cron</code>, si on arrête ce <em>daemon</em>, on est mal <img src="/dotclear/themes/chestnut/smilies/whistle.gif" alt=":siffle:" class="smiley" /> Mais, ça se verra sur <a href="http://theforeman.org/" hreflang="en">Foreman</a> qui sert d'interface graphique, d'applications pour Puppet mais encore d'outil d'audit. Si on sélectionne les modules devant être appelés sur une ou plusieurs machines dans Foreman, cela sera pris automatiquement en compte par Puppet.<br />
Un exemple de code Puppet (tout est en Ruby) :<br />
<img src="http://www.jesuisungeek.com/public/pictures/divers/puppet.PNG" alt="Conf SSH pour Puppet" title="Conf SSH pour Puppet, nov. 2012" /><br />
Ce code code configure, installe et contrôle SSH sur les serveurs. C'est court et facilement lisible, non ? De surcroit, avec les possibilités de Ruby, le produit est largement extensible.<br />
<br />
<ins><strong>Resources pour Puppet :</strong></ins><br /></p>
<ul>
<li><a href="http://www.puppetlabs.com/" hreflang="en">Puppetlabs</a> : Site officiel</li>
<li><a href="http://itand.me/using-puppet-to-manage-users-passwords-and-ss" hreflang="en">Fonctions de gestion des utilisateurs</a> : Plutôt qu'appliquer tout le temps un même mot de passe, ou de ne jamais appliquer de mot de passe, pourquoi ne pas le définir à la création et laisser l'utilisateur faire sa vie ?</li>
<li><a href="http://www.screenage.de/blog/2012/02/10/how-to-log-history-and-logins-from-multiple-ssh-keys-under-one-user-account-with-puppet/" hreflang="en">Connexion avec plusieurs clés SSH</a> à un seul utilisateur tout en pouvant déterminer quel utilisateur s'est connecté à partir des logs</li>
<li><a href="http://forge.puppetlabs.com/puppetlabs/lvm" hreflang="en">Puppet-LVM</a> : Uniquement pour LVM (pour l'instant)</li>
<li><a href="http://awaseroot.wordpress.com/2012/05/28/puppet-user-management-and-home-over-nfs/" hreflang="en">Petite fonction sur NFS</a></li>
<li><a href="http://projects.puppetlabs.com/projects/1/wiki/simple_text_patterns" hreflang="en">Fonction line.pp</a> permettant la modification de lignes de certains fichiers sans modifier pour autant l'intégralité du document.</li>
</ul>
<p>Personnellement, je suis en train d'en créer d'autres ou d'en améliorer certaines (notamment une classe multi-plateforme sur NFS, donc... <strong>Stay tuned</strong> <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /></p>http://www.jesuisungeek.com/index.php?post/2012/11/02/Liens-utiles-pour-Puppet#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/216Personnalisation d'Anacondaurn:md5:e25c6be428ebfc139320f39a2b40439d2012-10-01T14:52:00+02:002016-02-14T11:50:18+01:00Jean-Baptiste LangloisBidouillesAnacondaKickStartLinuxRed Hat<p>RedHat ne permettant pas la saisie des IP au format w.x.y.z/n à l'installation, voici un petit patch modifiant Anaconda</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/.red-hat-logo_s.jpg" alt="Logo Red Hat" style="float:left; margin: 0 1em 1em 0;" title="Logo Red Hat, oct. 2012" />Dans le cadre de mon travail, j'ai un besoin impérieux d'installer des machines <a href="http://www.jesuisungeek.com/index.php?tag/linux">Linux</a> rapidement. <br /><br />
Pour ce faire, quand je dois installer des serveurs Red Hat, j'utilise <a href="http://fedoraproject.org/wiki/Anaconda/Kickstart" hreflang="en">KickStart</a>. A l'instar de <a href="http://wiki.debian.org/DebianInstaller/Preseed" hreflang="en">Preseed</a>, il s'agit basiquement d'un fichier de réponse qui permet donc l'automatisation de l'installation. Actuellement très abouti, cette solution permet même l'execution de scripts de pre- et de post-install, en environnement chrooté ou non. Ainsi, une fois le fichier soumi à <a href="http://fedoraproject.org/wiki/Anaconda" hreflang="en">Anaconda</a>, l'installation se déroule sans aucun intervention humaine, ce qui est bien pratique. Le fichier <a href="http://www.jesuisungeek.com/index.php?tag/kickstart">KickStart</a> peut être soumis de plusieurs façons telles que sur une disquette ou un CD mais, dans un environnement connecté d'entreprise, la solution envisagé est souvent la soumission par réseau (FTP ou HTTP). C'est là où tout se complique car la ligne de commande à saisir au boot pour lancer une installation par KickStart via le réseau est la suivante.<br /><br />
<code>linux ip=192.168.0.1 netmask=255.255.255.0 gateway=192.168.0.254 ksdevice=eth0 ks=http://192.168.0.10/ks/fichier_ks.cfg</code><br />
<br />
Pas vraiment pratique, n'est-ce pas ? (Surtout si on le tape avec un Key-mapper en QWERTY sur un clavier AZERTY <img src="/dotclear/themes/chestnut/smilies/caca.gif" alt=":caca:" class="smiley" /> )<br />
<br />
La faute en revient à Anaconda qui ne gère que deux formats de saisie réseau :<br /></p>
<ul>
<li>Format <em>Anaconda</em> : <code>ip=192.168.0.1 netmask=255.255.255.0 gateway=192.168.0.254</code></li>
<li>Format <em>PXELinux</em> : <code>ip=192.168.0.1:192.168.0.10:192.168.0.254:255.255.255.0</code><br /></li>
</ul>
<p>Bref, dans les cas, c'est plutôt horrible à taper. D'autant que, saisir d'une part l'IP, le <em>Netmask</em> et la <em>Gateway</em>, c'est trois fois plus de chances de se tromper d'un chiffre et de planter son install. Alors que, pourtant, il existe un format plus court et moins source d'erreur !! Le format <em>Bitcount</em> !!<br />
<br />
<code>linux ip=192.168.0.1/24 ksdevice=eth0 ks=http://192.168.0.10/ks/fichier_ks.cfg</code><br />
<br />
La ligne précédente a quand même plus de gueule, non ? <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /><br />
A partir de la notation <strong>192.168.0.1/24</strong>, on détermine le <em>Network</em>, le <em>Netmask</em> et la Gateway ; que demande le peuple ??
Malheureusement, Anaconda ne le gère pas en natif... C'est pour cela que j'ai écrit un patch pour Anaconda pour que l'ISO de boot comprenne cette notation.<br />
<div class="dcnote notewarning">
<p>
La convention utilisé à mon travail consiste à prendre pour <em>Gateway</em>, la dernière IP du sous-réseau (avant le <em>Broadcast</em>). Le patch a été écrit en ce sens et il faut le modifier dans les autres cas. Pour les réseaux où la <em>Gateway</em> est toujours la première adresse du sous-réseau, il faut modifier la ligne<br />
<code>uint32_t gw = (netw | ( (~ mask) & mask32) ) - 1;</code><br />
En effet il faut la remplacer par :<br />
<code>uint32_t gw = netw + 1;</code>
</p>
</div>
</p>
<p><strong>Le HOWTO ci-dessus a été écrit et testé initialement sur Red Hat 5.x, puis complété pour Red Hat 6.x.</strong> Néanmoins, Anaconda ayant pas mal changé entre les deux, le patch a été réécrit pour Red Hat 6.x. Tous les fichiers évoqués (patch et <em>packages</em> RPM sont fournis, attachés à ce billet).<br />
<br />
Comme on parle ici de patcher Anaconda, il faut comprendre qu'on va devoir récupérer les sources de l'installeur Red Hat pour pouvoir les recompiler après modifier. Il faut donc, avant toutes choses, installer les packages de développement nécessaires à la compilation</p>
<pre># yum install anaconda yum-utils gcc make dbus-glib-devel syslinux
# yum info anaconda | grep Version</pre>
<p>La commande <code>yum info anaconda</code> renvoie un numéro de version. Celle-ci est importante car il s'agit de la version correspondant au système installé. Il faut alors télécharger les sources de <em>Anaconda</em> correspondant à la version installé.</p>
<ul>
<li>Pour RedHat 5 : <a href="http://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/" title="http://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/">http://ftp.redhat.com/pub/redhat/li...</a></li>
<li>Pour RedHat 6 : <a href="http://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/" title="http://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/">http://ftp.redhat.com/pub/redhat/li...</a></li>
</ul>
<p>Le nom du fichier recherché ressemble à <q>anaconda-xx.x.x.x-x.src.rpm</q>.<br /></p>
<p><div class="dcnote noteclassic">
<p>
Dans le cas d'une recompilation avec RedHat 6, des dépendances nécessitent l'installation de paquetages supplémentaires, à savoir :</p>
<ul>
<li>iscsi-initiator-utils-devel,</li>
<li>newt-devel, slang-devel,</li>
<li>NetworkManager-devel,</li>
<li>NetworkManager-glib-devel,</li>
<li>device-mapper-devel,</li>
<li>libudev-devel,</li>
<li>libarchive-devel,</li>
<li>isomd5sum-src</li>
</ul>
<p>Tous ces paquetages sont, pour plus de commodités, attachés à ce mail (de plus, il sera plus aisé de les obtenir d'ici quelques années).
Une fois tous les paquetages téléchargés, ne pas oublier de compiler isomd5sum.<br /></p>
<pre># cd /usr/src/redhat/SOURCES
#tar xfj isomd5sum-*.tar.bz2
# cd isomd5sum-*/
# make
# make install</pre>
<p></p>
</div>
</p>
<p>On comment par installer les pré-requis pour Anaconda puis les sources qu'on décompresse (sur RH6, les sources se trouve dans <em>/root/rpmbuild/SOURCES</em>)</p>
<pre># yum-builddep anaconda-*.src.rpm
# rpm -ivh anaconda-*.src.rpm
# cd /usr/src/redhat/SOURCES
# tar xjf anaconda-*.tar.bz2
# cd anaconda-*/ </pre>
<p>Il ne reste plus qu'à patcher le fichier loader (Pour cela, il faut au préalable avoir télécharger le patch <em>unified</em> pour Anaconda à partir de la liste des fichiers attachés à ce post.</p>
<pre># patch -p1 < /chemin/vers/patch
# ./configure
# make</pre>
<p>Pas la peine de faire <strong>make install</strong> ! On a juste besoin des binaires <code>loader</code> et <code>init</code>, pas d'un machine de développement pour Anaconda <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" />
Pour ceux qui ont la flemme ou ceux qui ignore ce qu'est une compilation, un fichier <em>tar.gz</em> contenant les fichiers <code>loader</code> et <code>init</code> correspondant chacune des versions d'Anaconda. Merci qui ??? <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /><br />
<br />
Après avoir récupéré l'initrd à partir du CD d'install de Red Hat, il faut ouvrir cette image ramdisk pour remplacer les fichiers <code>loader</code> et <code>init</code> par ceux nouvellement compilés.
<div class="dcnote noteimportant">
<p>L'initrd pour RH6 est compressé en LZMA (via <code>xz</code>) alors que celui pour RH5 est en BZip2</p>
</div>
</p>
<pre>
# mv initrd.img initrd.img.xz
# xz --format=lzma initrd.img.xz --decompress
# mkdir initrd && cd initrd
# cpio -ivdum < ../initrd.img
# cp /usr/src/redhat/SOURCES/anaconda-*/loader/loader bin/loader
# find . -print |cpio -o -H newc | xz --format=lzma > ../initrd.img
</pre>
<p>Voilà ! Dorénavant, Anaconda comprend les commandes de type <code>linux ip=x.y.z.w/n</code> au boot !! Y'a plus qu'à replacer ce nouveau initrd dans le répertoire <code>isolinux/</code> de la bonne distribution puis de créer l'ISO bootable qui va bien et hop, ça fait des Chocapic <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /></p>http://www.jesuisungeek.com/index.php?post/2012/10/01/Anaconda#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/210Ha ha ha! Hi hi hi PC!urn:md5:ac8ce4fa02890f1f88c2281b1b2dab5e2008-01-27T22:44:00+00:002012-10-07T16:50:27+00:00Jean-Baptiste LangloisGeekerieseeepclinux<p>Après un questionnement insoutenable, consistant à savoir si SFR me livrera bien mon dû, j'ai reçu mon mini ultra-portable samedi matin!</p> <p>J'étais en train de fignoler les dernières lignes de code pour la version iPhone de ce site quand le livreur est arrivé. J'ai donc pu en profiter toute la journée <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /> <br />
Première constatation (après avoir littéralement détruit l'emballage pour prendre le <em>Précieux</em> en mains, bien sûr ;) ), l'appareil est effectivement très petit ; il se porte très bien à une main (même pour taper!) et n'est pas vraiment encombrant. Par contre, le clavier est minuscule (plus encore que le trackpad) et nécessite une adaptation (en particulier la <em>ligne</em> des chiffres qui sont décalés à gauche en l'absence d'une touche). Egalement, l'écran est très petit et on se retrouve vite encombré de données si on optimise pas l'espace (Vive le mode <ins>Plein écran</ins> de Firefox <img src="/dotclear/themes/chestnut/smilies/smile.gif" alt=":-)" class="smiley" /> ). Enfin, l'OS est très réactive (allumage en moins de 20 secondes 8) ) et très personnalisable, puisque basée sur Linux. En ce sens, elle est très modulaire et de nombreuses applications peuvent être installés en dépit du bridage qu'applique SFR sur ces machines (Dieu merci, que durant les 6 premiers mois!).<br />
Voici donc le parfait compagnon pour participer à mes projets le matin dans le train, ou pour regarder un DivX. Il ne me reste plus qu'à faire activer ma ligne, afin de profiter d'Internet en 3G+.<br />
<a href="http://www.jesuisungeek.com/public/pictures/hobbies/eeepc1.JPG" title="L'EEEPC dans son emballage"><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.eeepc1_s.jpg" alt="L'EEEPC dans son emballage" title="L'EEEPC dans son emballage, jan. 2008" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/hobbies/eeepc2.JPG" title="LA bête"><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.eeepc2_s.jpg" alt="LA bête" title="LA bête, jan. 2008" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/hobbies/eeepc4.JPG" title="Ouvert"><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.eeepc4_s.jpg" alt="Ouvert" title="Ouvert, jan. 2008" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/hobbies/eeepc6.JPG" title="Connecté à un vrai bon blog"><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.eeepc6_s.jpg" alt="Connecté à un vrai bon blog" title="Connecté à un vrai bon blog, jan. 2008" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/hobbies/eeepc7.JPG" title="Dans la famille "portable", je voudrais le fils"><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.eeepc7_s.jpg" alt="Dans la famille "portable", je voudrais le fils" title="Dans la famille "portable", je voudrais le fils, jan. 2008" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/hobbies/eeepc8.JPG" title="Tagada Tagada, voilà les Dalton"><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.eeepc8_s.jpg" alt="Tagada Tagada, voilà les Dalton" title="Tagada Tagada, voilà les Dalton, jan. 2008" /></a>
<br />
Pour avoir davantage de détails sur ce petit appareil, c'est <a href="http://www.jesuisungeek.com/index.php?post/2007/08/15/85-eeepc">par ici</a>.</p>http://www.jesuisungeek.com/index.php?post/2008/01/27/92-ha-ha-ha-hi-hi-hi-pc#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/89EeePCurn:md5:cb509257a3210b3face98f8b4647e9d02007-08-15T23:41:00+00:002012-10-12T08:43:46+00:00Jean-Baptiste LangloisHobbiesdebianeeepclinuxportable <p><a href="http://www.jesuisungeek.com/public/pictures/hobbies/eee-pc.jpg" title="eee-pc.jpg"><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.eee-pc_s.jpg" alt="eee-pc.jpg" style="float:left; margin: 0 1em 1em 0;" title="eee-pc.jpg, oct. 2012" /></a>Imaginez un ordinateur ultra-portable. Imaginez-le faisant moins d'un kilo, de la taille de 2 Nintendo DS mais malgré tout disposant de 3 ports USB, un port Ethernet et n ensemble logiciel permettant de faire tout ce qu'un ordinateur est capable habituellement de faire. OK, maintenant dites un prix. Non, moins. Non, non, beaucoup moins. Allez, je vous le dis : le prix de cet appareil est de moins de 300 euros! Impressionnant, non ?<br />
C'est ASUS, le fabricant taïwanais de cartes mères qui a créé ce petit prodige. Suivant l'idée du <a href="http://fr.wikipedia.org/wiki/One_Laptop_per_Child" hreflang="en">portable à 100 dollars</a> (OLPC) pour les pays défavorisés, ASUS s'est dit qu'un portable de très petite taille et peu puissant, pouvait trouver son utilité à moindre coût. Avec une connexion Internet, ça en devient le parfait compagnon en déplacement. Les caractérisques en sont les suivantes :</p>
<ul>
<li>Ecran 7 pouces</li>
<li>Disque dur SSD de 4 Go</li>
<li>Mémoire vive : 512 Mo</li>
<li>Processeur Celeron 900 MHz</li>
<li>Webcam, micro et carte sonore intégré</li>
<li>Ports : 3 USB, un Carte SD, un Ethernet (RJ45)</li>
<li>Système d'exploitation : Xandros (Linux), Windows XP</li>
</ul>
<p>Bien entendu la machine est en Wifi. Ce n'est certes pas une <q>foudre de guerre</q> mais on lui prédit un grand avenir. La preuve ; il est déjà en rupture de stock dans tous les pays le proposant.<br />
<br />
<strong>Site officiel :</strong> <a href="http://france.asus.com" hreflang="fr">http://france.asus.com</a><br />
<strong>LE blog de référence :</strong> <a href="http://www.blogeee.net" hreflang="fr">http://www.blogeee.net</a><br />
<strong>Site de fan :</strong> <a href="http://www.eee-pc.fr/" hreflang="fr">http://www.eee-pc.fr/</a><br />
<strong>Revendeurs :</strong> <a href="http://www.ldlc.com" hreflang="fr">LDLC</a> <a href="http://www.materiel.net" hreflang="fr">Materiel.Net</a></p>http://www.jesuisungeek.com/index.php?post/2007/08/15/85-eeepc#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/82XFCEurn:md5:debf77ab95e01a4ed8affed4a107cb192006-01-01T20:16:00+00:002012-10-15T11:59:05+00:00Jean-Baptiste LangloisHobbiesgpllinuxwindow manager <p><img src="http://www.jesuisungeek.com/public/pictures/hobbies/.xfce-logo_s.jpg" alt="xfce-logo.png" style="float:left; margin: 0 1em 1em 0;" title="xfce-logo.png, oct. 2012" />XFCE est un gestionnaire de fenêtres pour X-Window. Développé par un Français (Cocorico), XFCE est un gestionnaire de fenêtres qui était, au départ, minimaliste sur GNU/Linux. Depuis, de nombreuses applets peuvent personnaliser le Dock, un ensemble de boutons pour les applications les plus utilisés. Ainsi, ce gestionnaire, très personnalisable et peu couteux en RAM, devient riche en fonctionnalité. Toutefois, il est, malgré tout, à déconseiller aux habitués de Windows car très différent à l'usure de ce dernier.<br /></p>
<p><strong>Site officiel :</strong> <a href="http://www.xfce.org" hreflang="en">http://www.xfce.org</a><br />
<strong>Thèmes :</strong> <a href="http://xfce-look.org" hreflang="en">http://xfce-look.org</a><br />
<strong>Captures d'écran :</strong> <a href="http://www.xfce.org/about/screenshots">http://www.xfce.org/about/screenshots</a></p>http://www.jesuisungeek.com/index.php?post/2006/01/01/17-xfce#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/16Houdinixurn:md5:0b8f45efba22dc00df123e97a902fb872005-05-31T12:23:00+00:002012-10-11T15:51:44+00:00Jean-Baptiste LangloisProjetsgplhoudinixlinuxlive-cdperl<p>Distribution GNU/Linux en Live-CD axé sur le développement et les débutants</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/boule.png" alt="boule.png" style="float:left; margin: 0 1em 1em 0;" title="boule.png, aou. 2008" /><br />
Houdinix est un système d'exploitation basé sur le noyau Linux (le programme central d'un système d'exploitation), et constitue ce qu'on appelle une distribution. Il a été suite à une envie d'explorer les méandres du noyau Linux en réalisant un projet qui me tenait à coeur depuis longtemps : réaliser ma propre distribution GNU/Linux.<br />
Le nom Houdinix a été trouvé car la distribution se basait sur une distribution Mandrake (à présent renommé Mandriva depuis le rachat de Connectiva et pour des raisons de droits) et que le but était de faire découvrir Linux à des gens qui ignorait son existence et pensait que <q>c'était bien trop difficile</q>. Ainsi pour les inciter à utiliser Houdinix, ce dernier a été réalisé sous forme de Live-CD c'est-à-dire qu'il suffit d'insérer son CD d'Houdinix dans sa machine, puis de l'allumer pour que le système se lance sans aucune installation ni question ésotérique. Dès lors l'utilisateur peut bénéficier d'un bureau stable où qu'il soit sans rien modifier de l'ordinateur qu'il utilise. Egalement, afin de favoriser cette utilisation nomade, un support étendue des clés USB a été rajouté afin que l'utilisateur retrouve l'apparence de son bureau quand il le souhaite.<br />
Enfin, principalement axé sur le développement, cette distribution embarque 13 langages de programmation différents.<br />
<br />
<strong>Contient :</strong><br /></p>
<ul>
<li>Noyau 2.4.24-houdinix.<br /></li>
<li>Système de fichiers compressé <a href="http://squashfs.sourceforge.net/" hreflang="en">Squashfs</a>: 2.4Go de données sur un CD de 700Mo.<br /></li>
<li>Environnement graphique KDE 3.2.<br /></li>
<li><ins>Compilateurs et interpréteurs:</ins> Basic, C, C++, Caml (ocaml), Cobol, Delphi, Fortran, Guile, Java (JDK1.4.2), Lisp (GNU clisp), Pascal, Perl (modules Gtk, Tk, Mail, ...), Prolog (gplc, gprolog), Python, Scheme (umb-scheme), Smalltalk, Tcl.<br /></li>
<li><ins>Outils scientiques :</ins> gnuplot, scilab, mupad.<br /></li>
<li><ins>Bureautique :</ins> OpenOffice.org 1.1.3, Gimp 2.0<br /></li>
<li><ins>Support Réseau :</ins> telnet, ssh, nmap, nslookup, etc...<br /></li>
<li><ins>Outils Internet :</ins> Firefox, Thunderbird, Kmail, Kopete, Konqueror, etc...<br /></li>
<li>Installation sur disque dur avec Houdinstall.<br /></li>
<li>Détection de la swap avec Houdiswap et des clés USB avec HoudiUSB.<br /></li>
</ul>
<p><a href="http://www.jesuisungeek.com/public/pictures/real/wall.jpg" title="wall.jpg"><img src="http://www.jesuisungeek.com/public/pictures/real/.wall_m.jpg" alt="wall.jpg" title="Fond d'écran, aou. 2008" /></a><br /></p>
<p><strong>Téléchargement :</strong><br /></p>
<ul>
<li>Officiel : (<strong><a href="http://www.jesuisungeek.com/index.php?post/2007/08/31/public/files/houdinix/" hreflang="fr">HTTP</a></strong>)</li>
<li>Miroir : (<strong><a href="ftp://ftp.uvsq.fr/pub/houdinix/" hreflang="fr">FTP</a></strong>)</li>
</ul>
<pre>(<strong><a href="http://www.jesuisungeek.com/index.php?post/2007/08/31/public/files/houdinix/houdihelp.html" hreflang="fr">Documentation</a></strong>)<br /></pre>http://www.jesuisungeek.com/index.php?post/2007/08/31/28-houdinix#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/27SIMS (SIMS Is a Machine Simulator)urn:md5:214b262e3b0e1501fccedc2a40cc9abb2005-01-27T16:34:00+00:002012-10-11T15:52:47+00:00Jean-Baptiste LangloisProjetsgpljavalinuxmacturingwindows<p>Logiciel d'édition et de simulation des machines de Turing à travers l'affichage d'un graphe orienté et un tableau de commandes.</p> <p><img src="http://www.jesuisungeek.com/public/pictures/real/.sims1_m.jpg" alt="sims1.jpg" title="sims1.jpg, oct. 2012" /><br />
SIMS est un autre projet qui a dû être fait pour l'Université de Cergy. Plus gros projet jamais réalisé par moi à cette époque (nous étions quatre bien que l'une des quatre ne trouva rien de mieux que de partir en Normandie faire du cheval alors que tous trimaient) ; il s'agit d'un projet d'envergure pour l'affichage, au départ, de graphes orientés, puis finalement de machines de Turing et machines à registres.<br />
Le projet demandé consistait à créer une interface graphique facile à utiliser qui puisse créer des machines à registres et de Turing et afficher leur contenu, graphes et bandes. Par la suite, un éditeur de machines a été rajouté permettant d'afficher le déplacement en temps réel de l'instruction lue par la machine et de modifier facilement les données de la machine en cours. Cet éditeur fut aussi utile dans le sujet du projet dont le but était de simuler le déplacement du curseur pour suivre l'état courant de la machine. Le sommet actif du graphe et l'état actif de la bande s'affichait ainsi en rouge. Une des grosses difficultés du problème était le principe de placement des sommets d'un graphe. En effet, il s'agit là d'un problème NP-Complet i.e. un problème sans réelle solution donnée par un ordinateur et que seul l'humain à force d'approximation peu résoudre. Le principe était donc de créer un algorithme valable de placement d'états assez fiable pour qu'on puisse croire qu'un humain avait lui-même placé les états. Je m'occupai de cet aspect du problème et le principe du placement utilisé, non seulement fiable et plutôt correct, est unique car je l'ai créé sans aucune inspiration en provenance de travaux déjà existant. Cet algorithme et ce simulateur semblait être bon car ils nous ont valu la meilleure note (19/20).<br />
<a href="http://www.jesuisungeek.com/public/pictures/real/sims2.jpg" title="Exemple de machine de Turing"><img src="http://www.jesuisungeek.com/public/pictures/real/.sims2_s.jpg" alt="Exemple de machine de Turing" title="Exemple de machine de Turing, oct. 2012" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/real/sims3.jpg" title="Editeur de machine de Turing"><img src="http://www.jesuisungeek.com/public/pictures/real/.sims3_s.jpg" alt="Editeur de machine de Turing" title="Editeur de machine de Turing, oct. 2012" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/real/sims4.jpg" title="Utilisation de l'interface"><img src="http://www.jesuisungeek.com/public/pictures/real/.sims4_s.jpg" alt="Utilisation de l'interface" title="Utilisation de l'interface, oct. 2012" /></a><br />
Pour ceux qui ne savent pas qui était Turing ou qui aimerait en savoir plus sur ce projet, je vous propose de télécharger les <a href="http://www.jesuisungeek.com/index.php?post/2007/08/30/public/files/etc/tmshow.sxi" hreflang="en">diapos</a> (format <a href="http://fr.openoffice.org" hreflang="fr">OpenOffice.org</a>) attachés avec l'application à ce billet.<br /></p>http://www.jesuisungeek.com/index.php?post/2007/08/30/29-sims-sims-is-a-machine-simulator#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/28GPAtaxxurn:md5:be9ef3c5f513ade3276e8afa5f26b5bc2004-06-26T22:12:00+00:002012-10-12T10:33:27+00:00Jean-Baptiste LangloisProjetscgataxxgnomegp32gpllinux<p>Clone d'un jeu issu des <em>gnome-games</em> disponible sur GNU/Linux à mi-chemin entre la bataille et le Othello (Réversi).</p> <p>GPAtaxx est un jeu pour la console portable GP32. Il s'agit d'un clone d'un jeu passionnant appelé gAtaxx existant pour GNU/Linux.<br />
<a href="http://www.jesuisungeek.com/public/pictures/real/gpataxx1.jpg" title="Ecran Titre"><img src="http://www.jesuisungeek.com/public/pictures/real/.gpataxx1_s.jpg" alt="Ecran Titre" title="Ecran Titre, juin 2003" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/real/gpataxx2.jpg" title="Déplacement en cours"><img src="http://www.jesuisungeek.com/public/pictures/real/.gpataxx2_s.jpg" alt="Déplacement en cours" title="Déplacement en cours, juin 2003" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/real/gpataxx3.jpg" title="Les options"><img src="http://www.jesuisungeek.com/public/pictures/real/.gpataxx3_s.jpg" alt="Les options" title="Les options, juin 2003" /></a>
<a href="http://www.jesuisungeek.com/public/pictures/real/gpataxx4.jpg" title="Fin de partie"><img src="http://www.jesuisungeek.com/public/pictures/real/.gpataxx4_s.jpg" alt="Fin de partie" title="Fin de partie, juin 2003" /></a><br /><br />
<ins>Qu'est-ce que gAtaxx ?</ins><br />
gAtaxx est un jeu qui provient du système d'exploitation alternatif GNU/Linux. On le trouve généralement assez facilement dans toutes les distributions contenant GNOME. Il fait partie du paquetage gnome-games, pour information. Pour les utilisateurs de Windows, bah... Vous pouvez toujours prendre l'émulateur GP32 et jouer à ce jeu ;-). Le but est assez simple pour ce qui connaissent le Réversi/Othello. Il faut avoir le plus de pions de sa couleur que l'adversaire sachant que l'on peut se déplacer sur les cases adjacentes et "dédoubler" son pion ou sur les cases suivantes pour le déplacer. Si des pions adverses se trouvent sur des cases adjacentes à la case d'arrivée, ils changent de couleur. Simple, non?<br />
<br />
<ins>La version GP32 : GPAtaxx</ins><br />
Bien qu'il ne contienne pas une seule ligne de code du jeu originel, GPAtaxx est distribué librement sous licence GNU/GPL. Les améliorations et les possibilités sont multiples et parfois même améliorées par rapport à l'original. Le jeu dispose d'une horloge activable ou non pour chronométrer ses parties, de différents types de pièces, de personnalisation de la table et d'autres options (plus ou moins utile comme la musique) ou la possibilité de régler le niveau de la machine en mode 1 joueur. Les contrôles du jeu sont les suivants :</p>
<ul>
<li>Bouton <strong>A</strong> : Choisir une pièce et valider son déplacement</li>
<li>Bouton <strong>B</strong> : Annuler le choix de la pièce définie</li>
<li>Bouton <strong>R</strong> : Passe son tour</li>
<li>Bouton <strong>L</strong> : Abandonne la partie (retour au menu principal)<br /></li>
</ul>
<p><br />
<ins>Comment utiliser gpAtaxx ?</ins><br />
Le temps passant, les ressources permettant la compilation ou l'usage de <em>gpAtaxx</em> tendent à disparaître (Durant la vie de la console, des URL persos sont partagées mais l'existence de celles-ci dépendent du bon vouloir de leur propriétaire). J'ai donc regroupé, dans les fichiers attachés à ce billet, le maximum de ressources permettant l'exploitation de <em>gpAtaxx</em> : Les logiciels de transferts bien sûr, mais aussi les dernières versions que j'ai pu trouver des SDK, des drivers, ainsi qu'un (<a href="http://users.skynet.be/firefly/gp32/" hreflang="en">émulateur</a>), permettant de pouvoir jouer à <em>gpAtaxx</em> même si on ne possède pas de <a href="http://fr.wikipedia.org/wiki/GP32" hreflang="fr">GP32</a>.</p>http://www.jesuisungeek.com/index.php?post/2007/08/26/35-gpataxx#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/32PHPDBMailurn:md5:51fc5bd23fed590192950adce3faffe92003-05-25T21:42:00+00:002012-10-11T14:23:01+00:00Jean-Baptiste LangloisProjetsemailgpllinuxmailphp<p>Solution d'archivage de mailing-list sur le Web, proposant des utilitaires pour stocker des e-mails dans une interface conviviale</p> <p>Quand on est inscrit sur une mailing-list, on reçoit souvent des dizaines d'e-mails par jour ; or, quand on est inscrit à une mailing-list sur GNU/Linux, système qui devient de plus en plus populaire, on se dit qu'il serait utile de pouvoir archiver tous les mails échangés, car les problèmes de certains peuvent être également le problème d'autres personnes non-inscrits qui pourrait avoir besoin d'une aide. Le but était donc d'archiver pour les rendre consultables par la suite, un ensemble de mails reçus via une mailing-list. C'est dans cette optique que fut envisagée ce projet en partenariat avec l'administrateur de la mailing-list Starinux, liste sur laquelle ce projet fut pour la première fois testée. Ce fut mon premier programme sous licence GNU/GPL et au vu des réactions positives quant à mon travail, ce qui n'était qu'un petit programme d'aide aux internautes se retrouva être un projet de bien plus grande envergure. Paradoxalement, c'est la raison pour laquelle il fut mis entre parenthèses jusqu'à aujourd'hui ; je devinai qu'il allait occuper une place principale dans mon emploi du temps, déjà chargé par les cours universitaires. Il s'arrêta à la version 0.2 avec une interface de configuration en chantier.<br />
<a href="http://www.jesuisungeek.com/public/pictures/real/dbmail1.jpg" title="Interface de base"><img src="http://www.jesuisungeek.com/public/pictures/real/.dbmail1_s.jpg" alt="Interface de base" title="Interface de base, mai 2003" /></a><a href="http://www.jesuisungeek.com/public/pictures/real/dbmail2.jpg" title="Détail des utilisateurs"><img src="http://www.jesuisungeek.com/public/pictures/real/.dbmail2_s.jpg" alt="Détail des utilisateurs" title="Détail des utilisateurs, mai 2003" /></a><a href="http://www.jesuisungeek.com/public/pictures/real/dbmail3.jpg" title="Lecture des e-mails"><img src="http://www.jesuisungeek.com/public/pictures/real/.dbmail3_s.jpg" alt="Lecture des e-mails" title="Lecture des e-mails, mai 2003" /></a><br />
Disons-le tout de suite : ce programme n'est pas simple à installer. En effet, n'ayant pas terminé l'interface d'installation, tout doit se faire à la main, mais une personne habitué au PHP pourra s'en sortir aisément. Mais contre, au niveau de la configuration et des possibilités d'installation, il est loin derrière ce que sera UMS, mais il marche ; Une fois installé, il n'y a plus de raisons de le modifier.<br />
Peut-etre un jour, reprendré-je ce projet pour le mener à bien, dès que mon temps libre me le permettra.<br />
En attendant, pour l'installation, tout ce que je peux vous conseillez est d'éditer le fichier <em>config.php</em> et d'exécuter <em>install.php</em>.<br /></p>http://www.jesuisungeek.com/index.php?post/2007/08/25/37-phpdbmail#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/34Linwar 3urn:md5:89799c6f55759cfa144b2f561b990bce2002-10-28T10:06:00+00:002012-10-11T14:00:48+00:00Jean-Baptiste LangloisBidouillesgplgtklinuxlinwarwarcraft<p>Interface graphique en GTK pour le lancement de <em>Warcraft III</em> sous GNU/Linux</p> <p><a href="http://www.jesuisungeek.com/public/pictures/real/linwar3.jpg" title="Lanceur Linwar3"><img src="http://www.jesuisungeek.com/public/pictures/real/.linwar3_s.jpg" alt="Lanceur Linwar3" style="float:left; margin: 0 1em 1em 0;" title="Lanceur Linwar3, oct. 2012" /></a>Bien que l'idée de ce programme me revienne, l'usage primordial fut pour ma copine, pour qu'elle puisse jouer à <em>Warcraft III</em> sur son Pingouin. Il existe, en effet, un moyen très simple de jouer à ce jeu et casser de l'orque (ou de l'humain, je suis pas sectaire <img src="/dotclear/themes/chestnut/smilies/smile.gif" alt=":-)" class="smiley" /> ) à partir de GNU/Linux à condition d'y mettre un peu du sien. Pour plus d'infos, je vous conseille cet excellent tutorial (en français!) qui est une Bible pour quiconque veut jouer à <em>Warcraft III</em> (tant <em>Reign Of Chaos</em> que <em>Frozen Throne</em>) :<br />
<a href="http://mjules.free.fr/tutorial_wine_et_warcraft_3.htm" hreflang="fr">http://mjules.free.fr/tutorial_wine_et_warcraft_3.htm</a> (<a href="http://www.jesuisungeek.com/public/files/etc/tutorial_wine_et_warcraft_3.htm">Miroir</a>)<br />
Pour résumer, tout ce qu'il faut est WINE installé en version no-windows, un patch No-CD pour lancer le jeu, ainsi qu'une bonne carte 3D. Seulement, voilà, deux défauts subsistent une fois installés pour profiter pleinement du jeu : tout d'abord, il y a la commande pour lancer le jeu se résumant :<br />
<code>wine /home/user/.wine/fake_windows/Program\ Files/Warcraft\ 3/war3.exe</code><br />
C'est assez peu sexy pour en rebuter plus d'un, n'est-ce pas ? Le deuxième problème est encore plus gênant à mon sens. En effet, l'usage de Warcraft III sous GNU/Linux oblige l'utilisateur à détruire les vidéos du jeu. Soit elles ne sont pas fondamentales, mais elle aide à instaurer une certaine ambiance et ce serait un crime que de s'en passer.<br />
<ins>Linwar 3</ins>, mon programme, règle ces deux problèmes en installant une interface qui, même si elle n'est révolutionnaire du point de vue esthétique, permet de lancer le jeu d'un simple de souris et de voir toutes les vidéos d'un autre clic. Il permet en somme de se concentrer exclusivement sur le jeu et non pas sur la configuration.</p>http://www.jesuisungeek.com/index.php?post/2007/08/28/33-linwar-3#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/30