Projet

Général

Profil

StageVidal » Historique » Version 42

Maurice Vidal, 21/05/2012 22:46

1 1 Laurent GUERBY
h1. StageVidal
2 1 Laurent GUERBY
3 11 Maurice Vidal
Références : http://chiliproject.tetaneutral.net/projects/tetaneutral/wiki/Stages2012
4 16 Maurice Vidal
5 20 Maurice Vidal
NickName sur l'IRC de l'association : 
6 16 Maurice Vidal
*<pre>
7 16 Maurice Vidal
_Mvidal_
8 16 Maurice Vidal
</pre>*
9 11 Maurice Vidal
10 31 Laurent GUERBY
h2. TODO
11 31 Laurent GUERBY
12 31 Laurent GUERBY
outils de communication de fichier IRC
13 31 Laurent GUERBY
14 31 Laurent GUERBY
http://paste.debian.net/164858/
15 31 Laurent GUERBY
http://pastebin.com
16 31 Laurent GUERBY
17 37 Maurice Vidal
h1. Tutoriel SSH :
18 37 Maurice Vidal
19 37 Maurice Vidal
L'objectif présenté ici est de mettre en place une connexion sécurisée entre un client et un serveur à travers une zone non fiable (Internet) grâce à un tunnel crypté. Nous nous serviront d'un système de clé SSH qui servira à nous authentifier : une clé privée que nous garderons sur le poste local, et une clé publique que nous mettrons dans le serveur.
20 37 Maurice Vidal
21 37 Maurice Vidal
Nous allons prendre comme exemple, le poste distant de l'association pvm3.tetaneutral.net (qui jouera le rôle du serveur), et comme poste local, pc_local.
22 37 Maurice Vidal
23 37 Maurice Vidal
Sur le poste distant il faut installer le package openssh-server :
24 37 Maurice Vidal
*aptitude install openssh-server*
25 37 Maurice Vidal
26 37 Maurice Vidal
Et sur le poste local il faut installer le package openssh-client :
27 37 Maurice Vidal
*aptitude install openssh-client*
28 37 Maurice Vidal
29 37 Maurice Vidal
h3. Configuration du poste local :
30 37 Maurice Vidal
31 37 Maurice Vidal
Nous allons commencer par générer une clé SSH.
32 37 Maurice Vidal
33 37 Maurice Vidal
*ssh-keygen*
34 37 Maurice Vidal
	(/root/.ssh/id_rsa) : 
35 37 Maurice Vidal
	enter passphrase :
36 37 Maurice Vidal
	enter same passphrase :
37 37 Maurice Vidal
38 37 Maurice Vidal
Par défaut la clé publique sera créée au nom de /root/.ssh/id_rsa.pub et la clé privée au nom de /root/.ssh/id_rsa.
39 37 Maurice Vidal
40 37 Maurice Vidal
En laissant chacun de ces champs vides, le chemin sera celui utilisé par défaut et aucune passphrase ne sera nécessaire. La passphrase sert uniquement à protéger la clé privé si on craint de ne pas la garder en sûreté sur son poste local.
41 37 Maurice Vidal
42 37 Maurice Vidal
On vérifie que les clés soient bien créées (exemple type) : 
43 37 Maurice Vidal
44 37 Maurice Vidal
*ls /root/.ssh/*		
45 37 Maurice Vidal
id_rsa		id_rsa.pub		know_hosts
46 37 Maurice Vidal
47 37 Maurice Vidal
h3. Configuration du poste distant :
48 37 Maurice Vidal
49 37 Maurice Vidal
Nous allons modifier le fichier de configuration se trouvant dans /root/.shh/authorized_keys pour venir y ajouter la clé publique (id_rsa.pub) du poste local, ce lui permettra de venir se connecter au serveur
50 37 Maurice Vidal
51 37 Maurice Vidal
Si nous avons récupéré la clé publique sur le serveur, nous pouvons l'insérer dans le fichier des clés autorisées :
52 37 Maurice Vidal
*cat id_rsa.pub >> ~/.ssh/authorized_keys*
53 37 Maurice Vidal
54 37 Maurice Vidal
Le fichier de configuration pour le démon SSHD se situe à /etc/ssh/sshd_config, on le modifie pour améliorer la sécurité. Quelques options importantes :
55 37 Maurice Vidal
56 37 Maurice Vidal
57 37 Maurice Vidal
* ListenAddress X.X.X.X:X    		Change le port d’écoute, ainsi l’intrus ne peut être 						complètement sûr de l’exécution d’un  démon SSHD					(c’est de la sécurité par l’obscurité).
58 37 Maurice Vidal
* Protocole 2   				Désactiver le protocole version 1, car il a des défauts de 					conception qui facilite le crack de mots de passe.
59 37 Maurice Vidal
* PermitRootLogin no 			Cette option permet de ne pas autoriser la connexion en 					root sur la machine.
60 37 Maurice Vidal
* PermitEmptyPasswords no   		Les mots de passe vides sont un affront au système de 					sécurité.
61 37 Maurice Vidal
* PasswordAuthentication yes 		 Il est plus sûr d’autoriser l’accès à la machine 						uniquement aux utilisateurs avec des clés SSH placées 					dans le  fichier /root/.ssh/authorized_keys, il faut donc 					placer cette option à "no".
62 37 Maurice Vidal
* SyslogFacility AUTH 		Fichiers journaux.
63 37 Maurice Vidal
* LogLevel INF                   Fichiers journaux.
64 37 Maurice Vidal
* 
65 37 Maurice Vidal
66 37 Maurice Vidal
Une fois le fichier de configuration prêt, il ne reste plus qu'à relancer le service :
67 37 Maurice Vidal
*/etc/init.d/ssh reload*
68 37 Maurice Vidal
69 37 Maurice Vidal
h3. Commandes utiles :
70 37 Maurice Vidal
71 37 Maurice Vidal
Se connecter en SSH sur le port 443 de la machine pvm3 de tetaneutral.net :
72 37 Maurice Vidal
*ssh -p 443 root@pvm3.tetaneutral.net*
73 37 Maurice Vidal
74 37 Maurice Vidal
Copier le fichier distant /var/log/mail.log sur son poste local (il ne faut pas être connecté en SSH) :
75 37 Maurice Vidal
*scp -P 443 root@pvm3.tetaneutral.net:/var/log/mail.log /tmp/*
76 37 Maurice Vidal
Inversement pour copier un fichier local vers un poste distant (ne pas être connecté en SSH) 
77 37 Maurice Vidal
*scp -P 443 fichier_local root@pvm1.tetaneutral.net:/home/maumau/lol.txt*
78 37 Maurice Vidal
79 37 Maurice Vidal
h3. Pour se déconnecter : 
80 37 Maurice Vidal
81 37 Maurice Vidal
*CTRL + d*
82 37 Maurice Vidal
83 37 Maurice Vidal
h3. Voir les log de ssh :
84 37 Maurice Vidal
85 37 Maurice Vidal
*tailf /var/log/auth.log*
86 37 Maurice Vidal
87 37 Maurice Vidal
h1. PROJET PUPPET : DRBD + MX REDONDANT
88 37 Maurice Vidal
89 33 Maurice Vidal
h2. Roadmap
90 20 Maurice Vidal
91 14 Maurice Vidal
Semaine 01, 09/04 - 13/04 : Prise en main de l'existant (SSH, IRC, Machines Virtuelles)
92 13 Maurice Vidal
Semaine 02, 16/04 - 20/04 : Documentation sur le gestionnaire Puppet
93 1 Laurent GUERBY
Semaine 03, 23/04 - 28/04 : Maîtrise et configuration de Puppet
94 1 Laurent GUERBY
Semaine 04, 30/04 - 04/05 : Déploiement de Bind, Unbound et de Postfix via Puppet
95 25 Maurice Vidal
Semaine 05, 07/05 - 11/05 : Documentation sur DRBD 
96 26 Maurice Vidal
Semaine 06, 14/05 - 18/05 : Mise en place d'un MX redondant grâce à DRBD
97 26 Maurice Vidal
98 37 Maurice Vidal
h2. Aides Tutoriels sur Puppet
99 26 Maurice Vidal
100 26 Maurice Vidal
http://doc.ubuntu-fr.org/puppet
101 39 Maurice Vidal
http://www.crium.univ-metz.net/docs/system/puppet.html
102 39 Maurice Vidal
http://www.octopuce.net/Puppet-Administration-systeme-centralisee
103 19 Maurice Vidal
http://bitfieldconsulting.com/puppet-tutorial-2
104 39 Maurice Vidal
http://www.craigdunn.org/2010/08/part-2-puppet-2-6-1-configure-pvm1-and-puppetd/
105 1 Laurent GUERBY
http://docs.puppetlabs.com/guides/environment.html
106 1 Laurent GUERBY
http://projects.puppetlabs.com/projects/puppet/wiki/Simplest_Puppet_Install_Pattern
107 1 Laurent GUERBY
http://chiliproject.tetaneutral.net/projects/tetaneutral/wiki/PUPPET
108 1 Laurent GUERBY
http://finninday.net/wiki/index.php/Zero_to_puppet_in_one_day
109 39 Maurice Vidal
http://madeinsyria.net/2011/06/howto-puppet-administration-et-industrialisation-de-masse/
110 27 Maurice Vidal
http://jeyg.info/mise-en-place-de-puppet-un-gestionnaire-de-configuration-linuxunix/
111 39 Maurice Vidal
http://www.deimos.net/blocnotesinfo/index.php?title=Puppet_:_Solution_de_gestion_de_fichier_de_configuration
112 1 Laurent GUERBY
http://bitfieldconsulting.com/puppet-tutorial
113 1 Laurent GUERBY
http://www.unixgarden.com/index.php/gnu-linux-magazine/les-sysadmins-jouent-a-la-poupee
114 1 Laurent GUERBY
115 37 Maurice Vidal
h2. Aides Tutoriels sur DRBD
116 20 Maurice Vidal
117 13 Maurice Vidal
http://wapiti.telecom-lille1.eu/commun/ens/peda/options/ST/RIO/pub/exposes/exposesrio2007/legrand-playez/howto.htm
118 13 Maurice Vidal
http://www.drbd.org/users-guide-emb/p-work.html
119 13 Maurice Vidal
http://doc.ubuntu-fr.org/drbd
120 14 Maurice Vidal
http://doc.ubuntu-fr.org/tutoriel/mirroring_sur_deux_serveurs
121 13 Maurice Vidal
122 37 Maurice Vidal
h2. Aides Tutoriels sur UnBound
123 1 Laurent GUERBY
124 39 Maurice Vidal
http://www.deimos.net/blocnotesinfo/index.php?title=Fichier:Installing_And_Using_The_Unbound_Name_Server.pdf
125 14 Maurice Vidal
http://unbound.net/documentation/index.html
126 14 Maurice Vidal
http://www.howtoforge.com/installing-using-unbound-nameserver-on-debian-etch
127 14 Maurice Vidal
http://www.bortzmeyer.org/unbound.html
128 14 Maurice Vidal
129 37 Maurice Vidal
h2. Aides Tutoriels sur BIND
130 14 Maurice Vidal
131 21 Maurice Vidal
http://fr.wikibooks.org/wiki/Le_syst%C3%A8me_d%27exploitation_GNU-Linux/Le_serveur_de_noms_Bind
132 39 Maurice Vidal
http://www.deimos.net/blocnotesinfo/index.php?title=Installation_et_configuration_d%27un_serveur_Bind9_primaire_(Master)
133 17 Maurice Vidal
http://www.howtoforge.com/traditional_dns_howto
134 1 Laurent GUERBY
http://coagul.org/drupal/article/installation-d%E2%80%99-serveur-dns-bind-9-sur-debian
135 1 Laurent GUERBY
136 38 Maurice Vidal
h2. Aides Tutoriels sur Postfix Ldap
137 38 Maurice Vidal
138 38 Maurice Vidal
http://www.bizeul.net/?2005/05/27/7-serveur-de-messagerie-multi-domaines-avec-postfix-openldap-et-courier
139 39 Maurice Vidal
http://www.mp-poissy.ac-versailles.net/Formations/05-06/Pdf/courrier_ldap.pdf
140 38 Maurice Vidal
http://blog.wains.be/2010/01/25/postfix-virtual-usersgroupsaliases-stored-in-ldap/
141 38 Maurice Vidal
http://wiki.linuxwall.info/doku.php/fr:ressources:dossiers:postfix:ldap
142 39 Maurice Vidal
http://www.mp-poissy.ac-versailles.net/Formations/05-06/Pdf/courrier_ldap.pdf
143 38 Maurice Vidal
http://www.404blog.net/?p=36
144 38 Maurice Vidal
http://www.linux-france.org/prj/inetdoc/cours/admin.reseau.ldap.synthese/admin.reseau.ldap.srvr.html
145 38 Maurice Vidal
146 1 Laurent GUERBY
h1. Questions
147 1 Laurent GUERBY
148 1 Laurent GUERBY
h2. A propos du DRBD + MX redondant
149 1 Laurent GUERBY
150 37 Maurice Vidal
*j'aurais voulu savoir si il faut que l'on mette en place 1 Bind et 1 Unbound et que l'on y fasse un DRBD sur les sections /etc de chacun de ces deux serveurs ?*
151 1 Laurent GUERBY
152 1 Laurent GUERBY
Réponse : il y a trois choses séparées :
153 1 Laurent GUERBY
154 1 Laurent GUERBY
# configurer deux VM une avec bind et une avec unbound. Comme une partie des fichiers de configuration sont différents pour le moment pas de DRBD, juste bien documenter.
155 1 Laurent GUERBY
# configurer deux VM qui ont un bout de disque répliqué avec DRBD, bien documenter le setup DRBD
156 1 Laurent GUERBY
# configurer deux VM qui sont MX primaire et secondaire d'un domaine, verifier que ça marche. Ensuite essayer de rajouter DRBD pour rendre le setup totalement fiable dans le sens qu'aucune perte de mail entrant n'est possible.
157 1 Laurent GUERBY
158 1 Laurent GUERBY
A chaque fois l'objectif "documenter" est bien sur d'utiliser [[Puppet]] 
159 1 Laurent GUERBY
160 39 Maurice Vidal
La partie DRBD du MX viendra uniquement à la fin, c'est la plus complexe.
161 1 Laurent GUERBY
162 37 Maurice Vidal
h2. PUPPET : Déploiement de BIND et UNBOUND (sur deux machines)
163 37 Maurice Vidal
164 37 Maurice Vidal
*Puppet est ce que l’on peut appeler un gestionnaire de configuration.
165 37 Maurice Vidal
C’est un outil qui facilite le contrôle et la mise à jour de configurations tout en offrant la possibilité de faire abstraction de l’OS et de l’architecture concernée. Puppet va permettre de déployer des fichiers, des services, des packages, des commandes et même un cron au travers de clients qui deviendront des Serveurs (exemple : BIND, UNBOUND).*
166 37 Maurice Vidal
167 37 Maurice Vidal
Puppet est donc un outil de centralisation de l’administration de systèmes hétérogènes ou homogènes
168 39 Maurice Vidal
Au travers du serveur puppet (Pvm1), chaque machine, appelée noeud (node), fait tourner Puppetd, qui :
169 37 Maurice Vidal
+Applique la configuration initiale pour le noeud concerné.+
170 37 Maurice Vidal
+Applique les nouveautés de configuration au fil du temps.+
171 37 Maurice Vidal
+S’assure de manière régulière que la machine correspond bien à la config voulu.+
172 37 Maurice Vidal
173 39 Maurice Vidal
La communication est assurée via des canaux chiffrés, en utilisant le protocole HTTPS de communication de ruby, et donc SSL (une mini-pki est fournie). Pvm1 sait servir :
174 37 Maurice Vidal
+des recettes de configuration+ (recipes)
175 37 Maurice Vidal
+des fichiers+
176 37 Maurice Vidal
+des modèles+ (qui sont des fichiers avec des variables de remplacement)
177 37 Maurice Vidal
+des objets ruby+ (c’est là l’extensibilité de l’application)
178 37 Maurice Vidal
 Et bien évidemment : Puppet est un logiciel libre écrit en Ruby, multiplateforme : BSD (Free, MacOS ...), Linux (Redhat, Debian, Suse ...), Sun (OPENSolaris ...).
179 37 Maurice Vidal
180 37 Maurice Vidal
Puppet fournit un langage déclaratif simple :
181 37 Maurice Vidal
+classes+ (permet de définir les configurations de chaque service) 
182 37 Maurice Vidal
+héritage+ (permet de regrouper les configurations communes) 
183 37 Maurice Vidal
+types d’objets particuliers+ (définis par puppet, ou par des modules)  +fonctions utilisateur+ 
184 37 Maurice Vidal
+abonnement d’instances à d’autres instances+ (ex : un service est abonné à son fichier de conf, la modif de l’un entraînera le redémarrage de l’autre)
185 37 Maurice Vidal
186 37 Maurice Vidal
h3. *Exemples de types d’objets internes :*
187 37 Maurice Vidal
188 37 Maurice Vidal
+File+, permet de demander qu’un fichier existe, dispose de certains droits, et corresponde éventuellement à un certain contenu, fournit statiquement, ou à travers un modèle (template) avec substitution de variables.
189 37 Maurice Vidal
+Service+, permet de déclarer un service, de s’assurer qu’il fonctionne, de le redémarrer dans certaines conditions (par exemple quand la configuration est modifiée). 
190 37 Maurice Vidal
+Package+, permet de demander l’installation, la mise à jour ou la désinstallation d’un package, en utilisant le système de packaging natif de l’OS utilisé (ports, deb, packages MacosX etc.) 
191 1 Laurent GUERBY
+User+, permet de gérer les utilisateurs UNIX (dans /etc/passwd) indépendemment de l’OS utilisé.
192 1 Laurent GUERBY
193 1 Laurent GUERBY
h3. *Puppet fonctionne selon le modèle client/serveur :*
194 1 Laurent GUERBY
195 37 Maurice Vidal
!http://img15.hostingpics.net/pics/54901331cs.jpg!
196 1 Laurent GUERBY
197 37 Maurice Vidal
*Pré-requis :*
198 37 Maurice Vidal
199 41 Maurice Vidal
Comme nom de domaine nous prenons un sous-domaine de l'association : testdomain1.tetaneutral.net
200 1 Laurent GUERBY
201 37 Maurice Vidal
*Et les adresses IP sont donc :*
202 37 Maurice Vidal
203 39 Maurice Vidal
pvm1 : 91.224.149.35
204 39 Maurice Vidal
pvm2 : 91.224.149.36
205 39 Maurice Vidal
pvm3 : 91.224.149.37
206 39 Maurice Vidal
pvm4 : 91.224.149.38
207 39 Maurice Vidal
pvm5 : 91.224.149.30
208 37 Maurice Vidal
209 37 Maurice Vidal
h3. *Installation de Puppet*
210 37 Maurice Vidal
211 42 Maurice Vidal
Serveur :	# apt-get install puppetmaster
212 37 Maurice Vidal
Clients : 	# apt-get install puppet
213 37 Maurice Vidal
214 37 Maurice Vidal
Ici nous utilisons la version 2.6.2 de Puppet. Lors de l’installation, un utilisateur « puppet » sera créé.
215 37 Maurice Vidal
216 37 Maurice Vidal
Tout d'abord il faut que le fichier hosts de chaque client référence l'adresse IP, le hostname et le FQDN du serveur. Ainsi il faut rajouter dans /etc/hosts :
217 37 Maurice Vidal
218 39 Maurice Vidal
91.224.149.35	pvm1	pvm1.testdomain1.tetaneutral.net
219 37 Maurice Vidal
220 37 Maurice Vidal
De même sur le serveur il faut rajouter les noms des 3 machines clientes de la même façon.
221 37 Maurice Vidal
A ce stade nous n'avons pas de serveurs DNS, justement nous allons le(s) déployer :)
222 37 Maurice Vidal
223 37 Maurice Vidal
Il est important (si l'on a un pare-feu) d'ouvrir les ports 8140 coté serveur :
224 39 Maurice Vidal
*iptables -A INPUT -p tcp -m state --state NEW -s 91.224.149.0/24 --dport 8140 -j ACCEPT*
225 37 Maurice Vidal
226 37 Maurice Vidal
De plus il est important de pouvoir regarder les logs (tant sur le serveur que sur les clients) :
227 37 Maurice Vidal
*tailf /var/log/daemon.log*			
228 37 Maurice Vidal
229 37 Maurice Vidal
h3. *Configuration de Puppet*
230 37 Maurice Vidal
231 37 Maurice Vidal
DEMANDE DE CERTIFICAT
232 37 Maurice Vidal
233 37 Maurice Vidal
*Serveur :*
234 37 Maurice Vidal
Il faut modifier le fichier /etc/puppet/puppet.conf, il doit ressembler à ceci :
235 37 Maurice Vidal
236 37 Maurice Vidal
<pre>
237 37 Maurice Vidal
[main]
238 1 Laurent GUERBY
logdir=/var/log/puppet
239 37 Maurice Vidal
vardir=/var/lib/puppet
240 37 Maurice Vidal
ssldir=/var/lib/puppet/ssl
241 37 Maurice Vidal
rundir=/var/run/puppet
242 1 Laurent GUERBY
factpath=$vardir/lib/facter
243 1 Laurent GUERBY
templatedir=$confdir/templates
244 37 Maurice Vidal
245 1 Laurent GUERBY
[master]
246 37 Maurice Vidal
report=true
247 1 Laurent GUERBY
reports=log,store
248 1 Laurent GUERBY
modulepath=/etc/puppet/modules
249 37 Maurice Vidal
</pre>
250 37 Maurice Vidal
251 37 Maurice Vidal
*Clients :*
252 37 Maurice Vidal
253 37 Maurice Vidal
Ici il faut rajouter le FQDN (ou Hostname s'il n'y a pas de domaine) du serveur, ainsi dans /etc/puppet/puppet.conf :
254 37 Maurice Vidal
255 37 Maurice Vidal
<pre>
256 1 Laurent GUERBY
[main]
257 37 Maurice Vidal
...
258 39 Maurice Vidal
server=pvm1.testdomain1.tetaneutral.net
259 37 Maurice Vidal
</pre>
260 1 Laurent GUERBY
261 37 Maurice Vidal
Une fois cette modification faite, il n'y pas plus qu'à demander au serveur Puppet de signer notre certificat, car rappelons que PUPPET utilise le SSL, il est donc plus sécurisé qu'un NFS.
262 37 Maurice Vidal
263 39 Maurice Vidal
*pvm2# puppetd --waitforcert 60 --test*
264 37 Maurice Vidal
ou
265 39 Maurice Vidal
*pvm2# puppet agent --waitforcert 60 --test*
266 37 Maurice Vidal
267 37 Maurice Vidal
Le serveur va ensuite visualiser les demandes :
268 39 Maurice Vidal
*pvm1#puppetca --list*
269 37 Maurice Vidal
270 37 Maurice Vidal
Puis il va signer les demandes :
271 39 Maurice Vidal
*pvm1#puppetca --sign pvm2*			
272 37 Maurice Vidal
ou 
273 39 Maurice Vidal
*pvm1#puppetca --sign --all* 		(pour tous d'un coup)
274 37 Maurice Vidal
275 37 Maurice Vidal
Le serveur est prêt à l'emploi, et les clients ont un certificat signé. Passons à une configuration axé sur le déploiement de Bind et d'Unbound.
276 37 Maurice Vidal
277 37 Maurice Vidal
Tout d'abord laissez moi vous montrer à quoi va ressembler l'arborescence de votre serveur puppet :
278 37 Maurice Vidal
279 37 Maurice Vidal
!http://img15.hostingpics.net/pics/481782tree.jpg!
280 37 Maurice Vidal
281 37 Maurice Vidal
282 39 Maurice Vidal
Afin d'utiliser Puppet un minimum, nous allons lui demander de déployer UNBOUND sur une machine cliente (pvm2). Il va falloir configurer le serveur, ainsi /etc/puppet/fileserver.conf :
283 37 Maurice Vidal
284 37 Maurice Vidal
<pre>
285 37 Maurice Vidal
[files]
286 1 Laurent GUERBY
path /etc/puppet/files
287 39 Maurice Vidal
allow *.testdomain1.tetaneutral.net
288 1 Laurent GUERBY
</pre>
289 37 Maurice Vidal
290 1 Laurent GUERBY
Nous venons d'autoriser seulement les machines provenant du domaine à pouvoir recevoir des fichiers du répertoire /etc/puppet/files/
291 37 Maurice Vidal
292 37 Maurice Vidal
Il faut également créer le fichier : /etc/puppet/namespaceauth.conf et y rajouter :
293 37 Maurice Vidal
294 37 Maurice Vidal
<pre>
295 37 Maurice Vidal
[puppetrunner]
296 37 Maurice Vidal
allow *
297 37 Maurice Vidal
</pre>
298 37 Maurice Vidal
299 37 Maurice Vidal
300 37 Maurice Vidal
Le daemon du client va initialement interroger le fichier /etc/puppet/manifests/site.pp du serveur, c'est pourquoi dans ce fichier nous allons importer tous les fichiers .pp (spécialement conçu pour Puppet).
301 37 Maurice Vidal
/etc/puppet/manifests/site.pp :
302 37 Maurice Vidal
303 37 Maurice Vidal
<pre>
304 37 Maurice Vidal
import "node"
305 1 Laurent GUERBY
import "modules.pp"
306 37 Maurice Vidal
import "cron"
307 37 Maurice Vidal
</pre>
308 37 Maurice Vidal
309 37 Maurice Vidal
Ensuite pour éviter de déployer UNBOUND sur tous les nodes, nous allons spécifier lesquels vont recevoir la classe UNBOUND que nous créerons (dans le fichier init.pp du module Unbound). Ainsi dans le fichier /etc/puppet/manifests/node.pp :
310 37 Maurice Vidal
311 37 Maurice Vidal
<pre>
312 37 Maurice Vidal
node basenode {
313 37 Maurice Vidal
	include crontab
314 37 Maurice Vidal
}
315 39 Maurice Vidal
node 'pvm2.testdomain1.tetaneutral.net' inherits basenode {
316 37 Maurice Vidal
	include bind, resolv
317 39 Maurice Vidal
}
318 39 Maurice Vidal
node 'pvm3.testdomain1.tetaneutral.net' inherits basenode {
319 39 Maurice Vidal
	include unbound, resolv
320 37 Maurice Vidal
}</pre>
321 37 Maurice Vidal
322 39 Maurice Vidal
Ici nous créons un faux node (client puppet) nommé basenode en lui incluant la classe "crontab", et les nodes puppetli1 et pvm3 héritent de basenode (autrement dit de la classe crontab). Ensuite nous leurs attribuons la classe unbound et resolv pour pvm2 puis bind et resolv pour pvm3.
323 1 Laurent GUERBY
 
324 37 Maurice Vidal
Il faut également créer le fichier /etc/puppet/manifests/modules.pp qui va référencer les modules du serveur :
325 37 Maurice Vidal
326 37 Maurice Vidal
<pre>
327 37 Maurice Vidal
import "unbound"
328 37 Maurice Vidal
import "bind"
329 37 Maurice Vidal
</pre>
330 1 Laurent GUERBY
331 37 Maurice Vidal
On peut appeler un module, le nom d'un répertoire, en effet il est recommandé de créer des modules pour chaque service afin de rendre la configuration plus souple.
332 37 Maurice Vidal
333 37 Maurice Vidal
Pour finir sur la configuration de base, nous allons mettre en place un cron qui se déploiera sur les clients afin de lancer une synchronisation avec le serveur, ainsi quand le cron arrive à son échéance (15 minutes) il va permettre de checker toutes modifications du client puppet. Donc on va créer le fichier /etc/puppet/manifests/cron.pp :
334 1 Laurent GUERBY
335 37 Maurice Vidal
<pre>
336 37 Maurice Vidal
class crontab {
337 1 Laurent GUERBY
	cron { "synchronisation puppet":
338 39 Maurice Vidal
		command => "/usr/sbin/puppetd --test --server=pvm1.testdomain1.tetaneutral.net",
339 1 Laurent GUERBY
		minute => "*/15"
340 1 Laurent GUERBY
	}
341 37 Maurice Vidal
}
342 37 Maurice Vidal
</pre>
343 37 Maurice Vidal
344 1 Laurent GUERBY
Passons à la configuration des modules :
345 37 Maurice Vidal
346 37 Maurice Vidal
h3. Création des modules :
347 37 Maurice Vidal
348 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/unbound/{files,manifests,templates}*
349 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/bind/{files,manifests,templates}*
350 37 Maurice Vidal
351 37 Maurice Vidal
Le dossier MANIFESTS permet de répertorier le fichier init.pp qui défini le coeur du module.
352 37 Maurice Vidal
Le dossier FILES contient les fichiers statiques, ceux qui ne changent pas d'un node à l'autre.
353 37 Maurice Vidal
Le dossier TEMPLATES contient les fichiers de configurations variant d'un hôte à l'autre.
354 37 Maurice Vidal
355 37 Maurice Vidal
+Maintenant que les modules sont crées, nous plaçons le fichier de configuration d'Unbound que voici : /etc/puppet/modules/unbound/files/unbound.conf :+
356 37 Maurice Vidal
357 39 Maurice Vidal
Ici nous faisons la résolution du domaine : testdomain1.tetaneutral.net avec pour serveur DNS : pvm3
358 37 Maurice Vidal
359 37 Maurice Vidal
<pre>
360 37 Maurice Vidal
### Simple recursive caching DNS
361 37 Maurice Vidal
## /etc/unbound.conf
362 37 Maurice Vidal
server:
363 37 Maurice Vidal
	verbosity: 1
364 37 Maurice Vidal
 	outgoing-range: 60
365 39 Maurice Vidal
	interface: 91.224.149.37
366 1 Laurent GUERBY
 	do-ip4: yes
367 1 Laurent GUERBY
 	do-udp: yes
368 37 Maurice Vidal
	do-tcp: yes
369 37 Maurice Vidal
 	access-control: 0.0.0.0/0 allow         	#On autorise l’ensemble d’INTERNET à interroger le DNS
370 39 Maurice Vidal
 chroot: ""                                         			#Pas de chroot par défaut
371 37 Maurice Vidal
 logfile: "/var/log/unbound.log"         		#On défini le fichier de log
372 37 Maurice Vidal
 use-syslog: no                      			#Log par défaut dans syslog
373 37 Maurice Vidal
 hide-identity: yes             			
374 37 Maurice Vidal
 hide-version: yes              			
375 37 Maurice Vidal
 harden-glue: yes					#On dit que le serveur fait autorité sur la zone
376 39 Maurice Vidal
private-domain: "testdomain1.tetaneutral.net."  				#On définit le suffix dns du réseau local
377 39 Maurice Vidal
 local-zone: "testdomain1.tetaneutral.net." static				#on définit qui s'occupe de quoi dans le domaine
378 39 Maurice Vidal
local-data: "testdomain1.tetaneutral.net. IN MX 10 pvm5.testdomain1.tetaneutral.net." #serveur Postfix pvm5
379 40 Maurice Vidal
local-data: "testdomain1.tetaneutral.net. IN MX 20 pvm4.testdomain1.tetaneutral.net." #serveur Postfix pvm4
380 39 Maurice Vidal
local-data: "testdomain1.tetaneutral.net. IN NS pvm3.testdomain1.tetaneutral.net."		#service DNS
381 39 Maurice Vidal
local-data: "pvm1.testdomain1.tetaneutral.net. IN A 91.224.149.35"  	     	 #résolution : nom -> adresse
382 39 Maurice Vidal
local-data: "pvm2.testdomain1.tetaneutral.net. IN A 91.224.149.36"
383 39 Maurice Vidal
local-data: "pvm3.testdomain1.tetaneutral.net. IN A 91.224.149.37"
384 39 Maurice Vidal
local-data-ptr: "91.224.149.35 pvm1.testdomain1.tetaneutral.net." 		 #résolution inverse : adresse -> nom
385 39 Maurice Vidal
local-data-ptr: "91.224.149.36 pvm2.testdomain1.tetaneutral.net."
386 39 Maurice Vidal
local-data-ptr: "91.224.149.37 pvm3.testdomain1.tetaneutral.net."
387 37 Maurice Vidal
python:
388 37 Maurice Vidal
remote-control:
389 37 Maurice Vidal
forward-zone:
390 37 Maurice Vidal
	name: "."
391 39 Maurice Vidal
	forward-addr: 91.224.149.254	# DNS Faisant Authorité à tetaneutral.net
392 37 Maurice Vidal
</pre>
393 37 Maurice Vidal
394 37 Maurice Vidal
395 37 Maurice Vidal
Passons à la configuration du fichier principal : /etc/puppet/modules/unbound/manifests/init.pp :
396 37 Maurice Vidal
397 37 Maurice Vidal
<pre>
398 37 Maurice Vidal
class unbound {
399 37 Maurice Vidal
	package { unbound: ensure => installed }
400 37 Maurice Vidal
	file { "/etc/unbound/unbound.conf":
401 37 Maurice Vidal
		require => package["unbound"],		
402 1 Laurent GUERBY
		notify => Service["unbound"],
403 37 Maurice Vidal
		mode => 644,
404 37 Maurice Vidal
		owner => "root",
405 37 Maurice Vidal
		group => "root",
406 1 Laurent GUERBY
		source => "puppet:///modules/unbound/unbound.conf"
407 1 Laurent GUERBY
		}	
408 37 Maurice Vidal
	service { unbound: ensure => running,
409 37 Maurice Vidal
			enable => true
410 37 Maurice Vidal
	}	}
411 37 Maurice Vidal
class resolv {
412 1 Laurent GUERBY
	file { "/etc/resolv.conf":
413 37 Maurice Vidal
		require => Class["unbound"],
414 37 Maurice Vidal
		ensure => present,
415 39 Maurice Vidal
		content => "domain testdomain1.tetaneutral.net 
416 39 Maurice Vidal
search testdomain1.tetaneutral.net
417 37 Maurice Vidal
nameserver $ipaddress"
418 37 Maurice Vidal
	}
419 37 Maurice Vidal
}
420 37 Maurice Vidal
</pre>
421 37 Maurice Vidal
Pour la classe "unbound", nous venons de lui permettre d'installer le paquet UNBOUND, de lui déployer le fichier de configuration sur /etc/unbound/unbound.conf afin de remplacer l'existant et ensuite nous lui avons forçer le démarrage du daemon UNBOUND. Lors du déploiement d'un fichier, dans le paramètre SOURCE, remarquons qu'il n'est pas nécessaire de référencer le répertoire "files" dans le module, grâce au protocole qui est défini ici : puppet:///
422 37 Maurice Vidal
423 37 Maurice Vidal
Quant à la classe "resolv" est de type TEMPLATES, c'est à dire qu'elle est dynamique, elle s'adapte à l'hôte grâce à son adresse IP qui est remonté grâce aux facts (outils facter qui est compréhensible par PUPPET). En effet Facter est un outil associé à puppet, chargé d’énumérer les paramètres locaux d’un système :
424 1 Laurent GUERBY
*Adresse IP 
425 1 Laurent GUERBY
Hostname 
426 1 Laurent GUERBY
Distribution et version 
427 1 Laurent GUERBY
Toutes autres variables locales définies par l’utilisateur.*
428 1 Laurent GUERBY
429 37 Maurice Vidal
Il est disponible sur les noeuds utilisant Puppetd, il fournit des variables utilisables dans les templates puppet.
430 37 Maurice Vidal
431 37 Maurice Vidal
Configuration du module BIND 
432 37 Maurice Vidal
433 37 Maurice Vidal
Voici le fichier de configuration /etc/puppet/modules/bind/manifests/init.pp :
434 37 Maurice Vidal
435 37 Maurice Vidal
<pre>
436 37 Maurice Vidal
class bind {
437 1 Laurent GUERBY
	package { bind9: ensure => installed }
438 37 Maurice Vidal
	file { "/etc/bind/named.conf.local":
439 37 Maurice Vidal
		require => package ["bind9"],
440 37 Maurice Vidal
		ensure => present,
441 37 Maurice Vidal
		mode => 644,
442 37 Maurice Vidal
		owner => "root",
443 37 Maurice Vidal
		group => "bind",
444 1 Laurent GUERBY
		source => "puppet:///modules/bind/named.conf.local" }
445 37 Maurice Vidal
	file { "/etc/bind/named.conf.options":
446 37 Maurice Vidal
		require => package ["bind9"],
447 1 Laurent GUERBY
		ensure => present,
448 37 Maurice Vidal
		mode => 644,
449 1 Laurent GUERBY
                	owner => "root",
450 37 Maurice Vidal
              		 group => "bind",
451 1 Laurent GUERBY
                	source => "puppet:///modules/bind/named.conf.options" }
452 39 Maurice Vidal
	file { "/var/cache/bind/db.testdomain1.tetaneutral.net":
453 1 Laurent GUERBY
		require => package ["bind9"],
454 1 Laurent GUERBY
		ensure => present,
455 1 Laurent GUERBY
                	mode => 644,
456 1 Laurent GUERBY
               		 owner => "root",
457 37 Maurice Vidal
                	group => "bind",
458 39 Maurice Vidal
                	source => "puppet:///modules/bind/db.testdomain1.tetaneutral.net" }
459 39 Maurice Vidal
	file { "/var/cache/bind/rev.testdomain1.tetaneutral.net":
460 37 Maurice Vidal
		require => package ["bind9"],
461 1 Laurent GUERBY
                	ensure => present,
462 37 Maurice Vidal
                	mode => 644,
463 1 Laurent GUERBY
                	owner => "root",
464 37 Maurice Vidal
               		 group => "bind",
465 39 Maurice Vidal
                	source => "puppet:///modules/bind/rev.testdomain1.tetaneutral.net" }
466 1 Laurent GUERBY
	service { bind9: ensure => running, 
467 1 Laurent GUERBY
		enable => true ,
468 1 Laurent GUERBY
		require => package ["bind9"],
469 1 Laurent GUERBY
	}	 
470 1 Laurent GUERBY
}
471 1 Laurent GUERBY
</pre>
472 1 Laurent GUERBY
473 37 Maurice Vidal
Ici nous installons (si BIND n'est pas installé) le paquet, puis lui déployons les fichiers de configurations, puis le forçons à être démarré. Nous lui attribuons les droits 644 (par défaut sur Bind), puis le propriétaire root et le groupe bind. 
474 37 Maurice Vidal
Pareillement, ici nous remarquons que pour déployer le fichier, il n'est pas nécessaire de référencer le répertoire "files" dans le module, grâce au protocole qui est défini ici : puppet:///
475 37 Maurice Vidal
476 37 Maurice Vidal
Passons aux fichiers de configurations : /etc/puppet/modules/bind/files/named.conf.local :
477 37 Maurice Vidal
478 37 Maurice Vidal
<pre>
479 39 Maurice Vidal
// La zone primaire testdomain1.tetaneutral.net
480 39 Maurice Vidal
zone "testdomain1.tetaneutral.net" {
481 37 Maurice Vidal
      type master;
482 39 Maurice Vidal
      file "/var/cache/bind/db.testdomain1.tetaneutral.net"; };
483 37 Maurice Vidal
// La zone inverse
484 39 Maurice Vidal
zone "149.224.91.in-addr.arpa" {
485 37 Maurice Vidal
      type master;
486 39 Maurice Vidal
      file "/var/cache/bind/rev.testdomain1.tetaneutral.net";
487 37 Maurice Vidal
};
488 37 Maurice Vidal
</pre>
489 37 Maurice Vidal
490 37 Maurice Vidal
Puis le fichier : /etc/puppet/modules/bind/files/named.conf.options :
491 37 Maurice Vidal
492 37 Maurice Vidal
<pre>
493 37 Maurice Vidal
options {
494 37 Maurice Vidal
	directory "/var/cache/bind";
495 1 Laurent GUERBY
forwarders {
496 39 Maurice Vidal
 	91.224.149.254; 91.224.148.10; 8.8.8.8;
497 37 Maurice Vidal
 };
498 37 Maurice Vidal
	auth-nxdomain no;    # conform to RFC1035
499 37 Maurice Vidal
	listen-on { any; };
500 37 Maurice Vidal
	allow-query { any ; };
501 37 Maurice Vidal
};
502 37 Maurice Vidal
</pre>
503 37 Maurice Vidal
504 39 Maurice Vidal
Le fichier de zone primaire TESTDOMAIN1.TETANEUTRAL.net : /etc/puppet/modules/bind/files/db.testdomain1.tetaneutral.net :
505 1 Laurent GUERBY
506 1 Laurent GUERBY
<pre>
507 37 Maurice Vidal
;
508 39 Maurice Vidal
; BIND data file for testdomain1.tetaneutral.net
509 1 Laurent GUERBY
;
510 37 Maurice Vidal
$TTL    604800
511 39 Maurice Vidal
@       IN      SOA     pvm2.testdomain1.tetaneutral.net. admin.testdomain1.tetaneutral.net. (
512 37 Maurice Vidal
                 201205091         ; Serial
513 37 Maurice Vidal
                       604800         ; Refresh
514 37 Maurice Vidal
                        86400         ; Retry
515 37 Maurice Vidal
                      2419200         ; Expire
516 37 Maurice Vidal
                       604800 )       ; Negative Cache TTL
517 39 Maurice Vidal
@      	   IN      	NS      pvm2.testdomain1.tetaneutral.net.
518 39 Maurice Vidal
pvm1    	IN      	A       91.224.149.35
519 39 Maurice Vidal
pvm2    	IN      	A       91.224.149.36
520 39 Maurice Vidal
pvm3    	IN      	A       91.224.149.37
521 39 Maurice Vidal
pvm4    	IN      	MX	0	91.224.149.38
522 39 Maurice Vidal
pvm5    	IN      	MX	10	91.224.149.30
523 37 Maurice Vidal
</pre>
524 37 Maurice Vidal
525 39 Maurice Vidal
Et pour finir le fichier de zone inverse ARPA : /etc/puppet/modules/bind/rev.testdomain1.tetaneutral.net :
526 37 Maurice Vidal
527 37 Maurice Vidal
<pre>
528 37 Maurice Vidal
;
529 39 Maurice Vidal
; BIND data file for 91.224.149
530 37 Maurice Vidal
;
531 37 Maurice Vidal
$TTL    604800
532 39 Maurice Vidal
@       IN      SOA     pvm2.testdomain1.tetaneutral.net. (
533 37 Maurice Vidal
                 201209051         ; Serial
534 37 Maurice Vidal
                       604800         ; Refresh
535 37 Maurice Vidal
                        86400         ; Retry
536 1 Laurent GUERBY
                      2419200         ; Expire
537 37 Maurice Vidal
                       604800 )       ; Negative Cache TTL
538 39 Maurice Vidal
@      IN      NS      pvm2.testdomain1.tetaneutral.net.
539 39 Maurice Vidal
35	IN	PTR	pvm1.testdomain1.tetaneutral.net.
540 39 Maurice Vidal
36	IN	PTR	pvm2.testdomain1.tetaneutral.net.
541 39 Maurice Vidal
37	IN	PTR	pvm3.testdomain1.tetaneutral.net.
542 39 Maurice Vidal
38	IN	PTR	pvm4.testdomain1.tetaneutral.net.
543 39 Maurice Vidal
30	IN	PTR	pvm5.testdomain1.tetaneutral.net.
544 39 Maurice Vidal
545 1 Laurent GUERBY
</pre>
546 37 Maurice Vidal
547 37 Maurice Vidal
h3. *Configuration des templates* 
548 1 Laurent GUERBY
549 37 Maurice Vidal
Variables prédéfinie:
550 1 Laurent GUERBY
551 37 Maurice Vidal
Ici nous allons vous montrer comment on peut adapter les fichiers de configurations que nous déployons suivant le node.
552 1 Laurent GUERBY
Ainsi chaque node aura un paramètre différent d’un autre node, il s’agit du template. Nous allons prendre le cas du fichier de configuration d’Unbound. Sur le serveur Puppet il faut déplacer le fichier /etc/puppet/modules/unbound/files/unbound.conf dans /etc/puppet/modules/unbound/templates/unbound.conf.erb.
553 37 Maurice Vidal
554 37 Maurice Vidal
En effet lorsqu’on créé un template, il doit être sous l’extension "erb".
555 39 Maurice Vidal
En effet nous allons nous servir de la variable "ipaddress" disponible grâce à l’outil facter, ainsi en étant sur le client, il suffit de lancer la commande : *pvm2 # facter*	pour obtenir les informations des variables de la machine locale.
556 37 Maurice Vidal
557 37 Maurice Vidal
Nous allons renseigner la variable "ipaddress" grâce aux balises de début: <%=  et aux balises de fin: %>
558 37 Maurice Vidal
Ainsi :
559 37 Maurice Vidal
560 39 Maurice Vidal
Pvm1 *head /etc/puppet/modules/unbound/templates/unbound.conf.erb*
561 37 Maurice Vidal
562 37 Maurice Vidal
<pre>
563 37 Maurice Vidal
server:
564 37 Maurice Vidal
	verbosity: 1
565 37 Maurice Vidal
 	outgoing-range: 60
566 37 Maurice Vidal
	interface: <%=  ipaddress %>
567 37 Maurice Vidal
 	do-ip4: yes
568 37 Maurice Vidal
 	do-udp: yes
569 37 Maurice Vidal
	do-tcp: yes
570 39 Maurice Vidal
 	access-control: 91.224.149.0/24 allow         
571 37 Maurice Vidal
 chroot: ""                                         	
572 37 Maurice Vidal
 logfile: "/var/log/unbound.log"      
573 37 Maurice Vidal
</pre> 
574 37 Maurice Vidal
575 37 Maurice Vidal
A chaque fois que nous utiliserons les fichiers templates, il faudra changer le chemin source du fichier du serveur Puppet du fichier init.pp, dans cet exemple : /etc/puppet/modules/unbound/manifests/init.pp :
576 37 Maurice Vidal
On remplace : 	source => "puppet:///modules/unbound/unbound.conf" 
577 37 Maurice Vidal
Par :		content => template("/etc/puppet/modules/unbound/templates/unbound.conf.erb"),
578 37 Maurice Vidal
579 37 Maurice Vidal
h3. *Création de variables:*
580 37 Maurice Vidal
581 39 Maurice Vidal
Nous allons maintenant créer des variables qui s’utiliseront uniquement sur les nodes définis. Nous poursuivons sur l’exemple d’Unbound qui se déploiera sur le client : pvm2.testdomain1.tetaneutral.net. Dans un premier temps il faut créer la variable dans le fichier /etc/puppet/manifests/node.pp :
582 37 Maurice Vidal
583 39 Maurice Vidal
> node ‘pvm2.testdomain1.tetaneutral.net' inherits basenode { 
584 39 Maurice Vidal
> *$network = “91.224.149.0”*
585 39 Maurice Vidal
> include bind }
586 37 Maurice Vidal
587 37 Maurice Vidal
588 37 Maurice Vidal
Puis l’appliquer sur le fichier /etc/puppet/modules/unbound/templates/unbound.conf.erb :
589 39 Maurice Vidal
Pvm1 *head /etc/puppet/modules/unbound/templates/unbound.conf.erb*
590 37 Maurice Vidal
591 37 Maurice Vidal
<pre>
592 37 Maurice Vidal
server:
593 37 Maurice Vidal
	verbosity: 1
594 37 Maurice Vidal
 	outgoing-range: 60
595 37 Maurice Vidal
	interface: <%=  ipaddress %>
596 37 Maurice Vidal
 	do-ip4: yes
597 37 Maurice Vidal
 	do-udp: yes
598 37 Maurice Vidal
	do-tcp: yes
599 37 Maurice Vidal
 	access-control: <%= network %>/24 allow         
600 37 Maurice Vidal
 chroot: ""                                         	
601 37 Maurice Vidal
 logfile: "/var/log/unbound.log"      
602 37 Maurice Vidal
</pre> 
603 37 Maurice Vidal
604 37 Maurice Vidal
La mise en place de templates permet de gagner sensiblement du temps sur la configuration des postes, c’est d’ailleurs pour cette utilisation que l’outil facter a été développé. En effet Puppet sert surtout pour les déploiements massifs, le gain de temps et d'énergie est ainsi effectif.
605 37 Maurice Vidal
606 37 Maurice Vidal
h2. *LANCEMENT DE LA SYNCHRONISATION :*
607 37 Maurice Vidal
608 37 Maurice Vidal
Sur le serveur, il faut initier la connexion :
609 37 Maurice Vidal
*puppetmasterd --no-daemonize --debug*
610 37 Maurice Vidal
611 37 Maurice Vidal
Nous lançon le daemon en mode test, c'est à dire non-démon afin de débugger et vérifier que tout se déroule convenablement.
612 37 Maurice Vidal
613 37 Maurice Vidal
Si on rencontre un problème tel que :
614 37 Maurice Vidal
_Could not run: Could not create PID file: /var/run/puppet/master.pid_
615 37 Maurice Vidal
616 37 Maurice Vidal
Il faut alors supprimer le fichier sur le serveur : # *rm /var/run/puppet/master.pid* relancer la commande :
617 39 Maurice Vidal
*puppetmasterd --no-daemonize --debug*
618 37 Maurice Vidal
619 37 Maurice Vidal
Sur les clients on va vérifier le fichier du serveur /etc/puppet/site.pp avec la commande :
620 39 Maurice Vidal
*puppetd --test --server=pvm1.testdomain1.tetaneutral.net*
621 37 Maurice Vidal
622 39 Maurice Vidal
A savoir qu'un cron est mis en place afin d'éviter aux clients de renouveler cette commande manuellement, il faut noter que la commande du serveur : "puppetmasterd --no-daemonize -d" ne doit pas être arrêtée.
623 37 Maurice Vidal
624 37 Maurice Vidal
h2. Mise en place d'un DRBD et GFS2 par Puppet
625 37 Maurice Vidal
626 39 Maurice Vidal
*TOUT CE QUI EST DIT A PARTIR DE MAINTENANT DOIT ETRE IDENTIQUE SUR LES DEUX MACHINES, LANCER LES COMMANDES EN MEME TEMPS :*
627 37 Maurice Vidal
628 37 Maurice Vidal
Nous avons besoins de deux nouvelles machines :
629 37 Maurice Vidal
630 39 Maurice Vidal
Hostname : pvm4 = IP : 91.224.149.38
631 39 Maurice Vidal
Hosntame : pvm5 = IP : 91.224.149.30
632 37 Maurice Vidal
633 37 Maurice Vidal
h3. *Installation :*
634 37 Maurice Vidal
635 39 Maurice Vidal
Au préalable il faut un second disque dur sur chaque machines, de taille minimale de 2G. normalement il apparait tel que : /dev/vdb.
636 37 Maurice Vidal
Nous le partitionnons :
637 37 Maurice Vidal
638 39 Maurice Vidal
*cfdisk /dev/vdb*
639 1 Laurent GUERBY
NEW => LOGIQUE => Taille totale (faites entré) => WRITE => yes => "q" pour sortir
640 1 Laurent GUERBY
641 39 Maurice Vidal
A la suite de cela, nous obtenons la partition : /dev/vdb5.
642 37 Maurice Vidal
643 37 Maurice Vidal
h3. *Installation des outils :*
644 37 Maurice Vidal
645 39 Maurice Vidal
Sur le pvm1, nous allons créer deux nouveaux modules :
646 37 Maurice Vidal
647 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/drbd/{files,manifests,templates}*
648 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/gfs2/{files,manifests,templates}*
649 37 Maurice Vidal
650 37 Maurice Vidal
Puis on rajoute nos deux modules dans le fichier /etc/puppet/manifests/modules.pp :
651 37 Maurice Vidal
652 37 Maurice Vidal
<pre>
653 37 Maurice Vidal
import "drbd"
654 37 Maurice Vidal
import "gfs2"
655 37 Maurice Vidal
</pre>
656 37 Maurice Vidal
657 37 Maurice Vidal
Commençons par l'installation de drbd :
658 37 Maurice Vidal
659 37 Maurice Vidal
*vi /etc/puppet/modules/drbd/manifests/init.pp*
660 37 Maurice Vidal
661 37 Maurice Vidal
<pre>
662 37 Maurice Vidal
class drbd::package {
663 37 Maurice Vidal
	package { "drbd8-utils": ensure => installed }
664 37 Maurice Vidal
}
665 37 Maurice Vidal
class drbd::fic {
666 37 Maurice Vidal
	exec { "modprobe":
667 37 Maurice Vidal
		require => Class["drbd::package"],
668 37 Maurice Vidal
		command => "/sbin/modprobe drbd"
669 37 Maurice Vidal
	}
670 37 Maurice Vidal
	file { "/etc/drbd.d/global_common.conf":
671 37 Maurice Vidal
		require => Class["drbd::package"],
672 37 Maurice Vidal
		ensure => present,
673 37 Maurice Vidal
		source => "puppet:///modules/drbd/global_common.conf"
674 37 Maurice Vidal
	}
675 37 Maurice Vidal
	file { "/etc/drbd.d/r0.res":
676 37 Maurice Vidal
		require => Class["drbd::package"],
677 37 Maurice Vidal
		ensure => present,
678 37 Maurice Vidal
		content => template("/etc/puppet/modules/drbd/templates/r0.res.erb")
679 37 Maurice Vidal
	}
680 37 Maurice Vidal
}
681 37 Maurice Vidal
class drbd::command {
682 37 Maurice Vidal
	exec { "create_ressource":
683 37 Maurice Vidal
		require => File["/etc/drbd.d/r0.res"],
684 37 Maurice Vidal
		command => "/sbin/drbdadm create-md r0"
685 37 Maurice Vidal
	}
686 37 Maurice Vidal
	exec { "start_drbd":
687 37 Maurice Vidal
		require => create_ressource"],
688 37 Maurice Vidal
		command => "/usr/sbin/service drbd start"
689 1 Laurent GUERBY
	}
690 1 Laurent GUERBY
}
691 1 Laurent GUERBY
class drbd::cron1 {
692 1 Laurent GUERBY
	file { "/root/overwrite.sh":
693 1 Laurent GUERBY
		ensure => present,
694 1 Laurent GUERBY
		source => "puppet:///modules/drbd/overwrite.sh"
695 1 Laurent GUERBY
	}
696 1 Laurent GUERBY
	file { "/root/mkfs.sh":
697 1 Laurent GUERBY
		ensure => present,
698 1 Laurent GUERBY
		source => "puppet:///modules/drbd/mkfs.sh"
699 1 Laurent GUERBY
	}
700 1 Laurent GUERBY
}
701 37 Maurice Vidal
class drbd::cron1.1 {
702 37 Maurice Vidal
	cron { "cron_over":
703 37 Maurice Vidal
		require => Class["drbd::cron1"],
704 37 Maurice Vidal
		command => "/root/overwrite.sh",
705 37 Maurice Vidal
		hour => "*/2"
706 37 Maurice Vidal
	}
707 37 Maurice Vidal
	cron { "cron_mkfs":	
708 37 Maurice Vidal
		require => Class["drbd::cron1"],
709 37 Maurice Vidal
		command => "/root/mkfs.sh",
710 37 Maurice Vidal
		hour => "*/3",
711 37 Maurice Vidal
		minute => "*/10"
712 37 Maurice Vidal
	}
713 37 Maurice Vidal
}
714 37 Maurice Vidal
class drbd::cron2  {
715 37 Maurice Vidal
	file { "/root/primary.sh":
716 37 Maurice Vidal
		ensure => present,
717 37 Maurice Vidal
		source => "puppet:///modules/drbd/primary.sh"
718 37 Maurice Vidal
	}
719 37 Maurice Vidal
}
720 37 Maurice Vidal
class drbd::cron2.2 {
721 37 Maurice Vidal
	cron { "cron_primary":
722 37 Maurice Vidal
		require => Class["drbd::cron2"],
723 1 Laurent GUERBY
		command => "/root/primary.sh",
724 37 Maurice Vidal
		hour => "*/3"
725 37 Maurice Vidal
	}
726 37 Maurice Vidal
}
727 37 Maurice Vidal
class cron_supp {
728 37 Maurice Vidal
	file { "/root/supp.sh":
729 1 Laurent GUERBY
		ensure => present,
730 37 Maurice Vidal
		source => $hostname ? {
731 39 Maurice Vidal
			pvm4 => "puppet:///modules/drbd/supp.pvm4.sh",
732 39 Maurice Vidal
			pvm5 => "puppet:///modules/drbd/supp.pvm5.sh"
733 37 Maurice Vidal
		}
734 37 Maurice Vidal
	}
735 37 Maurice Vidal
	cron { "delete_cron":
736 37 Maurice Vidal
		require => File["/root/supp.sh"],
737 37 Maurice Vidal
		command => "/root/supp.sh",
738 37 Maurice Vidal
		hour => "*/3",
739 37 Maurice Vidal
		minute => "35"
740 37 Maurice Vidal
	}
741 37 Maurice Vidal
}
742 37 Maurice Vidal
</pre>
743 37 Maurice Vidal
744 37 Maurice Vidal
Puis nous mettons à disposition le fichier de configuration de drbd,
745 37 Maurice Vidal
*vi /etc/puppet/modules/drbd/files/global_common.conf*
746 37 Maurice Vidal
747 37 Maurice Vidal
<pre>
748 37 Maurice Vidal
global {
749 37 Maurice Vidal
	usage-count no;
750 37 Maurice Vidal
}
751 37 Maurice Vidal
common {
752 37 Maurice Vidal
	protocol C;
753 37 Maurice Vidal
	syncer {
754 37 Maurice Vidal
		rate 100M;
755 37 Maurice Vidal
	}
756 37 Maurice Vidal
}</pre>
757 37 Maurice Vidal
758 37 Maurice Vidal
Et on utilise un template pour l'autre partie du fichier de configuration,
759 37 Maurice Vidal
*vi /etc/puppet/modules/drbd/templates/r0.res.erb*
760 37 Maurice Vidal
761 37 Maurice Vidal
<pre>
762 37 Maurice Vidal
resource r0 {
763 37 Maurice Vidal
	device /dev/drbd0;
764 37 Maurice Vidal
	disk <%= disk %>;
765 37 Maurice Vidal
	meta-disk internal;
766 37 Maurice Vidal
	startup {
767 37 Maurice Vidal
		wfc-timeout 120;
768 37 Maurice Vidal
		degr-wfc-timeout 120;
769 37 Maurice Vidal
		become-primary-on both;
770 37 Maurice Vidal
	}
771 37 Maurice Vidal
	disk { on-io-error detach; }
772 37 Maurice Vidal
	net {
773 37 Maurice Vidal
		allow-two-primaries;
774 37 Maurice Vidal
		after-sb-0pri discard-zero-changes;
775 37 Maurice Vidal
		after-sb-1pri discard-secondary;
776 37 Maurice Vidal
		after-sb-2pri disconnect;
777 37 Maurice Vidal
	}
778 37 Maurice Vidal
	on <%= node1name %> {
779 37 Maurice Vidal
		address <%= node1ip %>:7788;
780 37 Maurice Vidal
	}
781 37 Maurice Vidal
		on <%= node2name %> {
782 37 Maurice Vidal
		address <%= node2ip %>:7788;
783 37 Maurice Vidal
	}
784 37 Maurice Vidal
}
785 37 Maurice Vidal
</pre>
786 37 Maurice Vidal
787 1 Laurent GUERBY
On va ensuite modifier sur le serveur Puppet le fichier :
788 1 Laurent GUERBY
/etc/puppet/manifests/node.pp :
789 37 Maurice Vidal
790 37 Maurice Vidal
<pre>
791 39 Maurice Vidal
node 'pvm4.testdomain1.tetaneutral.net' {
792 39 Maurice Vidal
	$pptmasterip = "91.224.149.35"
793 39 Maurice Vidal
	$pptmastername = "pvm1"
794 39 Maurice Vidal
	$pptmasterfqdn = "pvm1.testdomain1.tetaneutral.net"
795 39 Maurice Vidal
	$node1ip = "91.224.149.38"
796 39 Maurice Vidal
	$node1name = "pvm4"
797 39 Maurice Vidal
	$node1fqdn = "pvm4.testdomain1.tetaneutral.net"
798 39 Maurice Vidal
	$node2ip = "91.224.149.30"
799 39 Maurice Vidal
	$node2name = "pvm5"
800 39 Maurice Vidal
	$node2fqdn = "pvm5.testdomain1.tetaneutral.net"
801 39 Maurice Vidal
	$disk = "/dev/vdb5"
802 37 Maurice Vidal
	include drbd::package, drbd::fic, drbd::command, drbd::cron1, drbd::cron1.1, cron_supp
803 1 Laurent GUERBY
}
804 39 Maurice Vidal
node 'pvm5.testdomain1.tetaneutral.net' {
805 39 Maurice Vidal
	$pptmasterip = "91.224.149.35"
806 39 Maurice Vidal
	$pptmastername = "pvm1"
807 39 Maurice Vidal
	$pptmasterfqdn = "pvm1.testdomain1.tetaneutral.net"
808 39 Maurice Vidal
	$node1ip = "91.224.149.38"
809 39 Maurice Vidal
	$node1name = "pvm4"
810 39 Maurice Vidal
	$node1fqdn = "pvm4.testdomain1.tetaneutral.net"
811 39 Maurice Vidal
	$node2ip = "91.224.149.30"
812 39 Maurice Vidal
	$node2name = "pvm5"
813 39 Maurice Vidal
	$node2fqdn = "pvm5.testdomain1.tetaneutral.net"
814 39 Maurice Vidal
	$disk = "/dev/vdb5"
815 37 Maurice Vidal
	include drbd::package, drbd::fic, drbd::command, drbd::cron2, drbd::cron2.2, cron_supp
816 37 Maurice Vidal
}
817 37 Maurice Vidal
</pre>
818 37 Maurice Vidal
819 37 Maurice Vidal
Maintenant voyons les fichiers bash que nous utiliserons pour les différents 'cron' :
820 37 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/overwrite.sh*
821 37 Maurice Vidal
<pre>
822 1 Laurent GUERBY
#!/bin/bash
823 1 Laurent GUERBY
drbdadm -- --overwrite-data-of-peer primary r0
824 1 Laurent GUERBY
</pre>
825 37 Maurice Vidal
826 1 Laurent GUERBY
*cat /etc/puppet/modules/drbd/files/mkfs.sh*
827 37 Maurice Vidal
<pre>
828 37 Maurice Vidal
#!/bin/bash
829 37 Maurice Vidal
mkfs.gfs2 -t cluster1:gfs2 -p lock_dlm -j 2 /dev/drbd0
830 37 Maurice Vidal
</pre>
831 37 Maurice Vidal
832 37 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/primary.sh*
833 37 Maurice Vidal
<pre>
834 1 Laurent GUERBY
#!/bin/bash
835 37 Maurice Vidal
drbdadm primary r0
836 37 Maurice Vidal
</pre>
837 1 Laurent GUERBY
838 39 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/supp.pvm4.sh*
839 37 Maurice Vidal
<pre>
840 37 Maurice Vidal
#!/bin/bash
841 37 Maurice Vidal
rm -r /root/overwrite.sh
842 37 Maurice Vidal
rm -r /root/mkfs.sh
843 37 Maurice Vidal
</pre>
844 37 Maurice Vidal
845 39 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/supp.pvm5.sh*
846 1 Laurent GUERBY
<pre>
847 1 Laurent GUERBY
#!/bin/bash
848 1 Laurent GUERBY
rm -r /root/primary.sh
849 1 Laurent GUERBY
</pre>
850 1 Laurent GUERBY
851 37 Maurice Vidal
Ne pas oublier de mettre le droit d'execution aux fichier bash avec cette commande :
852 37 Maurice Vidal
<pre>
853 37 Maurice Vidal
chmod 744 /etc/puppet/modules/drbd/files/*.sh
854 1 Laurent GUERBY
</pre>
855 37 Maurice Vidal
856 37 Maurice Vidal
Il y a des commandes à faire manuellement, moi j'ai préféré utiliser l'ordonnanceur cron.
857 37 Maurice Vidal
858 37 Maurice Vidal
Passons à la configuration de GFS2 :
859 37 Maurice Vidal
860 37 Maurice Vidal
*cat /etc/puppet/modules/gfs2/manifests/init.pp*
861 37 Maurice Vidal
<pre>
862 37 Maurice Vidal
class gfs2::package {
863 37 Maurice Vidal
	package { "cman": ensure => installed }
864 37 Maurice Vidal
	package { "gfs2-tools": ensure => installed }
865 37 Maurice Vidal
	package { "libopenais-dev": ensure => installed }
866 37 Maurice Vidal
}
867 37 Maurice Vidal
class gfs2::fic {
868 37 Maurice Vidal
	file { "/etc/cluster/cluster.conf":
869 37 Maurice Vidal
		require => Class["gfs2::package"],
870 37 Maurice Vidal
		ensure => present,
871 37 Maurice Vidal
		source => "puppet:///modules/gfs2/cluster.conf"
872 37 Maurice Vidal
	}
873 37 Maurice Vidal
}
874 1 Laurent GUERBY
class gfs2::command {
875 1 Laurent GUERBY
	exec { "stop_network_manager":
876 37 Maurice Vidal
		require => Class["gfs2::fic"],
877 37 Maurice Vidal
		command => "/usr/sbin/service network-manager stop"
878 1 Laurent GUERBY
	}
879 37 Maurice Vidal
	exec { "start_cman":
880 37 Maurice Vidal
		require => Exec["stop_network_manager"],
881 37 Maurice Vidal
		command => "/usr/sbin/service cman start"
882 1 Laurent GUERBY
	}
883 37 Maurice Vidal
}
884 37 Maurice Vidal
class gfs2::hosts {
885 37 Maurice Vidal
	file { "/etc/hosts":
886 37 Maurice Vidal
		require => Class["gfs2::package"],
887 37 Maurice Vidal
		ensure => present,
888 37 Maurice Vidal
		content => template("/etc/puppet/modules/gfs2/templates/hosts.erb")
889 37 Maurice Vidal
	}
890 37 Maurice Vidal
}
891 37 Maurice Vidal
</pre>
892 37 Maurice Vidal
893 37 Maurice Vidal
Nous voulons être sûr que nos deux machines puissent se joindre :
894 37 Maurice Vidal
*cat /etc/puppet/modules/gfs2/templates/hosts.erb*
895 37 Maurice Vidal
<pre>
896 37 Maurice Vidal
127.0.0.1 		localhost
897 37 Maurice Vidal
<%= pptmasterip %>	<%= pptmastername %>	<%= pptmasterfqdn %>
898 37 Maurice Vidal
<%= node1ip %>		<%= node1name %>	<%= node1fqdn %>
899 37 Maurice Vidal
<%= node2ip %>		<%= node2name %>	<%= node2fqdn %>
900 37 Maurice Vidal
</pre>
901 37 Maurice Vidal
902 37 Maurice Vidal
Il faut également modifier le fichier /etc/puppet/manifests/node.pp afin de rajouter les classes gfs :
903 37 Maurice Vidal
904 39 Maurice Vidal
> node 'pvm4.testdomain1.tetaneutral.net' {
905 1 Laurent GUERBY
>...
906 39 Maurice Vidal
> 	$disk = "/dev/vdb5"
907 37 Maurice Vidal
>	include drbd::package, drbd::fic, drbd::command, drbd::cron1, drbd::cron1.1, cron_supp, *gfs2::package, gfs2::fic, gfs2::command, gfs2::hosts* 
908 37 Maurice Vidal
>}
909 1 Laurent GUERBY
>
910 39 Maurice Vidal
> node 'pvm5.testdomain1.tetaneutral.net' {
911 37 Maurice Vidal
>... 	
912 39 Maurice Vidal
> 	$disk = "/dev/vdb5"
913 37 Maurice Vidal
>	include drbd::package, drbd::fic, drbd::command, drbd::cron2, drbd::cron2.2, cron_supp, *gfs2::package, gfs2::fic, gfs2::command, gfs2::hosts* 
914 1 Laurent GUERBY
>}
915 37 Maurice Vidal
916 37 Maurice Vidal
Il ne reste plus que le fichier de configuration du cluster, cependant à cause de sa forme (composé de balises) :
917 37 Maurice Vidal
Ainsi le fichier /etc/puppet/modules/gfs2/files/cluster.conf :
918 37 Maurice Vidal
919 37 Maurice Vidal
<pre>
920 37 Maurice Vidal
<?xml version="1.0"?>
921 37 Maurice Vidal
<cluster name="cluster1" config_version="3">
922 37 Maurice Vidal
<cman two_node="1" expected_votes="1"/>
923 37 Maurice Vidal
<clusternodes>
924 39 Maurice Vidal
<clusternode name="pvm4" votes="1" nodeid="1">
925 1 Laurent GUERBY
        <fence>
926 1 Laurent GUERBY
                <method name="single">
927 39 Maurice Vidal
                        <device name="manual" ipaddr="91.224.149.38"/>
928 37 Maurice Vidal
                </method>
929 37 Maurice Vidal
        </fence>
930 37 Maurice Vidal
</clusternode>
931 39 Maurice Vidal
<clusternode name="pvm5" votes="1" nodeid="2">
932 37 Maurice Vidal
        <fence>
933 37 Maurice Vidal
                <method name="single">
934 39 Maurice Vidal
                        <device name="manual" ipaddr="91.224.149.30"/>
935 37 Maurice Vidal
                </method>
936 37 Maurice Vidal
        </fence>
937 37 Maurice Vidal
</clusternode>
938 37 Maurice Vidal
</clusternodes>
939 1 Laurent GUERBY
<fence_daemon clean_start="1" post_fail_delay="0" post_join_delay="3"/>
940 37 Maurice Vidal
<fencedevices>
941 37 Maurice Vidal
        <fencedevice name="manual" agent="fence_manual"/>
942 37 Maurice Vidal
</fencedevices>
943 37 Maurice Vidal
</cluster>
944 37 Maurice Vidal
</pre>
945 37 Maurice Vidal
946 37 Maurice Vidal
Ici ce qui importe c'est le nom du cluster que l'on y donne (important pour la suite) et le numéro de la version :
947 37 Maurice Vidal
cluster name= *cluster1* config_version= *3* (pour connaitre le numéro de la version : *apt-cache policy gfs2-tools* )
948 39 Maurice Vidal
Egalement le nom des nos noeuds : clusternode name= *pvm4* votes="1" nodeid= *1*
949 39 Maurice Vidal
Et pour finir l'adresse IP : device name="manual" ipaddr= *91.224.149.38*
950 37 Maurice Vidal
951 39 Maurice Vidal
Puis sur le Pvm1 on lance la commande :
952 39 Maurice Vidal
*puppetmasterd --no-daemonize --debug*
953 37 Maurice Vidal
954 1 Laurent GUERBY
Et sur les clients :
955 39 Maurice Vidal
*puppetd --test --server=pvm1.testdomain1.tetaneutral.net*
956 37 Maurice Vidal
957 37 Maurice Vidal
+On vérifie :+
958 37 Maurice Vidal
Sur les machines clientes, on peut aller vérifier le raid1 :
959 37 Maurice Vidal
*service drbd status*
960 37 Maurice Vidal
961 1 Laurent GUERBY
Nous voyons que nous sommes à Primary/Primary UpToDate/UpToDate 
962 1 Laurent GUERBY
Ici les machines sont en attentes d'un montage.
963 37 Maurice Vidal
964 39 Maurice Vidal
Maintenant il ne reste plus qu'à créer un répertoire, sur la pvm4 :
965 37 Maurice Vidal
*mkdir -p /media/cluster/drbd*
966 37 Maurice Vidal
*mount -t gfs2 /dev/drbd0 /media/cluster/drbd*
967 37 Maurice Vidal
968 39 Maurice Vidal
Et, sur la pvm5 :
969 37 Maurice Vidal
*mkdir -p /media/clusterdata/drbd*
970 37 Maurice Vidal
*mount -t gfs2 /dev/drbd0 /media/clusterdata/drbd*
971 37 Maurice Vidal
972 37 Maurice Vidal
h3. *Vérification :*
973 37 Maurice Vidal
974 37 Maurice Vidal
On vérifie :
975 37 Maurice Vidal
*service drbd status*
976 37 Maurice Vidal
977 37 Maurice Vidal
+Il faut que l'on voie nos points de montage.+
978 37 Maurice Vidal
979 39 Maurice Vidal
Sur une machine, n'importe laquelle, écrivez sur votre point de montage, par exemple pvm4 :
980 39 Maurice Vidal
*touch /media/cluster/drbd/pvm4.txt*
981 37 Maurice Vidal
*ls /media/cluster/drbd*
982 39 Maurice Vidal
On voit notre fichier : pvm4.txt
983 37 Maurice Vidal
984 39 Maurice Vidal
Sur l'autre node du cluster (pvm5) :
985 37 Maurice Vidal
*ls /media/clusterdata/drbd*
986 39 Maurice Vidal
On voit notre fichier : pvm4.txt
987 37 Maurice Vidal
988 37 Maurice Vidal
Pour voir les log du cluster :
989 37 Maurice Vidal
*tailf /var/log/cluster/corosync.log*
990 37 Maurice Vidal
991 39 Maurice Vidal
Grâce à GFS2, il n'est pas nécessaire de démonter le point de montage sur le node (pvm5) puis de le remonter afin de voir les écritures, en effet l'écriture se fait mais on ne peut la visualiser tant que le umount/mount n'a pas été réalisé.
992 37 Maurice Vidal
993 37 Maurice Vidal
h3. A la fin de la page je met à disposition un tuto (sans puppet) de l'installation d'un Cluster DRBD GFS2.
994 37 Maurice Vidal
995 37 Maurice Vidal
h2. Mise en place d'un Postfix avec authentification LDAP Sans Puppet (Pas fini)
996 37 Maurice Vidal
997 37 Maurice Vidal
*Le projet n'est pas terminé, j'ai beaucoup travaillé mais j'ai manqué de logique, de bons tutoriels et de temps aussi, j'ai mis beaucoup du temps à comprendre Puppet =(*
998 37 Maurice Vidal
999 37 Maurice Vidal
Grâce au DRBD, les messages ne sont pas perdu, ils sont accessibles par les deux serveurs Postfix. Le but ici est d'avoir des utilisateurs qui peuvent envoyer des mails sur les deux serveurs de messageries (utilisation de Ldap préférable à un serveur NIS).
1000 37 Maurice Vidal
1001 37 Maurice Vidal
h3. Installer LDAP :
1002 37 Maurice Vidal
1003 37 Maurice Vidal
*apt-get install slapd ldap-utils*
1004 37 Maurice Vidal
*dpkg-reconfigure slapd*
1005 37 Maurice Vidal
1006 37 Maurice Vidal
Si on ne reconfigure pas ldap (à l'heure des dépôts actuels), il n'est pas possible de se connecter à l'annuaire ldap, que ce soit pour ajouter des entrées avec la commande #ldapadd (erreur : Invalid Credential (49)) car on voit qu'avec la commande #slapcat, le domaine n'est pas celui que nous avons créé dans /etc/ldap/slapd.conf, mais il s'agit du domaine : "nodomain".
1007 37 Maurice Vidal
1008 37 Maurice Vidal
A la suite de l'installation, il est nécessaire d'avoir le fichier de configuration /etc/ldap/slapd.conf. Pour cela il faut le copier :
1009 37 Maurice Vidal
*cp /usr/share/doc/slapd/example/slapd.conf /etc/ldap/*
1010 37 Maurice Vidal
1011 37 Maurice Vidal
Ensuite il faut modifier le fichier slapd.conf
1012 37 Maurice Vidal
<pre>
1013 39 Maurice Vidal
suffix          "dc=testdomain1.tetaneutral,dc=net"
1014 39 Maurice Vidal
rootdn          "cn=admin,dc=testdomain1.tetaneutral,dc=net"
1015 37 Maurice Vidal
password-hash   SSHA
1016 37 Maurice Vidal
rootpw          {SSHA}zmQHHtuIgyentPKrBw3lkNHN6JSVg/UW
1017 37 Maurice Vidal
access to attrs=userPassword,shadowLastChange
1018 39 Maurice Vidal
        by dn="cn=admin,dc=testdomain1.tetaneutral,dc=net" write
1019 37 Maurice Vidal
        by anonymous auth
1020 37 Maurice Vidal
        by self write
1021 37 Maurice Vidal
        by * none
1022 37 Maurice Vidal
access to *
1023 39 Maurice Vidal
        by dn="cn=admin,dc=dtestdomain1.tetaneutral,dc=net" write
1024 37 Maurice Vidal
        by * none
1025 37 Maurice Vidal
</pre>
1026 37 Maurice Vidal
1027 37 Maurice Vidal
h3. On peut ensuite installer les serveurs de messageries :
1028 37 Maurice Vidal
1029 37 Maurice Vidal
*apt-get install courier-ldap postfix postfix-ldap*
1030 37 Maurice Vidal
1031 37 Maurice Vidal
On peut rajouter des schema fournis par ldap :
1032 37 Maurice Vidal
*cp /usr/share/doc/courier-authlib-ldap/authldap.schema.gz /etc/ldap/schema*
1033 37 Maurice Vidal
*gunzip /etc/ldap/schema/authldap.schema.gz*
1034 37 Maurice Vidal
1035 37 Maurice Vidal
Et rajouter son chemin dans /etc/ldap/slapd.conf :
1036 37 Maurice Vidal
<pre>
1037 37 Maurice Vidal
include /etc/ldap/schema/authldap.schema
1038 37 Maurice Vidal
</pre>
1039 37 Maurice Vidal
1040 37 Maurice Vidal
On redémarre :
1041 37 Maurice Vidal
*service slapd restart*
1042 37 Maurice Vidal
1043 37 Maurice Vidal
Il faut ensuite ajouter des entrées, le mieux c'est avec *phpldapadmin* à l'adresse 127.0.0.1/phpldapadmin, mais avec l'editeur de texte -emacs- *vi et les fichiers .ldif on va plus vite =))*
1044 37 Maurice Vidal
1045 37 Maurice Vidal
*vi exemple-type.ldif*
1046 37 Maurice Vidal
<pre>
1047 39 Maurice Vidal
dn: ou=people, dc=testdomain1.tetaneutral, dc=net
1048 37 Maurice Vidal
objectclass: top 
1049 37 Maurice Vidal
objectclass: organizationalUnit 
1050 37 Maurice Vidal
ou: people 
1051 37 Maurice Vidal
1052 39 Maurice Vidal
dn: cn=gp_tech, ou=people, dc=testdomain1.tetaneutral, dc=net 
1053 37 Maurice Vidal
objectClass: top 
1054 37 Maurice Vidal
objectClass: posixGroup 
1055 37 Maurice Vidal
cn: gp_tech
1056 37 Maurice Vidal
gidNumber: 1111 
1057 37 Maurice Vidal
1058 39 Maurice Vidal
dn: uid=toto1, ou=people, dc=testdomain1.tetaneutral, dc=net
1059 37 Maurice Vidal
objectClass: top 
1060 37 Maurice Vidal
objectClass: posixAccount 
1061 37 Maurice Vidal
objectClass: inetOrgPerson 
1062 37 Maurice Vidal
uid: toto 
1063 37 Maurice Vidal
cn: toto un 
1064 37 Maurice Vidal
sn: toto 
1065 37 Maurice Vidal
givenName: un 
1066 37 Maurice Vidal
uidNumber: 2200 
1067 37 Maurice Vidal
gidNumber: 1111 
1068 37 Maurice Vidal
homeDirectory: /home/toto1 
1069 37 Maurice Vidal
userPassword: mdp2toto1 
1070 39 Maurice Vidal
mail: toto1@testdomain1.tetaneutral.net 
1071 37 Maurice Vidal
1072 39 Maurice Vidal
dn: uid=toto2,ou=people,dc=testdomain1.tetaneutral,dc=net
1073 37 Maurice Vidal
objectClass: top
1074 37 Maurice Vidal
objectClass: inetOrgPerson
1075 37 Maurice Vidal
objectClass: posixAccount
1076 37 Maurice Vidal
uid: toto2
1077 37 Maurice Vidal
cn: toto deux
1078 37 Maurice Vidal
sn: toto
1079 37 Maurice Vidal
uidNumber: 2201
1080 37 Maurice Vidal
gidNumber: 1111
1081 39 Maurice Vidal
mail: toto2@testdomain1.tetaneutral.net
1082 37 Maurice Vidal
homeDirectory: /home/toto2
1083 37 Maurice Vidal
userPassword: mdp2toto2
1084 37 Maurice Vidal
</pre>
1085 37 Maurice Vidal
1086 37 Maurice Vidal
On applique ce changement d'arborescence :
1087 39 Maurice Vidal
*ldapadd -x -f exemple_type.ldif -D cn=admin,dc=testdomain1.tetaneutral,dc=net -W*
1088 37 Maurice Vidal
1089 37 Maurice Vidal
h3. *Configuration de Postfix*
1090 37 Maurice Vidal
1091 37 Maurice Vidal
Il faut modifier le fichier de conf du serveur de messagerie:
1092 37 Maurice Vidal
*vi /etc/postfix/main.cf*
1093 37 Maurice Vidal
1094 37 Maurice Vidal
<pre>
1095 37 Maurice Vidal
...
1096 37 Maurice Vidal
local_recipient_maps = ldap:/etc/postfix/ldap_local_recipient.cf
1097 37 Maurice Vidal
...
1098 37 Maurice Vidal
</pre>
1099 37 Maurice Vidal
1100 37 Maurice Vidal
Puis on créé le fichier ldap_local_recipient.cf :
1101 37 Maurice Vidal
1102 37 Maurice Vidal
<pre>
1103 39 Maurice Vidal
server_host = 91.224.149.38
1104 37 Maurice Vidal
server_port = 389
1105 39 Maurice Vidal
search_base = dc=testdomain1.tetaneutral,dc=net
1106 1 Laurent GUERBY
# le %s signifie "adresse du destinataire telle que fourni par la commande "RCPT TO:"
1107 1 Laurent GUERBY
query_filter = (mail=%s)
1108 1 Laurent GUERBY
result_attribute = mail
1109 1 Laurent GUERBY
</pre>
1110 1 Laurent GUERBY
1111 1 Laurent GUERBY
On peut vérifier si notre serveur de messagerie peut joindre l'annuaire ldap :
1112 39 Maurice Vidal
*postmap -q toto1@testdomain1.tetaneutral.net ldap:/etc/postfix/ldap_local_recipient.cf*
1113 1 Laurent GUERBY
1114 39 Maurice Vidal
Le problème c'est que quand je fais un : *telnet 91.224.149.38 25* c'est que le mail est expédié, seulement il n'est pas envoyé à la boite mail, réponse des logs : status=bounced (unknown user: "toto1").