JESUISUNGEEK.COM - Mot-clé - ruby2022-10-15T08:24:27+02:00urn:md5:80fcbbbeeb78d335e0ba1eaeec99fb37DotclearRemonter les checks Icinga grâce à Rubyurn:md5:4c15f6d766824a599be4ed6a9d0930442016-02-15T11:51:00+01:002016-02-15T14:21:17+01:00Jean-Baptiste LangloisBidouillesdashingicingaruby<p><img src="http://www.jesuisungeek.com/public/pictures/divers/icinga-api-2.PNG" alt="icinga-api-2.PNG" style="display:block; margin:0 auto;" title="icinga-api-2.PNG, fév. 2016" />Classe Ruby permettant de remonter des informations grâce à l'interface REST de Icinga-Web</p> <p><img src="http://www.jesuisungeek.com/public/pictures/divers/icinga-icon.png" alt="Logo Icinga" style="float:left; margin: 0 1em 1em 0;" title="Logo Icinga, fév. 2016" />Actuellement en plein développement de modules pour <a href="http://dashing.io/" hreflang="en" title="Dashing">Dashing</a>,on m'a demandé de créer un <em>widget</em> remontant le nombre de checks réalisés en recette et passant en orange ou rouge en fonction des erreurs pouvant être remontés par <a href="https://www.icinga.org/icinga/icinga-2/" hreflang="en" title="Icinga2">Icinga2</a>. Plus que créer un <em>widget</em>, le problème qui se pose à moi est la remonté d'informations à partir d'<a href="https://www.icinga.org/icinga/icinga-2/" hreflang="en" title="Icinga2">Icinga2</a>. Certes, il existe une API REST qui gère cela mais la versin d'<a href="https://www.icinga.org/icinga/icinga-2/" hreflang="en" title="Icinga2">Icinga2</a> dont je dispose est trop ancienne pour en bénéficier. Plutôt que de partir sur une mise à jour du système (On est en RedHat 5 <img src="/dotclear/themes/chestnut/smilies/hmm.gif" alt=":-/" class="smiley" /> ), j'ai préféré tabler sur l'existant et utiliser l'API disponible avec <a href="https://www.icinga.org/icinga/screenshots/icinga-web/" hreflang="en" title="Icinga-Web">Icinga-Web</a>.<br />
Néanmoins, même si l'usage de cette API est (moins ou plus) documenté, rien n'existe pour la récupération des données à partir de <a href="http://dashing.io/" hreflang="en" title="Dashing">Dashing</a>, <a href="http://rubyonrails.org/" hreflang="en" title="Ruby on Rails">Rails</a> ou tout autre application issue de Ruby (à l'opposé une fois encore, de l'API de <a href="https://www.icinga.org/icinga/icinga-2/" hreflang="en" title="Icinga2">Icinga2</a> <img src="/dotclear/themes/chestnut/smilies/sad.gif" alt=":-(" class="smiley" /> ). Du coup, j'ai décidé de développer moi-même ce type d'interface via une classe Ruby : <strong>IcingaWebParser.rb</strong> <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" />
<div class="dcnote noteclassic">
<p>L'usage de cette classe ne se limite bien sûr pas à <a href="http://dashing.io/" hreflang="en" title="Dashing">Dashing</a> et peut être utilisé dans n'importe quel programme Ruby. On peut, par exemple, imaginer un script calculant un pourcentage de disponibilité hebdomadaire en fonction de l'état renvoyé par Icinga.</p>
</div>
</p>
<h3>INSTALLATION</h3>
<p>Tout d'abord, il faut créer une clé d'authentification permettant d'accéder à l'API REST dirrectement via une URL. Pour ce faire, se connecter à l'interface d'administration d'Icinga Web et créer un nouvel utilisateur.<br />
<img src="http://www.jesuisungeek.com/public/pictures/divers/icinga-api-1.PNG" alt="icinga-api-1.PNG" style="display:block; margin:0 auto;" title="icinga-api-1.PNG, fév. 2016" /><br /></p>
<ul>
<li><ins>User name :</ins> Remplir avec un <em>username</em> sans espace ni caractères spéciaux</li>
<li><ins>Auth via :</ins> Choisir <strong>auth_key</strong></li>
<li><ins>Authkey for API :</ins> Cliquer sur l'icône de flèches bleues pour générer une clé. Cette clé (<em>Authkey</em>) sera nécessaire lors de la connexion avec la classe Ruby.</li>
</ul>
<p><img src="http://www.jesuisungeek.com/public/pictures/divers/icinga-api-2.PNG" alt="icinga-api-2.PNG" style="display:block; margin:0 auto;" title="icinga-api-2.PNG, fév. 2016" /><br /></p>
<ul>
<li><ins>Credentials :</ins> cocher l'identifiant <strong>appkit.api.access</strong></li>
<li>Cliquer sur <strong>Save</strong> pour créer l'utilisateur.<br /></li>
</ul>
<h3>UTILISATION</h3>
<p>Avant tout, ne pas oublier d'installer la Gem <q>rest-client</q>, utilisé par <strong>IcingaWebParser.rb</strong> pour se connecter à l'API d'<a href="https://www.icinga.org/icinga/screenshots/icinga-web/" hreflang="en" title="Icinga-Web">Icinga-Web</a>. L'exemple suivant récupérera le nom de services et d'hôtes dont l'état est <strong>CRITICAL</strong>.</p>
<pre>
irb(main):001:0> require './lib/icingawebparser.rb'
=> true
irb(main):002:0> i = IcingaWebParser.new "icinga_url", "auth_key"
=> #<IcingaWebParser:0x007fa3629ec548 @url="icinga_url", @authkey="auth_key">
irb(main):003:0> i.query("service", "AND(SERVICE_CURRENT_STATE|=|2;0)", ["SERVICE_NAME", "HOST_NAME"])
=> [{:SERVICE_NAME=>"Oracle Process", :HOST_NAME=>"server1"}, {:SERVICE_NAME=>"Logs JVM", :HOST_NAME=>"server2"}]
</pre>
<p><div class="dcnote noteclassic">
<p>Les arguments pour créer une nouvelle instance sont :</p>
<ul>
<li>L'URL du serveur Icinga Web</li>
<li>La <em>Auth key</em> précédemment créée</li>
</ul>
<p></p>
</div>
La classe est attachée à ce post. La documentation complète de la classe est ici : <a href="http://www.jesuisungeek.com/public/files/etc/icingawebparser/IcingaWebParser.html">IcingaWebParser.html</a><br /><br />
<ins>Icinga utilisé :</ins> <strong>2.3.4</strong><br />
<ins>Icinga-Web utilisé :</ins> <strong>1.13.0</strong><br />
<ins>Pour en savoir plus :</ins> <strong><a href="https://wiki.icinga.org/display/Dev/Icinga-Web+REST+API">Icinga Wiki</a></strong></p>http://www.jesuisungeek.com/index.php?post/2016/02/15/Remonter-les-checks-Icinga-gr%C3%A2ce-%C3%A0-Ruby#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/248Retrouver la version de son ESXurn:md5:a521c3480d6313f398cdba0179c9f38b2014-04-07T14:29:00+02:002014-04-07T14:29:00+02:00Jean-Baptiste LangloisBidouillesperlpuppetRed Hatrubyvmware<p>Comment connaitre la version de son ESX pour déterminer la version des vmware-ools SANS installer les vmware-tools ?</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" />VMWare, c'est bien! Avec cela, on peut tester diverses situations ou projets (comme par exemple, <a href="https://www.reactos.org/fr" hreflang="fr" title="ReactOS">ReactOS</a> <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" /> ) sans forcément flinguer son système. Par contre, la maintenace de ce type de système tend à devenir assez laborieux pour peu que l'on doive gérer les mises à jour système (ne serait-ce pour conserver le support constructeur). C'est pour cela qu'on utilise les <q>vmware-tools</q>, ces outils bien pratiques qui permettent la gestion de l'ESX à partir d'une machine cliente. Seulement voilà ; ces outils étant très spécifiques, il est <strong>nécessaire</strong> d'installer les <q>vmware-tools</q> qui correspondent bien à la version de son ESX installé (si vous avez du temps et du pop-corn à portée de main, installer donc les <q>vmware-tools</q> d'un ESX 4.0 sur une machine géré par un ESX 5.1, c'est fendard ! <img src="/dotclear/themes/chestnut/smilies/biggrin.gif" alt=":-D" class="smiley" /> ). Là où ça devient franchement folklo, c'est lors d'un déploiement automatisé. En effet : plus votre parc est grand, plus il est probable d'avoir des versions différentes d'ESX. Dans ce cas, on arrive au paradoxe de l'oeuf et de la poule : une fois la VM <em>guest</em> installée, pour connaitre la version des <q>vmware-tools</q> à installer, il faudrait connaître la version de l'ESX mais cette information n'est accessible qu'à traverser les <q>vmware-tools</q>... Du coup, comment faire ?<br />
Par chance, à travers, les dizaines d'informations que nous fournis <q>dmidecode</q>, il y en a une qui va nous sauver :<br />
En effet, si on regarde attentivement le champ <em>Address</em> de la commande <q>dmidecode -t 0</q> sur une VM, on s'aperçoit que l'adresse est toujours identique, <strong>en fonction de la version de l'ESX hôte !</strong> C'est donc par cette information qu'on va pouvoir passer. On obtient donc le script ci-dessous (j'ai testé différentes VM sur différents ESX pour obtenir les valeurs indiquées) :</p>
<pre class="brush: shell">
#!/bin/sh
case $( dmidecode | grep -A4 "BIOS Information" | grep Address | awk '{ print $2 }' ) in
"0xE8480" ) echo "ESX 2.5" ;;
"0xE7C70" ) echo "ESX 3.0" ;;
"0xE7910" ) echo "ESX 3.5" ;;
"0xEA550" ) echo "ESX 4U1" ;;
"0xEA2E0" ) echo "ESX 4.1" ;;
"0xE72C0" ) echo "ESX 5" ;;
"0xEA0C0" ) echo "ESX 5.1" ;;
*) echo "Unknown version: "; dmidecode | grep -A4 "BIOS Information";;
esac
</pre>
<p>Et voilà <img src="/dotclear/themes/chestnut/smilies/cool.gif" alt="8-)" class="smiley" /> Bon, bien sûr , même si c'est fonctionnel, ce n'est pas le top d'utiliser ce type de script durant la <em>post-install</em> (sans parler que c'est difficile de le réutiliser). C'est pour cela que je fournis également la version <strong>facter</strong> afin de pouvoir l'utiliser au sein d'une installation automatisé avec Puppet et son copain Foreman</p>
<pre class="brush: ruby">
# /usr/lib/ruby/site_ruby/1.8/facter/esxversion.rb
Facter.add("esxversion") do
confine :kernel => :Linux
setcode do
case Facter::Util::Resolution.exec('dmidecode | grep -A4 "BIOS Information" | grep Address | cut -d x -f 2')
when "E8480"
"ESX 2.5"
when "E7C70"
"ESX 3.0"
when "E7910"
"ESX 3.5"
when "EA550"
"ESX 4U1"
when "EA2E0"
"ESX 4.1"
when "E72C0"
"ESX 5"
when "EA0C0"
"ESX 5.1"
else
"Unknown"
end
end
end
</pre>
<p>Une fois copié dans le répertoire qui va bien (ou <a href="http://docs.puppetlabs.com/guides/custom_facts.html" hreflang="en">déployé par puppet</a>, en placant le <em>fact</em> ci-dessus dans le répertoire <q>facter</q> du projet), le script devrait renvoyer la version correcte de l'ESX hôte s'il est appelé par un : <strong>facter esxversion</strong></p>http://www.jesuisungeek.com/index.php?post/2014/04/07/Retrouver-la-version-de-son-ESX#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/234Localisation de projets Ruby on Railsurn:md5:418f517cb44c83e9bdcbd3baa1c687172013-07-05T16:01:00+02:002013-07-12T14:29:59+02:00Jean-Baptiste LangloisBidouillesbashi18nrailsrubyscripttraduction<p>Petit script pour simplifier l'écriture de ses fichiers de localisation</p> <p>Toujours la tête plongée dans mon projet Ruby On Rails actuel (<em>stay tuned !</em> <img src="/dotclear/themes/chestnut/smilies/mdr.gif" alt=":mdr:" class="smiley" /> ), j'imagine parfois l'avenir où mon application sera <strong>tellement</strong> connues qu'il faudra la localiser en <em>angliche</em> et en <em>日本語</em> (et puis pleins d'autres, au programme: Quenya, Vulcain, Klingon, ...) et pour gagner du temps, j'effectue la localisation en parallèle. Pour cela j'utilise Rails <a href="http://guides.rubyonrails.org/i18n.html" hreflang="en" title="i18n">i18n</a> qui est très simple à utiliser et à configurer. Rien que la fonction !! C'est tout simplement <strong>t</strong>. Donc à la taper, on ne perd pas de temps, c'est juste <ins>UNE</ins> lettre !!<br />
Pour l'aspect fonctionnel, c'est simple, s'il ne trouve pas la chaîne correspondante dans le fichier de localisation, il <q>railise</q> sa chaîne de caractères (comprendre : il remplace les <em>underscores</em> par des espaces et il met une majuscule à la première ligne.<br />
Prenons l'exemple de la fonction suivante : <strong>t(:je_fais_un_prout)</strong> dans un contexte de traduction anglaise.</p>
<ul>
<li>Rails va chercher dans le fichier en.yml, la chaîne correspndante ; s'il la trouve, il affichera <q>I make a prout</q></li>
<li>Sinon, il affichera <q>Je fais un prout</q></li>
</ul>
<p>C'est tellement simple que je place ces fonctions <strong>t</strong> un peu partout en me disant que je remplirais le fichier de localisation <code>fr.yml</code> plus tard... Sauf que voilà... <q>Plus tard</q>, en informatique signifie souvent, comme partout ailleurs, d'ailleurs,... <q>à la saint glin-glin</q>.<br />
Pourquoi ?<br />
Parce que, comme moi, tout bon développeur est une grosse feignasse qui a une flemme de maladie quand il s'agit de rechercher tous les chaines de localisation qu'il a éparpillé un peu partout dans tous ses fichiers (dans mon cas 110 fichiers et 6160 lignes de code <img src="/dotclear/themes/chestnut/smilies/sad.gif" alt=":-(" class="smiley" /> ) et que surtout : <q>traduire, c'est pas du dév!</q><br />
C'est là où le petit programme que je viens de développer vient à point nommé. En effet, ce script se charge de chercher dans une arborescence <em>Ruby On Rails</em>, les fichiers susceptibles d'accueillir des chaines de localisation de les extraire et de chercher un squelette de fichier de localisation avec. Dès lors que tous les chaînes ont été extraites, il ne reste plus qu'à traduire le fichier de la langue désirée. Pas mal, non ? <img src="/dotclear/themes/chestnut/smilies/smile.gif" alt=":-)" class="smiley" /></p>
<pre class="brush: bash">
#!/bin/sh
# by Jean-Baptiste LANGLOIS
# Tested under RoR 3.2.3
DIRECTORY=`pwd`
APPEND=0
usage()
{
cat << _EOF_
Usage: `basename $0` [-a] [-d <directory>] <language>
where:
<language> localized language on two digits (en, fr, etc.)
Options:
-d <directory> RoR application directory (default: current directory)
-a appending localization file if exists
-h this help page
_EOF_
}
while getopts "d:ah" opt; do
case $opt in
d) DIRECTORY=$OPTARG;;
a) APPEND=1;;
h) usage && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
if [ $# -eq 0 ]; then
usage
exit 1
fi
LANGUAGE=$1
FICHIER=$DIRECTORY/config/locales/$LANGUAGE.yml
[ $APPEND -eq 0 ] && echo "$LANGUAGE:" > $FICHIER
find $DIRECTORY -name "*.rb" -o -name "*.erb" | \
xargs grep -h "t(:" | \
sed 's/^.*t(:\([^), ]*\).*$/ \1:/g' | \
sort -u >> $FICHIER
</pre>
<p>Le programme prend en argument obligatoire la variable de langage (<strong>fr</strong> <em>pour Français</em>, par exemple ; cette variable créera aussi le fichier <strong>fr</strong>.yml) et en argument facultatif le répertoire où se trouve le projet Rails (par défaut, le répertoire en cours) et la possibilité d'écraser un fichier précédemment créé.
<div class="dcnote noteclassic">
<p><strong>TODO</strong><br />En plus d'extraire les chaînes de caractères, la prochaine évolution de ce script serait de <q>railiser</q> les chaines de localisation et d'initialiser les variables avec. Ainsi, si les chaines sont bien créés, il n'y aurait alors même pas besoin de modifier le fichier de localisation.
</p>
</div>
</p>http://www.jesuisungeek.com/index.php?post/2013/07/05/Localisation-de-projets-Ruby-on-Rails#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/230Liens utiles pour faire du développement Weburn:md5:5689b6892d3ba3f6b3f442c29328b0572013-05-29T14:03:00+02:002016-02-14T11:53:40+01:00Jean-Baptiste LangloisGeekeriesrailsruby <p>Actuellement sur un tout nouveau projet (donc je parlerai quand je le pourrai) utilisant massivement <a href="http://fr.wikipedia.org/wiki/Ruby_on_Rails" hreflang="fr" title="Ruby On Rails">Ruby On Rails</a>, jQuery et Ajax, je passe mes journées à lire des tutos et faire un référencement des liens intéressants. Malheureusement, n'ayant pas le temps de tout lire, j'en mets un peu de coté, en me disant que je les lirais quand je le pourrai. Sauf que, je perds ces bouts de papier/e-mails et je n'arrive plus du tout à remettre la main sur <ins>LE</ins> site dont j'ai besoin <ins>QUAND</ins> j'en ai besoin. <br />
En fait, il me faudrait un site Web d'enregistrements de bookmarks, mais les solutions type <em>Reddit</em> et/ou <em>Delicious</em> sont trop <q>Web 2.0</q> pour moi... Du coup, comme je ne trouve pas de site correspondant à mes attentes, je les colle ici, en me disant que je les remettrai en forme quand j'aurai développé le site de <em>bookmarking</em> que je cherche (Promis, je vais le faire !!)... L'avantage, c'est que tout le monde pourra en profiter <img src="/dotclear/themes/chestnut/smilies/wink.gif" alt=";-)" class="smiley" />
<br />
<ins><strong>Resources pour Ajax :</strong></ins><br /></p>
<ul>
<li><a href="http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html" hreflang="en">RoR - Ajax</a> : Utilisation d'Ajax avec Ruby On Rails</li>
<li><a href="http://ajaxload.info/" hreflang="en">Ajaxload</a> : Pour simuler un chargement</li>
<li><a href="http://jqueryfordesigners.com/using-ajax-to-validate-forms/" hreflang="en">jQuery for Designers</a> : Validation Formulaire en Ajax</li>
<li><a href="http://fancybox.net/" hreflang="en">Fancybox</a> : Popup en Ajax</li>
<li><a href="http://api.jquery.com/category/ajax/" hreflang="en">jQuery API</a></li>
</ul>
<p><ins><strong>Resources pour Ruby on Rails :</strong></ins><br /></p>
<ul>
<li><a href="http://railscasts.com/episodes/archive" hreflang="en">RailsCasts</a> : Videos d'apprentissage</li>
<li><a href="http://guides.rubyonrails.org/testing.html" hreflang="en">Rails Guides - Testing</a> : Tests fonctionnels</li>
<li><a href="http://railsdebutant.org/french_guides" hreflang="fr">Rails Guides - FR</a> : Traduction française des Rails Guides</li>
<li><a href="http://french.railstutorial.org/chapters/beginning" hreflang="fr">RailsTutorial</a> : Excellent tutoriel en français</li>
<li><a href="http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-column">Définitions des tables</a> : Options et arguments pour la création des modèles de données</li>
</ul>
<p><ins><strong>Gestion des images avec Ruby on Rails :</strong></ins><br /></p>
<ul>
<li><a href="http://github.com/thoughtbot/paperclip">Paperclip</a> : GEM de gestion des images (<a href="http://railscasts.com/episodes/134-paperclip" hreflang="en" title="vidéo">vidéo</a>)</li>
<li><a href="https://github.com/carrierwaveuploader/carrierwave">CarrierWave</a> (<a href="http://railscasts.com/episodes/253-carrierwave-file-uploads" hreflang="en" title="vidéo">vidéo</a>)</li>
</ul>
<p><ins><strong>Liste des routes du contrôleur Rails :</strong></ins><br />
<img src="http://www.jesuisungeek.com/public/pictures/divers/rails_controller.PNG" alt="Routes RESTful du Controlleur Rails" style="display:block; margin:0 auto;" title="Routes RESTful du Controlleur Rails, juin 2013" /></p>http://www.jesuisungeek.com/index.php?post/2013/05/29/Liens-utiles-pour-faire-du-d%C3%A9veloppement-Web#comment-formhttp://www.jesuisungeek.com/index.php?feed/atom/comments/229Liens 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/216