<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog à Nono &#187; puppet</title>
	<atom:link href="http://blogs.glou.org/arnaud/tag/puppet/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.glou.org/arnaud</link>
	<description>C'est l'histoire d'un geek...</description>
	<lastBuildDate>Sat, 04 Feb 2012 15:46:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Puppet et certificats</title>
		<link>http://blogs.glou.org/arnaud/2011/08/03/puppet-et-certificats/</link>
		<comments>http://blogs.glou.org/arnaud/2011/08/03/puppet-et-certificats/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 13:14:31 +0000</pubDate>
		<dc:creator>nono</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[puppet]]></category>

		<guid isPermaLink="false">http://blogs.glou.org/arnaud/?p=351</guid>
		<description><![CDATA[La demande populaire étant ce qu&#8217;elle est, voici un petit topo sur la façon dont je gère les certificats puppet. De manière générale, quand j&#8217;installe une machine, je lance un script de bootstrap sur mon serveur d&#8217;admin, celui qui a la clé ssh qui va bien. Ce script (bash) comporte entre autres le bout de [...]]]></description>
			<content:encoded><![CDATA[<p>La demande populaire étant ce qu&#8217;elle est, voici un petit topo sur la façon dont je gère les certificats puppet.</p>
<p>De manière générale, quand j&#8217;installe une machine, je lance un script de bootstrap sur mon serveur d&#8217;admin, celui qui a la clé ssh qui va bien. Ce script (bash) comporte entre autres le bout de code suivant :</p>
<pre>[ -d BY-HOST/$host ] || ./gen-host $host

( cd BY-HOST/$host &amp;&amp; tar cf - . ) \
  | ssh $host '( mkdir -p /var/lib/puppet/ssl &amp;&amp; \
    cd /var/lib/puppet/ssl &amp;&amp; rm -f *.pem */*.pem &amp;&amp; \
    tar xvf - &amp;&amp; \
    /usr/sbin/puppetd --no-daemonize --onetime --no-splay --verbose &amp;&amp; \
    touch /var/run/puppet/run-often )'</pre>
<p>En résumé, ça efface les éventuels certificats et autres clés déjà présents sur la machine, ça les remplace par la version «qui fait autorité» et ça lance puppet pour amorcer la pompe. Pour le <em>touch</em> à la fin, c&#8217;est expliqué là : <a href="http://blogs.glou.org/arnaud/2011/02/24/lancer-puppet-depuis-cron/">http://blogs.glou.org/arnaud/2011/02/24/lancer-puppet-depuis-cron/</a></p>
<p>Et si le serveur d&#8217;admin n&#8217;a pas les données en local ? Bah il les génère, tiens ! C&#8217;est le rôle de la première ligne. Le script <em>gen-host</em> fait moralement ça :</p>
<pre>mkdir -p BY-HOST/${host}/{certs,private_keys}
cp ca-${puppetmaster}.pem BY-HOST/${host}/certs/ca.pem
ssh $puppetmaster "puppetca --clean $host ; puppetca --generate $host"
scp ${puppetmaster}:/var/lib/puppet/ssl/private_keys/${host}.pem BY-HOST/${host}/private_keys/
scp ${puppetmaster}:/var/lib/puppet/ssl/ca/signed/${host}.pem BY-HOST/${host}/certs/</pre>
<p>Moralement, parce qu&#8217;il bosse un peu avant pour générer les variables <em>$host</em> et <em>$puppetmaster</em>. La première contient <em>$1</em> éventuellement qualifié (j&#8217;utilise systématiquement le FQDN comme identifiant) ; la seconde est déterminée par une variable dans la fiche LDAP du client.</p>
<p>Voilà, c&#8217;est un peu bricolé mais ça marche bien.</p>
<p>Et je me rends compte qu&#8217;il faudrait que je migre vers la syntaxe de puppet 2.x un de ces jours. <img src='http://blogs.glou.org/arnaud/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.glou.org/arnaud/2011/08/03/puppet-et-certificats/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lancer puppet depuis cron</title>
		<link>http://blogs.glou.org/arnaud/2011/02/24/lancer-puppet-depuis-cron/</link>
		<comments>http://blogs.glou.org/arnaud/2011/02/24/lancer-puppet-depuis-cron/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 11:35:07 +0000</pubDate>
		<dc:creator>nono</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[puppet]]></category>

		<guid isPermaLink="false">http://blogs.glou.org/arnaud/?p=276</guid>
		<description><![CDATA[Puppet, c&#8217;est bien. Ça a juste un tout petit inconvénient&#160;: c&#8217;est écrit en ruby, avec la consommation mémoire que ça implique. Vous me direz, 200&#160;Mo, sur une machine moderne, c&#8217;est rien. Sauf que si vous commencez à jouer avec des isolateurs, vous allez vite vous rendre compte que 30 fois 200&#160;Mo, ça finit par faire [...]]]></description>
			<content:encoded><![CDATA[<p>Puppet, c&#8217;est bien. Ça a juste un tout petit inconvénient&nbsp;: c&#8217;est écrit en ruby, avec la consommation mémoire que ça implique. Vous me direz, 200&nbsp;Mo, sur une machine moderne, c&#8217;est rien. Sauf que si vous commencez à jouer avec des isolateurs, vous allez vite vous rendre compte que 30 fois 200&nbsp;Mo, ça finit par faire beaucoup. Surtout pour un outil qui passe 98% de son temps à dormir (non, il ne libère pas la mémoire pour autant).</p>
<p>J&#8217;ai donc pondu un petit bout de script shell pour lancer <em>puppetd</em> uniquement quand on a besoin de lui. J&#8217;en ai profité pour améliorer un peu la gestion de la périodicité. En gros,</p>
<ul>
<li>par défaut, <em>puppetd</em> tourne une fois par heure,</li>
<li>si le fichier <em>/var/run/puppet/run-often</em> existe, il tourne toutes les 5 minutes pendant une heure au plus (il supprime le fichier après ce délai),</li>
<li>si le fichier <em>/var/run/puppet/never-auto-run</em> existe, il refuse de tourner (pratique pour les maintenances où on ne veut pas se battre contre puppet).</li>
</ul>
<p>Tout ça, c&#8217;est géré par <em>cron</em> de cette façon :</p>
<pre>*/5 * * * * /usr/local/sbin/run-puppet -often
42 * * * * /usr/local/sbin/run-puppet</pre>
<p>Notez que ces deux invocations ne lancent pas <em>puppetd</em> immédiatement ; elles attendent «un certain temps» (calculé en fonction de l&#8217;adresse IPv4 de la machine, je voulais des intervalles fixes entre deux passages de Puppet).</p>
<p>Le script accepte aussi une option <em>-now</em> qui lui indique de lancer puppet immédiatement&nbsp;; cette option est conçue pour invoquer le script directement en ligne de commande.</p>
<p>Finalement, le script lui-même&nbsp;:</p>
<pre>#!/bin/bash
#
# Arnaud Gomes 2010
#
# Trigger a puppet run.
#
# Usage:
#
#   run-puppet
#       Run sometime in the next hour.
#
#   run-puppet -often
#       Run sometime in the next 5 minutes if $runoftenfile exists.
#
#   run-puppet -now
#       Run now.
#
# This script will exit immediately if $dontrunfile exists.
#
# Needs /usr/bin/lockfile (from procmail).

flagdir="/var/run/puppet"
runoftenfile=${flagdir}"/run-often"
dontrunfile=${flagdir}"/never-auto-run"
lockfile=${flagdir}"/lock"
puppetd="/usr/sbin/puppetd"
flags="--no-daemonize --onetime --no-splay"

usage () {
        echo "Usage: $0 [ -often | -now ]"
        exit 1
}

dontrun () {
        echo "$dontrunfile present, skipping this run."
        exit 0
}

run () {
        lockfile $lockfile
        $puppetd $flags
        rm -f $lockfile
}

[ $# -le 1 ] || usage
[ -f $dontrunfile ] &#038;&#038; dontrun

# $seed is used for computing splay time. We do not make it random
# as we want each machine to run puppet every hour (or whatever), not
# "more or less randomely averaging to once every hour".
#
# This horrible perl thing just means "last two bytes from IPv4 address,
# reversed". We reverse them as the last byte probably is more evenly
# distributed.
seed=$(($(facter ipaddress | perl -pe 's/^([0-9]+\.){2}([0-9]+)\.([0-9]+)$/$3 * 256 + $2/')))
splay=$(($seed % 3600))

# Exit if called with -often and no $runoftenfile.
# If $runoftenfile is here, we run within 5 minutes instead of within
# an hour.
if [ "$1" = "-often" ]
then
        [ -f $runoftenfile ] || exit 0
        splay=$(($seed % 300))
fi

# Of course option -now removes any splay time.
if [ "$1" = "-now" ]
then
        splay=0
        flags="$flags --verbose"
fi

sleep $splay
run

# Remove $runoftenfile after an hour. We don't want to run every 5 minutes
# for ever, only when needed.
[ -f $runoftenfile ] &#038;&#038; find $runoftenfile -cmin +60 -exec rm -f {} \;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.glou.org/arnaud/2011/02/24/lancer-puppet-depuis-cron/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Choisir le bon /usr/sbin/sendmail avec puppet</title>
		<link>http://blogs.glou.org/arnaud/2009/09/02/choisir-le-bon-usrsbinsendmail-avec-puppet/</link>
		<comments>http://blogs.glou.org/arnaud/2009/09/02/choisir-le-bon-usrsbinsendmail-avec-puppet/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 09:43:57 +0000</pubDate>
		<dc:creator>nono</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[ssmtp]]></category>

		<guid isPermaLink="false">http://blogs.glou.org/arnaud/?p=141</guid>
		<description><![CDATA[Un peu de contexte J&#8217;utilise linux-vserver sur une poignée de machines qui hébergent chacune quelques dizaines d&#8217;instances d&#8217;OS. Dans mon installation de base (CentOS), chaque isolateur fait tourner sendmail pour envoyer le mail local vers l&#8217;extérieur ; je parle essentiellement des rapports de logwatch et autres cronneries. Avec tous les problèmes habituels en cas de forte [...]]]></description>
			<content:encoded><![CDATA[<h1>Un peu de contexte</h1>
<p>J&#8217;utilise linux-vserver sur une poignée de machines qui hébergent chacune quelques dizaines d&#8217;instances d&#8217;OS. Dans mon installation de base (CentOS), chaque isolateur fait tourner sendmail pour envoyer le mail local vers l&#8217;extérieur ; je parle essentiellement des rapports de logwatch et autres cronneries. Avec tous les problèmes habituels en cas de forte charge, ce qui arrive assez facilement dans ce genre de configuration.</p>
<p>Solution : installer un <em>/usr/sbin/sendmail</em> un peu plus léger, en l&#8217;occurrence <em>ssmtp</em>, sur toutes les machines sauf les vrais serveurs SMTP, qui eux font tourner Postfix.</p>
<h1>La configuration puppet</h1>
<p>Un petit extrait de ma config (nettement plus complète mais pas publiable en l&#8217;état) :</p>
<p><code>class mail{<br />
}<br />
<br />
class mail::smtp inherits mail {<br />
<br />
        package { "ssmtp": ensure => installed, }<br />
<br />
        file { "/etc/ssmtp/ssmtp.conf":<br />
                source => [<br />
                        "puppet:///files/mail/ssmtp.conf.$hostname",<br />
                        "puppet:///mail/ssmtp.conf",<br />
                ],<br />
                owner => root,<br />
                group => root,<br />
                mode => 0644,<br />
                require => Package["ssmtp"],<br />
        }<br />
<br />
        exec { "setup_mta":<br />
                command => "/usr/sbin/update-alternatives --set mta /usr/sbin/sendmail.ssmtp",<br />
                subscribe => Package["ssmtp"],<br />
                refreshonly => true,<br />
        }<br />
<br />
}<br />
<br />
class mail::postfix inherits mail::smtp {<br />
<br />
        package { ["postfix", "postfix-pflogsumm"]: ensure => installed }<br />
<br />
        service { "postfix":<br />
                enable => true,<br />
                ensure => running,<br />
                hasstatus => true,<br />
                subscribe => Package["postfix"],<br />
        }<br />
<br />
        Exec["setup_mta"] {<br />
                command => "/usr/sbin/update-alternatives --set mta /usr/sbin/sendmail.postfix",<br />
                subscribe => Package["postfix"],<br />
        }<br />
<br />
}</code></p>
<p>L&#8217;intérêt de la chose : toutes les machines sont dans la classe <em>mail::smtp</em>, et Postfix est installé uniquement là où il faut, et surtout une même machine peut cumuler les rôles « serveur SMTP » et « autre chose » et tout se passera comme il faut.</p>
<p>Pour le moment, ça installe <em>ssmtp</em> même sur les machines où il n&#8217;est pas nécessaire, on verra à corriger ça dans la prochaine version. <img src='http://blogs.glou.org/arnaud/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.glou.org/arnaud/2009/09/02/choisir-le-bon-usrsbinsendmail-avec-puppet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puppet pour les nuls</title>
		<link>http://blogs.glou.org/arnaud/2008/09/22/puppet-pour-les-nuls/</link>
		<comments>http://blogs.glou.org/arnaud/2008/09/22/puppet-pour-les-nuls/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 13:11:49 +0000</pubDate>
		<dc:creator>nono</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[système]]></category>

		<guid isPermaLink="false">http://www.glou.org/~arnaud/wp/?p=5</guid>
		<description><![CDATA[Après quelques temps à m&#8217;intéresser à Puppet, j&#8217;ai finalement décidé de sauter le pas et de commencer à le déployer pour remplacer notre architecture cfengine dont on commence à toucher les limites. Après avoir passé pas mal de temps à potasser la doc et à demander plein de trucs à Google, voici donc les quelques [...]]]></description>
			<content:encoded><![CDATA[<p>Après quelques temps à m&#8217;intéresser à <a href="http://puppet.reductivelabs.com/" target="_parent">Puppet</a>, j&#8217;ai finalement décidé de sauter le pas et de commencer à le déployer pour remplacer notre architecture <a href="http://www.cfengine.org/" target="_parent">cfengine</a> dont on commence à toucher les limites.</p>
<p>Après avoir passé pas mal de temps à potasser la doc et à demander plein de trucs à Google, voici donc les quelques points qui m&#8217;ont posé problème. Attention, tout ceci concerne une infrastructure à base de CentOS 4 et 5, avec le serveur sous CentOS 5. Puppet lui-même est installé depuis <a href="http://fedoraproject.org/wiki/EPEL" target="_parent">EPEL</a>.</p>
<h2>Organisation</h2>
<p>Dans le fichier <em>site.pp</em>, on définit juste des classes « conteneurs » comme suit :</p>
<pre>class lamp {
  include php
  include mysql
}</pre>
<p>Les autres classes sont définies dans des fichiers à part (<em>php</em> dans <em>classes/php.pp</em> et ainsi de suite). Ça, c&#8217;est une convention plus qu&#8217;autre chose mais en pratique ça aide à avoir les idées claires.</p>
<h2>LDAP</h2>
<p>J&#8217;utilise <a href="http://reductivelabs.com/trac/puppet/wiki/LDAPNodes" target="_parent">LDAP</a> pour stocker les infos relatives aux clients. Pour que ça fonctionne, il faut :</p>
<ul>
<li>installer <em>ruby-ldap</em> sur le serveur</li>
<li>ajouter, toujours sur le serveur, un fichier <em>/etc/puppet/puppetmasterd.conf</em> avec le contenu suivant :</li>
</ul>
<pre>[main]
    vardir = /var/lib/puppet
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl

[puppermasterd]
    node_terminus = ldap
    ldapserver = ldap.ircam.fr
    ldapbase = ou=Hosts,dc=ircam,dc=fr</pre>
<p>Pour les clients, tout se passe dans l&#8217;annuaire lui-même : on leur ajoute la classe <em>puppetClient</em> et un champ <em>puppetclass</em> qui contient la liste des classes.</p>
<pre>dn: cn=system.ircam.fr,ou=virtuels,ou=Hosts,dc=ircam,dc=fr
puppetclass: lamp</pre>
<p>Pour le moment, le noeud <em>default</em> est encore en dur dans <em>site.pp</em>, ça râle dans les logs de <em>puppetmasterd</em>, il faudra le pousser dans LDAP un jour ou l&#8217;autre.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.glou.org/arnaud/2008/09/22/puppet-pour-les-nuls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

