Projet

Général

Profil

StageVidal » Historique » Version 40

Maurice Vidal, 21/05/2012 20:53

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 39 Maurice Vidal
Nous prenons l'exemple que notre serveur Puppet à pour hostname : pvm1, et nos clients portent le nom de : pvm2, pvm3.
200 37 Maurice Vidal
201 39 Maurice Vidal
Comme nom de domaine nous prenons l'exemple de l'université de Perpignan : testdomain1.tetaneutral.net
202 1 Laurent GUERBY
203 37 Maurice Vidal
*Et les adresses IP sont donc :*
204 37 Maurice Vidal
205 39 Maurice Vidal
pvm1 : 91.224.149.35
206 39 Maurice Vidal
pvm2 : 91.224.149.36
207 39 Maurice Vidal
pvm3 : 91.224.149.37
208 39 Maurice Vidal
pvm4 : 91.224.149.38
209 39 Maurice Vidal
pvm5 : 91.224.149.30
210 37 Maurice Vidal
211 37 Maurice Vidal
h3. *Installation de Puppet*
212 37 Maurice Vidal
213 39 Maurice Vidal
Serveur :	# apt-get install pvm1
214 37 Maurice Vidal
Clients : 	# apt-get install puppet
215 37 Maurice Vidal
216 37 Maurice Vidal
Ici nous utilisons la version 2.6.2 de Puppet. Lors de l’installation, un utilisateur « puppet » sera créé.
217 37 Maurice Vidal
218 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 :
219 37 Maurice Vidal
220 39 Maurice Vidal
91.224.149.35	pvm1	pvm1.testdomain1.tetaneutral.net
221 37 Maurice Vidal
222 37 Maurice Vidal
De même sur le serveur il faut rajouter les noms des 3 machines clientes de la même façon.
223 37 Maurice Vidal
A ce stade nous n'avons pas de serveurs DNS, justement nous allons le(s) déployer :)
224 37 Maurice Vidal
225 37 Maurice Vidal
Il est important (si l'on a un pare-feu) d'ouvrir les ports 8140 coté serveur :
226 39 Maurice Vidal
*iptables -A INPUT -p tcp -m state --state NEW -s 91.224.149.0/24 --dport 8140 -j ACCEPT*
227 37 Maurice Vidal
228 37 Maurice Vidal
De plus il est important de pouvoir regarder les logs (tant sur le serveur que sur les clients) :
229 37 Maurice Vidal
*tailf /var/log/daemon.log*			
230 37 Maurice Vidal
231 37 Maurice Vidal
h3. *Configuration de Puppet*
232 37 Maurice Vidal
233 37 Maurice Vidal
DEMANDE DE CERTIFICAT
234 37 Maurice Vidal
235 37 Maurice Vidal
*Serveur :*
236 37 Maurice Vidal
Il faut modifier le fichier /etc/puppet/puppet.conf, il doit ressembler à ceci :
237 37 Maurice Vidal
238 37 Maurice Vidal
<pre>
239 37 Maurice Vidal
[main]
240 1 Laurent GUERBY
logdir=/var/log/puppet
241 37 Maurice Vidal
vardir=/var/lib/puppet
242 37 Maurice Vidal
ssldir=/var/lib/puppet/ssl
243 37 Maurice Vidal
rundir=/var/run/puppet
244 1 Laurent GUERBY
factpath=$vardir/lib/facter
245 1 Laurent GUERBY
templatedir=$confdir/templates
246 37 Maurice Vidal
247 1 Laurent GUERBY
[master]
248 37 Maurice Vidal
report=true
249 1 Laurent GUERBY
reports=log,store
250 1 Laurent GUERBY
modulepath=/etc/puppet/modules
251 37 Maurice Vidal
</pre>
252 37 Maurice Vidal
253 37 Maurice Vidal
*Clients :*
254 37 Maurice Vidal
255 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 :
256 37 Maurice Vidal
257 37 Maurice Vidal
<pre>
258 1 Laurent GUERBY
[main]
259 37 Maurice Vidal
...
260 39 Maurice Vidal
server=pvm1.testdomain1.tetaneutral.net
261 37 Maurice Vidal
</pre>
262 1 Laurent GUERBY
263 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.
264 37 Maurice Vidal
265 39 Maurice Vidal
*pvm2# puppetd --waitforcert 60 --test*
266 37 Maurice Vidal
ou
267 39 Maurice Vidal
*pvm2# puppet agent --waitforcert 60 --test*
268 37 Maurice Vidal
269 37 Maurice Vidal
Le serveur va ensuite visualiser les demandes :
270 39 Maurice Vidal
*pvm1#puppetca --list*
271 37 Maurice Vidal
272 37 Maurice Vidal
Puis il va signer les demandes :
273 39 Maurice Vidal
*pvm1#puppetca --sign pvm2*			
274 37 Maurice Vidal
ou 
275 39 Maurice Vidal
*pvm1#puppetca --sign --all* 		(pour tous d'un coup)
276 37 Maurice Vidal
277 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.
278 37 Maurice Vidal
279 37 Maurice Vidal
Tout d'abord laissez moi vous montrer à quoi va ressembler l'arborescence de votre serveur puppet :
280 37 Maurice Vidal
281 37 Maurice Vidal
!http://img15.hostingpics.net/pics/481782tree.jpg!
282 37 Maurice Vidal
283 37 Maurice Vidal
284 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 :
285 37 Maurice Vidal
286 37 Maurice Vidal
<pre>
287 37 Maurice Vidal
[files]
288 1 Laurent GUERBY
path /etc/puppet/files
289 39 Maurice Vidal
allow *.testdomain1.tetaneutral.net
290 1 Laurent GUERBY
</pre>
291 37 Maurice Vidal
292 1 Laurent GUERBY
Nous venons d'autoriser seulement les machines provenant du domaine à pouvoir recevoir des fichiers du répertoire /etc/puppet/files/
293 37 Maurice Vidal
294 37 Maurice Vidal
Il faut également créer le fichier : /etc/puppet/namespaceauth.conf et y rajouter :
295 37 Maurice Vidal
296 37 Maurice Vidal
<pre>
297 37 Maurice Vidal
[puppetrunner]
298 37 Maurice Vidal
allow *
299 37 Maurice Vidal
</pre>
300 37 Maurice Vidal
301 37 Maurice Vidal
302 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).
303 37 Maurice Vidal
/etc/puppet/manifests/site.pp :
304 37 Maurice Vidal
305 37 Maurice Vidal
<pre>
306 37 Maurice Vidal
import "node"
307 1 Laurent GUERBY
import "modules.pp"
308 37 Maurice Vidal
import "cron"
309 37 Maurice Vidal
</pre>
310 37 Maurice Vidal
311 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 :
312 37 Maurice Vidal
313 37 Maurice Vidal
<pre>
314 37 Maurice Vidal
node basenode {
315 37 Maurice Vidal
	include crontab
316 37 Maurice Vidal
}
317 39 Maurice Vidal
node 'pvm2.testdomain1.tetaneutral.net' inherits basenode {
318 37 Maurice Vidal
	include bind, resolv
319 39 Maurice Vidal
}
320 39 Maurice Vidal
node 'pvm3.testdomain1.tetaneutral.net' inherits basenode {
321 39 Maurice Vidal
	include unbound, resolv
322 37 Maurice Vidal
}</pre>
323 37 Maurice Vidal
324 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.
325 1 Laurent GUERBY
 
326 37 Maurice Vidal
Il faut également créer le fichier /etc/puppet/manifests/modules.pp qui va référencer les modules du serveur :
327 37 Maurice Vidal
328 37 Maurice Vidal
<pre>
329 37 Maurice Vidal
import "unbound"
330 37 Maurice Vidal
import "bind"
331 37 Maurice Vidal
</pre>
332 1 Laurent GUERBY
333 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.
334 37 Maurice Vidal
335 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 :
336 1 Laurent GUERBY
337 37 Maurice Vidal
<pre>
338 37 Maurice Vidal
class crontab {
339 1 Laurent GUERBY
	cron { "synchronisation puppet":
340 39 Maurice Vidal
		command => "/usr/sbin/puppetd --test --server=pvm1.testdomain1.tetaneutral.net",
341 1 Laurent GUERBY
		minute => "*/15"
342 1 Laurent GUERBY
	}
343 37 Maurice Vidal
}
344 37 Maurice Vidal
</pre>
345 37 Maurice Vidal
346 1 Laurent GUERBY
Passons à la configuration des modules :
347 37 Maurice Vidal
348 37 Maurice Vidal
h3. Création des modules :
349 37 Maurice Vidal
350 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/unbound/{files,manifests,templates}*
351 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/bind/{files,manifests,templates}*
352 37 Maurice Vidal
353 37 Maurice Vidal
Le dossier MANIFESTS permet de répertorier le fichier init.pp qui défini le coeur du module.
354 37 Maurice Vidal
Le dossier FILES contient les fichiers statiques, ceux qui ne changent pas d'un node à l'autre.
355 37 Maurice Vidal
Le dossier TEMPLATES contient les fichiers de configurations variant d'un hôte à l'autre.
356 37 Maurice Vidal
357 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 :+
358 37 Maurice Vidal
359 39 Maurice Vidal
Ici nous faisons la résolution du domaine : testdomain1.tetaneutral.net avec pour serveur DNS : pvm3
360 37 Maurice Vidal
361 37 Maurice Vidal
<pre>
362 37 Maurice Vidal
### Simple recursive caching DNS
363 37 Maurice Vidal
## /etc/unbound.conf
364 37 Maurice Vidal
server:
365 37 Maurice Vidal
	verbosity: 1
366 37 Maurice Vidal
 	outgoing-range: 60
367 39 Maurice Vidal
	interface: 91.224.149.37
368 1 Laurent GUERBY
 	do-ip4: yes
369 1 Laurent GUERBY
 	do-udp: yes
370 37 Maurice Vidal
	do-tcp: yes
371 37 Maurice Vidal
 	access-control: 0.0.0.0/0 allow         	#On autorise l’ensemble d’INTERNET à interroger le DNS
372 39 Maurice Vidal
 chroot: ""                                         			#Pas de chroot par défaut
373 37 Maurice Vidal
 logfile: "/var/log/unbound.log"         		#On défini le fichier de log
374 37 Maurice Vidal
 use-syslog: no                      			#Log par défaut dans syslog
375 37 Maurice Vidal
 hide-identity: yes             			
376 37 Maurice Vidal
 hide-version: yes              			
377 37 Maurice Vidal
 harden-glue: yes					#On dit que le serveur fait autorité sur la zone
378 39 Maurice Vidal
private-domain: "testdomain1.tetaneutral.net."  				#On définit le suffix dns du réseau local
379 39 Maurice Vidal
 local-zone: "testdomain1.tetaneutral.net." static				#on définit qui s'occupe de quoi dans le domaine
380 39 Maurice Vidal
local-data: "testdomain1.tetaneutral.net. IN MX 10 pvm5.testdomain1.tetaneutral.net." #serveur Postfix pvm5
381 40 Maurice Vidal
local-data: "testdomain1.tetaneutral.net. IN MX 20 pvm4.testdomain1.tetaneutral.net." #serveur Postfix pvm4
382 39 Maurice Vidal
local-data: "testdomain1.tetaneutral.net. IN NS pvm3.testdomain1.tetaneutral.net."		#service DNS
383 39 Maurice Vidal
local-data: "pvm1.testdomain1.tetaneutral.net. IN A 91.224.149.35"  	     	 #résolution : nom -> adresse
384 39 Maurice Vidal
local-data: "pvm2.testdomain1.tetaneutral.net. IN A 91.224.149.36"
385 39 Maurice Vidal
local-data: "pvm3.testdomain1.tetaneutral.net. IN A 91.224.149.37"
386 39 Maurice Vidal
local-data-ptr: "91.224.149.35 pvm1.testdomain1.tetaneutral.net." 		 #résolution inverse : adresse -> nom
387 39 Maurice Vidal
local-data-ptr: "91.224.149.36 pvm2.testdomain1.tetaneutral.net."
388 39 Maurice Vidal
local-data-ptr: "91.224.149.37 pvm3.testdomain1.tetaneutral.net."
389 37 Maurice Vidal
python:
390 37 Maurice Vidal
remote-control:
391 37 Maurice Vidal
forward-zone:
392 37 Maurice Vidal
	name: "."
393 39 Maurice Vidal
	forward-addr: 91.224.149.254	# DNS Faisant Authorité à tetaneutral.net
394 37 Maurice Vidal
</pre>
395 37 Maurice Vidal
396 37 Maurice Vidal
397 37 Maurice Vidal
Passons à la configuration du fichier principal : /etc/puppet/modules/unbound/manifests/init.pp :
398 37 Maurice Vidal
399 37 Maurice Vidal
<pre>
400 37 Maurice Vidal
class unbound {
401 37 Maurice Vidal
	package { unbound: ensure => installed }
402 37 Maurice Vidal
	file { "/etc/unbound/unbound.conf":
403 37 Maurice Vidal
		require => package["unbound"],		
404 1 Laurent GUERBY
		notify => Service["unbound"],
405 37 Maurice Vidal
		mode => 644,
406 37 Maurice Vidal
		owner => "root",
407 37 Maurice Vidal
		group => "root",
408 1 Laurent GUERBY
		source => "puppet:///modules/unbound/unbound.conf"
409 1 Laurent GUERBY
		}	
410 37 Maurice Vidal
	service { unbound: ensure => running,
411 37 Maurice Vidal
			enable => true
412 37 Maurice Vidal
	}	}
413 37 Maurice Vidal
class resolv {
414 1 Laurent GUERBY
	file { "/etc/resolv.conf":
415 37 Maurice Vidal
		require => Class["unbound"],
416 37 Maurice Vidal
		ensure => present,
417 39 Maurice Vidal
		content => "domain testdomain1.tetaneutral.net 
418 39 Maurice Vidal
search testdomain1.tetaneutral.net
419 37 Maurice Vidal
nameserver $ipaddress"
420 37 Maurice Vidal
	}
421 37 Maurice Vidal
}
422 37 Maurice Vidal
</pre>
423 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:///
424 37 Maurice Vidal
425 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 :
426 1 Laurent GUERBY
*Adresse IP 
427 1 Laurent GUERBY
Hostname 
428 1 Laurent GUERBY
Distribution et version 
429 1 Laurent GUERBY
Toutes autres variables locales définies par l’utilisateur.*
430 1 Laurent GUERBY
431 37 Maurice Vidal
Il est disponible sur les noeuds utilisant Puppetd, il fournit des variables utilisables dans les templates puppet.
432 37 Maurice Vidal
433 37 Maurice Vidal
Configuration du module BIND 
434 37 Maurice Vidal
435 37 Maurice Vidal
Voici le fichier de configuration /etc/puppet/modules/bind/manifests/init.pp :
436 37 Maurice Vidal
437 37 Maurice Vidal
<pre>
438 37 Maurice Vidal
class bind {
439 1 Laurent GUERBY
	package { bind9: ensure => installed }
440 37 Maurice Vidal
	file { "/etc/bind/named.conf.local":
441 37 Maurice Vidal
		require => package ["bind9"],
442 37 Maurice Vidal
		ensure => present,
443 37 Maurice Vidal
		mode => 644,
444 37 Maurice Vidal
		owner => "root",
445 37 Maurice Vidal
		group => "bind",
446 1 Laurent GUERBY
		source => "puppet:///modules/bind/named.conf.local" }
447 37 Maurice Vidal
	file { "/etc/bind/named.conf.options":
448 37 Maurice Vidal
		require => package ["bind9"],
449 1 Laurent GUERBY
		ensure => present,
450 37 Maurice Vidal
		mode => 644,
451 1 Laurent GUERBY
                	owner => "root",
452 37 Maurice Vidal
              		 group => "bind",
453 1 Laurent GUERBY
                	source => "puppet:///modules/bind/named.conf.options" }
454 39 Maurice Vidal
	file { "/var/cache/bind/db.testdomain1.tetaneutral.net":
455 1 Laurent GUERBY
		require => package ["bind9"],
456 1 Laurent GUERBY
		ensure => present,
457 1 Laurent GUERBY
                	mode => 644,
458 1 Laurent GUERBY
               		 owner => "root",
459 37 Maurice Vidal
                	group => "bind",
460 39 Maurice Vidal
                	source => "puppet:///modules/bind/db.testdomain1.tetaneutral.net" }
461 39 Maurice Vidal
	file { "/var/cache/bind/rev.testdomain1.tetaneutral.net":
462 37 Maurice Vidal
		require => package ["bind9"],
463 1 Laurent GUERBY
                	ensure => present,
464 37 Maurice Vidal
                	mode => 644,
465 1 Laurent GUERBY
                	owner => "root",
466 37 Maurice Vidal
               		 group => "bind",
467 39 Maurice Vidal
                	source => "puppet:///modules/bind/rev.testdomain1.tetaneutral.net" }
468 1 Laurent GUERBY
	service { bind9: ensure => running, 
469 1 Laurent GUERBY
		enable => true ,
470 1 Laurent GUERBY
		require => package ["bind9"],
471 1 Laurent GUERBY
	}	 
472 1 Laurent GUERBY
}
473 1 Laurent GUERBY
</pre>
474 1 Laurent GUERBY
475 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. 
476 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:///
477 37 Maurice Vidal
478 37 Maurice Vidal
Passons aux fichiers de configurations : /etc/puppet/modules/bind/files/named.conf.local :
479 37 Maurice Vidal
480 37 Maurice Vidal
<pre>
481 39 Maurice Vidal
// La zone primaire testdomain1.tetaneutral.net
482 39 Maurice Vidal
zone "testdomain1.tetaneutral.net" {
483 37 Maurice Vidal
      type master;
484 39 Maurice Vidal
      file "/var/cache/bind/db.testdomain1.tetaneutral.net"; };
485 37 Maurice Vidal
// La zone inverse
486 39 Maurice Vidal
zone "149.224.91.in-addr.arpa" {
487 37 Maurice Vidal
      type master;
488 39 Maurice Vidal
      file "/var/cache/bind/rev.testdomain1.tetaneutral.net";
489 37 Maurice Vidal
};
490 37 Maurice Vidal
</pre>
491 37 Maurice Vidal
492 37 Maurice Vidal
Puis le fichier : /etc/puppet/modules/bind/files/named.conf.options :
493 37 Maurice Vidal
494 37 Maurice Vidal
<pre>
495 37 Maurice Vidal
options {
496 37 Maurice Vidal
	directory "/var/cache/bind";
497 1 Laurent GUERBY
forwarders {
498 39 Maurice Vidal
 	91.224.149.254; 91.224.148.10; 8.8.8.8;
499 37 Maurice Vidal
 };
500 37 Maurice Vidal
	auth-nxdomain no;    # conform to RFC1035
501 37 Maurice Vidal
	listen-on { any; };
502 37 Maurice Vidal
	allow-query { any ; };
503 37 Maurice Vidal
};
504 37 Maurice Vidal
</pre>
505 37 Maurice Vidal
506 39 Maurice Vidal
Le fichier de zone primaire TESTDOMAIN1.TETANEUTRAL.net : /etc/puppet/modules/bind/files/db.testdomain1.tetaneutral.net :
507 1 Laurent GUERBY
508 1 Laurent GUERBY
<pre>
509 37 Maurice Vidal
;
510 39 Maurice Vidal
; BIND data file for testdomain1.tetaneutral.net
511 1 Laurent GUERBY
;
512 37 Maurice Vidal
$TTL    604800
513 39 Maurice Vidal
@       IN      SOA     pvm2.testdomain1.tetaneutral.net. admin.testdomain1.tetaneutral.net. (
514 37 Maurice Vidal
                 201205091         ; Serial
515 37 Maurice Vidal
                       604800         ; Refresh
516 37 Maurice Vidal
                        86400         ; Retry
517 37 Maurice Vidal
                      2419200         ; Expire
518 37 Maurice Vidal
                       604800 )       ; Negative Cache TTL
519 39 Maurice Vidal
@      	   IN      	NS      pvm2.testdomain1.tetaneutral.net.
520 39 Maurice Vidal
pvm1    	IN      	A       91.224.149.35
521 39 Maurice Vidal
pvm2    	IN      	A       91.224.149.36
522 39 Maurice Vidal
pvm3    	IN      	A       91.224.149.37
523 39 Maurice Vidal
pvm4    	IN      	MX	0	91.224.149.38
524 39 Maurice Vidal
pvm5    	IN      	MX	10	91.224.149.30
525 37 Maurice Vidal
</pre>
526 37 Maurice Vidal
527 39 Maurice Vidal
Et pour finir le fichier de zone inverse ARPA : /etc/puppet/modules/bind/rev.testdomain1.tetaneutral.net :
528 37 Maurice Vidal
529 37 Maurice Vidal
<pre>
530 37 Maurice Vidal
;
531 39 Maurice Vidal
; BIND data file for 91.224.149
532 37 Maurice Vidal
;
533 37 Maurice Vidal
$TTL    604800
534 39 Maurice Vidal
@       IN      SOA     pvm2.testdomain1.tetaneutral.net. (
535 37 Maurice Vidal
                 201209051         ; Serial
536 37 Maurice Vidal
                       604800         ; Refresh
537 37 Maurice Vidal
                        86400         ; Retry
538 1 Laurent GUERBY
                      2419200         ; Expire
539 37 Maurice Vidal
                       604800 )       ; Negative Cache TTL
540 39 Maurice Vidal
@      IN      NS      pvm2.testdomain1.tetaneutral.net.
541 39 Maurice Vidal
35	IN	PTR	pvm1.testdomain1.tetaneutral.net.
542 39 Maurice Vidal
36	IN	PTR	pvm2.testdomain1.tetaneutral.net.
543 39 Maurice Vidal
37	IN	PTR	pvm3.testdomain1.tetaneutral.net.
544 39 Maurice Vidal
38	IN	PTR	pvm4.testdomain1.tetaneutral.net.
545 39 Maurice Vidal
30	IN	PTR	pvm5.testdomain1.tetaneutral.net.
546 39 Maurice Vidal
547 1 Laurent GUERBY
</pre>
548 37 Maurice Vidal
549 37 Maurice Vidal
h3. *Configuration des templates* 
550 1 Laurent GUERBY
551 37 Maurice Vidal
Variables prédéfinie:
552 1 Laurent GUERBY
553 37 Maurice Vidal
Ici nous allons vous montrer comment on peut adapter les fichiers de configurations que nous déployons suivant le node.
554 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.
555 37 Maurice Vidal
556 37 Maurice Vidal
En effet lorsqu’on créé un template, il doit être sous l’extension "erb".
557 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.
558 37 Maurice Vidal
559 37 Maurice Vidal
Nous allons renseigner la variable "ipaddress" grâce aux balises de début: <%=  et aux balises de fin: %>
560 37 Maurice Vidal
Ainsi :
561 37 Maurice Vidal
562 39 Maurice Vidal
Pvm1 *head /etc/puppet/modules/unbound/templates/unbound.conf.erb*
563 37 Maurice Vidal
564 37 Maurice Vidal
<pre>
565 37 Maurice Vidal
server:
566 37 Maurice Vidal
	verbosity: 1
567 37 Maurice Vidal
 	outgoing-range: 60
568 37 Maurice Vidal
	interface: <%=  ipaddress %>
569 37 Maurice Vidal
 	do-ip4: yes
570 37 Maurice Vidal
 	do-udp: yes
571 37 Maurice Vidal
	do-tcp: yes
572 39 Maurice Vidal
 	access-control: 91.224.149.0/24 allow         
573 37 Maurice Vidal
 chroot: ""                                         	
574 37 Maurice Vidal
 logfile: "/var/log/unbound.log"      
575 37 Maurice Vidal
</pre> 
576 37 Maurice Vidal
577 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 :
578 37 Maurice Vidal
On remplace : 	source => "puppet:///modules/unbound/unbound.conf" 
579 37 Maurice Vidal
Par :		content => template("/etc/puppet/modules/unbound/templates/unbound.conf.erb"),
580 37 Maurice Vidal
581 37 Maurice Vidal
h3. *Création de variables:*
582 37 Maurice Vidal
583 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 :
584 37 Maurice Vidal
585 39 Maurice Vidal
> node ‘pvm2.testdomain1.tetaneutral.net' inherits basenode { 
586 39 Maurice Vidal
> *$network = “91.224.149.0”*
587 39 Maurice Vidal
> include bind }
588 37 Maurice Vidal
589 37 Maurice Vidal
590 37 Maurice Vidal
Puis l’appliquer sur le fichier /etc/puppet/modules/unbound/templates/unbound.conf.erb :
591 39 Maurice Vidal
Pvm1 *head /etc/puppet/modules/unbound/templates/unbound.conf.erb*
592 37 Maurice Vidal
593 37 Maurice Vidal
<pre>
594 37 Maurice Vidal
server:
595 37 Maurice Vidal
	verbosity: 1
596 37 Maurice Vidal
 	outgoing-range: 60
597 37 Maurice Vidal
	interface: <%=  ipaddress %>
598 37 Maurice Vidal
 	do-ip4: yes
599 37 Maurice Vidal
 	do-udp: yes
600 37 Maurice Vidal
	do-tcp: yes
601 37 Maurice Vidal
 	access-control: <%= network %>/24 allow         
602 37 Maurice Vidal
 chroot: ""                                         	
603 37 Maurice Vidal
 logfile: "/var/log/unbound.log"      
604 37 Maurice Vidal
</pre> 
605 37 Maurice Vidal
606 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.
607 37 Maurice Vidal
608 37 Maurice Vidal
h2. *LANCEMENT DE LA SYNCHRONISATION :*
609 37 Maurice Vidal
610 37 Maurice Vidal
Sur le serveur, il faut initier la connexion :
611 37 Maurice Vidal
*puppetmasterd --no-daemonize --debug*
612 37 Maurice Vidal
613 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.
614 37 Maurice Vidal
615 37 Maurice Vidal
Si on rencontre un problème tel que :
616 37 Maurice Vidal
_Could not run: Could not create PID file: /var/run/puppet/master.pid_
617 37 Maurice Vidal
618 37 Maurice Vidal
Il faut alors supprimer le fichier sur le serveur : # *rm /var/run/puppet/master.pid* relancer la commande :
619 39 Maurice Vidal
*puppetmasterd --no-daemonize --debug*
620 37 Maurice Vidal
621 37 Maurice Vidal
Sur les clients on va vérifier le fichier du serveur /etc/puppet/site.pp avec la commande :
622 39 Maurice Vidal
*puppetd --test --server=pvm1.testdomain1.tetaneutral.net*
623 37 Maurice Vidal
624 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.
625 37 Maurice Vidal
626 37 Maurice Vidal
h2. Mise en place d'un DRBD et GFS2 par Puppet
627 37 Maurice Vidal
628 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 :*
629 37 Maurice Vidal
630 37 Maurice Vidal
Nous avons besoins de deux nouvelles machines :
631 37 Maurice Vidal
632 39 Maurice Vidal
Hostname : pvm4 = IP : 91.224.149.38
633 39 Maurice Vidal
Hosntame : pvm5 = IP : 91.224.149.30
634 37 Maurice Vidal
635 37 Maurice Vidal
h3. *Installation :*
636 37 Maurice Vidal
637 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.
638 37 Maurice Vidal
Nous le partitionnons :
639 37 Maurice Vidal
640 39 Maurice Vidal
*cfdisk /dev/vdb*
641 1 Laurent GUERBY
NEW => LOGIQUE => Taille totale (faites entré) => WRITE => yes => "q" pour sortir
642 1 Laurent GUERBY
643 39 Maurice Vidal
A la suite de cela, nous obtenons la partition : /dev/vdb5.
644 37 Maurice Vidal
645 37 Maurice Vidal
h3. *Installation des outils :*
646 37 Maurice Vidal
647 39 Maurice Vidal
Sur le pvm1, nous allons créer deux nouveaux modules :
648 37 Maurice Vidal
649 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/drbd/{files,manifests,templates}*
650 37 Maurice Vidal
*mkdir -p /etc/puppet/modules/gfs2/{files,manifests,templates}*
651 37 Maurice Vidal
652 37 Maurice Vidal
Puis on rajoute nos deux modules dans le fichier /etc/puppet/manifests/modules.pp :
653 37 Maurice Vidal
654 37 Maurice Vidal
<pre>
655 37 Maurice Vidal
import "drbd"
656 37 Maurice Vidal
import "gfs2"
657 37 Maurice Vidal
</pre>
658 37 Maurice Vidal
659 37 Maurice Vidal
Commençons par l'installation de drbd :
660 37 Maurice Vidal
661 37 Maurice Vidal
*vi /etc/puppet/modules/drbd/manifests/init.pp*
662 37 Maurice Vidal
663 37 Maurice Vidal
<pre>
664 37 Maurice Vidal
class drbd::package {
665 37 Maurice Vidal
	package { "drbd8-utils": ensure => installed }
666 37 Maurice Vidal
}
667 37 Maurice Vidal
class drbd::fic {
668 37 Maurice Vidal
	exec { "modprobe":
669 37 Maurice Vidal
		require => Class["drbd::package"],
670 37 Maurice Vidal
		command => "/sbin/modprobe drbd"
671 37 Maurice Vidal
	}
672 37 Maurice Vidal
	file { "/etc/drbd.d/global_common.conf":
673 37 Maurice Vidal
		require => Class["drbd::package"],
674 37 Maurice Vidal
		ensure => present,
675 37 Maurice Vidal
		source => "puppet:///modules/drbd/global_common.conf"
676 37 Maurice Vidal
	}
677 37 Maurice Vidal
	file { "/etc/drbd.d/r0.res":
678 37 Maurice Vidal
		require => Class["drbd::package"],
679 37 Maurice Vidal
		ensure => present,
680 37 Maurice Vidal
		content => template("/etc/puppet/modules/drbd/templates/r0.res.erb")
681 37 Maurice Vidal
	}
682 37 Maurice Vidal
}
683 37 Maurice Vidal
class drbd::command {
684 37 Maurice Vidal
	exec { "create_ressource":
685 37 Maurice Vidal
		require => File["/etc/drbd.d/r0.res"],
686 37 Maurice Vidal
		command => "/sbin/drbdadm create-md r0"
687 37 Maurice Vidal
	}
688 37 Maurice Vidal
	exec { "start_drbd":
689 37 Maurice Vidal
		require => create_ressource"],
690 37 Maurice Vidal
		command => "/usr/sbin/service drbd start"
691 1 Laurent GUERBY
	}
692 1 Laurent GUERBY
}
693 1 Laurent GUERBY
class drbd::cron1 {
694 1 Laurent GUERBY
	file { "/root/overwrite.sh":
695 1 Laurent GUERBY
		ensure => present,
696 1 Laurent GUERBY
		source => "puppet:///modules/drbd/overwrite.sh"
697 1 Laurent GUERBY
	}
698 1 Laurent GUERBY
	file { "/root/mkfs.sh":
699 1 Laurent GUERBY
		ensure => present,
700 1 Laurent GUERBY
		source => "puppet:///modules/drbd/mkfs.sh"
701 1 Laurent GUERBY
	}
702 1 Laurent GUERBY
}
703 37 Maurice Vidal
class drbd::cron1.1 {
704 37 Maurice Vidal
	cron { "cron_over":
705 37 Maurice Vidal
		require => Class["drbd::cron1"],
706 37 Maurice Vidal
		command => "/root/overwrite.sh",
707 37 Maurice Vidal
		hour => "*/2"
708 37 Maurice Vidal
	}
709 37 Maurice Vidal
	cron { "cron_mkfs":	
710 37 Maurice Vidal
		require => Class["drbd::cron1"],
711 37 Maurice Vidal
		command => "/root/mkfs.sh",
712 37 Maurice Vidal
		hour => "*/3",
713 37 Maurice Vidal
		minute => "*/10"
714 37 Maurice Vidal
	}
715 37 Maurice Vidal
}
716 37 Maurice Vidal
class drbd::cron2  {
717 37 Maurice Vidal
	file { "/root/primary.sh":
718 37 Maurice Vidal
		ensure => present,
719 37 Maurice Vidal
		source => "puppet:///modules/drbd/primary.sh"
720 37 Maurice Vidal
	}
721 37 Maurice Vidal
}
722 37 Maurice Vidal
class drbd::cron2.2 {
723 37 Maurice Vidal
	cron { "cron_primary":
724 37 Maurice Vidal
		require => Class["drbd::cron2"],
725 1 Laurent GUERBY
		command => "/root/primary.sh",
726 37 Maurice Vidal
		hour => "*/3"
727 37 Maurice Vidal
	}
728 37 Maurice Vidal
}
729 37 Maurice Vidal
class cron_supp {
730 37 Maurice Vidal
	file { "/root/supp.sh":
731 1 Laurent GUERBY
		ensure => present,
732 37 Maurice Vidal
		source => $hostname ? {
733 39 Maurice Vidal
			pvm4 => "puppet:///modules/drbd/supp.pvm4.sh",
734 39 Maurice Vidal
			pvm5 => "puppet:///modules/drbd/supp.pvm5.sh"
735 37 Maurice Vidal
		}
736 37 Maurice Vidal
	}
737 37 Maurice Vidal
	cron { "delete_cron":
738 37 Maurice Vidal
		require => File["/root/supp.sh"],
739 37 Maurice Vidal
		command => "/root/supp.sh",
740 37 Maurice Vidal
		hour => "*/3",
741 37 Maurice Vidal
		minute => "35"
742 37 Maurice Vidal
	}
743 37 Maurice Vidal
}
744 37 Maurice Vidal
</pre>
745 37 Maurice Vidal
746 37 Maurice Vidal
Puis nous mettons à disposition le fichier de configuration de drbd,
747 37 Maurice Vidal
*vi /etc/puppet/modules/drbd/files/global_common.conf*
748 37 Maurice Vidal
749 37 Maurice Vidal
<pre>
750 37 Maurice Vidal
global {
751 37 Maurice Vidal
	usage-count no;
752 37 Maurice Vidal
}
753 37 Maurice Vidal
common {
754 37 Maurice Vidal
	protocol C;
755 37 Maurice Vidal
	syncer {
756 37 Maurice Vidal
		rate 100M;
757 37 Maurice Vidal
	}
758 37 Maurice Vidal
}</pre>
759 37 Maurice Vidal
760 37 Maurice Vidal
Et on utilise un template pour l'autre partie du fichier de configuration,
761 37 Maurice Vidal
*vi /etc/puppet/modules/drbd/templates/r0.res.erb*
762 37 Maurice Vidal
763 37 Maurice Vidal
<pre>
764 37 Maurice Vidal
resource r0 {
765 37 Maurice Vidal
	device /dev/drbd0;
766 37 Maurice Vidal
	disk <%= disk %>;
767 37 Maurice Vidal
	meta-disk internal;
768 37 Maurice Vidal
	startup {
769 37 Maurice Vidal
		wfc-timeout 120;
770 37 Maurice Vidal
		degr-wfc-timeout 120;
771 37 Maurice Vidal
		become-primary-on both;
772 37 Maurice Vidal
	}
773 37 Maurice Vidal
	disk { on-io-error detach; }
774 37 Maurice Vidal
	net {
775 37 Maurice Vidal
		allow-two-primaries;
776 37 Maurice Vidal
		after-sb-0pri discard-zero-changes;
777 37 Maurice Vidal
		after-sb-1pri discard-secondary;
778 37 Maurice Vidal
		after-sb-2pri disconnect;
779 37 Maurice Vidal
	}
780 37 Maurice Vidal
	on <%= node1name %> {
781 37 Maurice Vidal
		address <%= node1ip %>:7788;
782 37 Maurice Vidal
	}
783 37 Maurice Vidal
		on <%= node2name %> {
784 37 Maurice Vidal
		address <%= node2ip %>:7788;
785 37 Maurice Vidal
	}
786 37 Maurice Vidal
}
787 37 Maurice Vidal
</pre>
788 37 Maurice Vidal
789 1 Laurent GUERBY
On va ensuite modifier sur le serveur Puppet le fichier :
790 1 Laurent GUERBY
/etc/puppet/manifests/node.pp :
791 37 Maurice Vidal
792 37 Maurice Vidal
<pre>
793 39 Maurice Vidal
node 'pvm4.testdomain1.tetaneutral.net' {
794 39 Maurice Vidal
	$pptmasterip = "91.224.149.35"
795 39 Maurice Vidal
	$pptmastername = "pvm1"
796 39 Maurice Vidal
	$pptmasterfqdn = "pvm1.testdomain1.tetaneutral.net"
797 39 Maurice Vidal
	$node1ip = "91.224.149.38"
798 39 Maurice Vidal
	$node1name = "pvm4"
799 39 Maurice Vidal
	$node1fqdn = "pvm4.testdomain1.tetaneutral.net"
800 39 Maurice Vidal
	$node2ip = "91.224.149.30"
801 39 Maurice Vidal
	$node2name = "pvm5"
802 39 Maurice Vidal
	$node2fqdn = "pvm5.testdomain1.tetaneutral.net"
803 39 Maurice Vidal
	$disk = "/dev/vdb5"
804 37 Maurice Vidal
	include drbd::package, drbd::fic, drbd::command, drbd::cron1, drbd::cron1.1, cron_supp
805 1 Laurent GUERBY
}
806 39 Maurice Vidal
node 'pvm5.testdomain1.tetaneutral.net' {
807 39 Maurice Vidal
	$pptmasterip = "91.224.149.35"
808 39 Maurice Vidal
	$pptmastername = "pvm1"
809 39 Maurice Vidal
	$pptmasterfqdn = "pvm1.testdomain1.tetaneutral.net"
810 39 Maurice Vidal
	$node1ip = "91.224.149.38"
811 39 Maurice Vidal
	$node1name = "pvm4"
812 39 Maurice Vidal
	$node1fqdn = "pvm4.testdomain1.tetaneutral.net"
813 39 Maurice Vidal
	$node2ip = "91.224.149.30"
814 39 Maurice Vidal
	$node2name = "pvm5"
815 39 Maurice Vidal
	$node2fqdn = "pvm5.testdomain1.tetaneutral.net"
816 39 Maurice Vidal
	$disk = "/dev/vdb5"
817 37 Maurice Vidal
	include drbd::package, drbd::fic, drbd::command, drbd::cron2, drbd::cron2.2, cron_supp
818 37 Maurice Vidal
}
819 37 Maurice Vidal
</pre>
820 37 Maurice Vidal
821 37 Maurice Vidal
Maintenant voyons les fichiers bash que nous utiliserons pour les différents 'cron' :
822 37 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/overwrite.sh*
823 37 Maurice Vidal
<pre>
824 1 Laurent GUERBY
#!/bin/bash
825 1 Laurent GUERBY
drbdadm -- --overwrite-data-of-peer primary r0
826 1 Laurent GUERBY
</pre>
827 37 Maurice Vidal
828 1 Laurent GUERBY
*cat /etc/puppet/modules/drbd/files/mkfs.sh*
829 37 Maurice Vidal
<pre>
830 37 Maurice Vidal
#!/bin/bash
831 37 Maurice Vidal
mkfs.gfs2 -t cluster1:gfs2 -p lock_dlm -j 2 /dev/drbd0
832 37 Maurice Vidal
</pre>
833 37 Maurice Vidal
834 37 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/primary.sh*
835 37 Maurice Vidal
<pre>
836 1 Laurent GUERBY
#!/bin/bash
837 37 Maurice Vidal
drbdadm primary r0
838 37 Maurice Vidal
</pre>
839 1 Laurent GUERBY
840 39 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/supp.pvm4.sh*
841 37 Maurice Vidal
<pre>
842 37 Maurice Vidal
#!/bin/bash
843 37 Maurice Vidal
rm -r /root/overwrite.sh
844 37 Maurice Vidal
rm -r /root/mkfs.sh
845 37 Maurice Vidal
</pre>
846 37 Maurice Vidal
847 39 Maurice Vidal
*cat /etc/puppet/modules/drbd/files/supp.pvm5.sh*
848 1 Laurent GUERBY
<pre>
849 1 Laurent GUERBY
#!/bin/bash
850 1 Laurent GUERBY
rm -r /root/primary.sh
851 1 Laurent GUERBY
</pre>
852 1 Laurent GUERBY
853 37 Maurice Vidal
Ne pas oublier de mettre le droit d'execution aux fichier bash avec cette commande :
854 37 Maurice Vidal
<pre>
855 37 Maurice Vidal
chmod 744 /etc/puppet/modules/drbd/files/*.sh
856 1 Laurent GUERBY
</pre>
857 37 Maurice Vidal
858 37 Maurice Vidal
Il y a des commandes à faire manuellement, moi j'ai préféré utiliser l'ordonnanceur cron.
859 37 Maurice Vidal
860 37 Maurice Vidal
Passons à la configuration de GFS2 :
861 37 Maurice Vidal
862 37 Maurice Vidal
*cat /etc/puppet/modules/gfs2/manifests/init.pp*
863 37 Maurice Vidal
<pre>
864 37 Maurice Vidal
class gfs2::package {
865 37 Maurice Vidal
	package { "cman": ensure => installed }
866 37 Maurice Vidal
	package { "gfs2-tools": ensure => installed }
867 37 Maurice Vidal
	package { "libopenais-dev": ensure => installed }
868 37 Maurice Vidal
}
869 37 Maurice Vidal
class gfs2::fic {
870 37 Maurice Vidal
	file { "/etc/cluster/cluster.conf":
871 37 Maurice Vidal
		require => Class["gfs2::package"],
872 37 Maurice Vidal
		ensure => present,
873 37 Maurice Vidal
		source => "puppet:///modules/gfs2/cluster.conf"
874 37 Maurice Vidal
	}
875 37 Maurice Vidal
}
876 1 Laurent GUERBY
class gfs2::command {
877 1 Laurent GUERBY
	exec { "stop_network_manager":
878 37 Maurice Vidal
		require => Class["gfs2::fic"],
879 37 Maurice Vidal
		command => "/usr/sbin/service network-manager stop"
880 1 Laurent GUERBY
	}
881 37 Maurice Vidal
	exec { "start_cman":
882 37 Maurice Vidal
		require => Exec["stop_network_manager"],
883 37 Maurice Vidal
		command => "/usr/sbin/service cman start"
884 1 Laurent GUERBY
	}
885 37 Maurice Vidal
}
886 37 Maurice Vidal
class gfs2::hosts {
887 37 Maurice Vidal
	file { "/etc/hosts":
888 37 Maurice Vidal
		require => Class["gfs2::package"],
889 37 Maurice Vidal
		ensure => present,
890 37 Maurice Vidal
		content => template("/etc/puppet/modules/gfs2/templates/hosts.erb")
891 37 Maurice Vidal
	}
892 37 Maurice Vidal
}
893 37 Maurice Vidal
</pre>
894 37 Maurice Vidal
895 37 Maurice Vidal
Nous voulons être sûr que nos deux machines puissent se joindre :
896 37 Maurice Vidal
*cat /etc/puppet/modules/gfs2/templates/hosts.erb*
897 37 Maurice Vidal
<pre>
898 37 Maurice Vidal
127.0.0.1 		localhost
899 37 Maurice Vidal
<%= pptmasterip %>	<%= pptmastername %>	<%= pptmasterfqdn %>
900 37 Maurice Vidal
<%= node1ip %>		<%= node1name %>	<%= node1fqdn %>
901 37 Maurice Vidal
<%= node2ip %>		<%= node2name %>	<%= node2fqdn %>
902 37 Maurice Vidal
</pre>
903 37 Maurice Vidal
904 37 Maurice Vidal
Il faut également modifier le fichier /etc/puppet/manifests/node.pp afin de rajouter les classes gfs :
905 37 Maurice Vidal
906 39 Maurice Vidal
> node 'pvm4.testdomain1.tetaneutral.net' {
907 1 Laurent GUERBY
>...
908 39 Maurice Vidal
> 	$disk = "/dev/vdb5"
909 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* 
910 37 Maurice Vidal
>}
911 1 Laurent GUERBY
>
912 39 Maurice Vidal
> node 'pvm5.testdomain1.tetaneutral.net' {
913 37 Maurice Vidal
>... 	
914 39 Maurice Vidal
> 	$disk = "/dev/vdb5"
915 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* 
916 1 Laurent GUERBY
>}
917 37 Maurice Vidal
918 37 Maurice Vidal
Il ne reste plus que le fichier de configuration du cluster, cependant à cause de sa forme (composé de balises) :
919 37 Maurice Vidal
Ainsi le fichier /etc/puppet/modules/gfs2/files/cluster.conf :
920 37 Maurice Vidal
921 37 Maurice Vidal
<pre>
922 37 Maurice Vidal
<?xml version="1.0"?>
923 37 Maurice Vidal
<cluster name="cluster1" config_version="3">
924 37 Maurice Vidal
<cman two_node="1" expected_votes="1"/>
925 37 Maurice Vidal
<clusternodes>
926 39 Maurice Vidal
<clusternode name="pvm4" votes="1" nodeid="1">
927 1 Laurent GUERBY
        <fence>
928 1 Laurent GUERBY
                <method name="single">
929 39 Maurice Vidal
                        <device name="manual" ipaddr="91.224.149.38"/>
930 37 Maurice Vidal
                </method>
931 37 Maurice Vidal
        </fence>
932 37 Maurice Vidal
</clusternode>
933 39 Maurice Vidal
<clusternode name="pvm5" votes="1" nodeid="2">
934 37 Maurice Vidal
        <fence>
935 37 Maurice Vidal
                <method name="single">
936 39 Maurice Vidal
                        <device name="manual" ipaddr="91.224.149.30"/>
937 37 Maurice Vidal
                </method>
938 37 Maurice Vidal
        </fence>
939 37 Maurice Vidal
</clusternode>
940 37 Maurice Vidal
</clusternodes>
941 1 Laurent GUERBY
<fence_daemon clean_start="1" post_fail_delay="0" post_join_delay="3"/>
942 37 Maurice Vidal
<fencedevices>
943 37 Maurice Vidal
        <fencedevice name="manual" agent="fence_manual"/>
944 37 Maurice Vidal
</fencedevices>
945 37 Maurice Vidal
</cluster>
946 37 Maurice Vidal
</pre>
947 37 Maurice Vidal
948 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 :
949 37 Maurice Vidal
cluster name= *cluster1* config_version= *3* (pour connaitre le numéro de la version : *apt-cache policy gfs2-tools* )
950 39 Maurice Vidal
Egalement le nom des nos noeuds : clusternode name= *pvm4* votes="1" nodeid= *1*
951 39 Maurice Vidal
Et pour finir l'adresse IP : device name="manual" ipaddr= *91.224.149.38*
952 37 Maurice Vidal
953 39 Maurice Vidal
Puis sur le Pvm1 on lance la commande :
954 39 Maurice Vidal
*puppetmasterd --no-daemonize --debug*
955 37 Maurice Vidal
956 1 Laurent GUERBY
Et sur les clients :
957 39 Maurice Vidal
*puppetd --test --server=pvm1.testdomain1.tetaneutral.net*
958 37 Maurice Vidal
959 37 Maurice Vidal
+On vérifie :+
960 37 Maurice Vidal
Sur les machines clientes, on peut aller vérifier le raid1 :
961 37 Maurice Vidal
*service drbd status*
962 37 Maurice Vidal
963 1 Laurent GUERBY
Nous voyons que nous sommes à Primary/Primary UpToDate/UpToDate 
964 1 Laurent GUERBY
Ici les machines sont en attentes d'un montage.
965 37 Maurice Vidal
966 39 Maurice Vidal
Maintenant il ne reste plus qu'à créer un répertoire, sur la pvm4 :
967 37 Maurice Vidal
*mkdir -p /media/cluster/drbd*
968 37 Maurice Vidal
*mount -t gfs2 /dev/drbd0 /media/cluster/drbd*
969 37 Maurice Vidal
970 39 Maurice Vidal
Et, sur la pvm5 :
971 37 Maurice Vidal
*mkdir -p /media/clusterdata/drbd*
972 37 Maurice Vidal
*mount -t gfs2 /dev/drbd0 /media/clusterdata/drbd*
973 37 Maurice Vidal
974 37 Maurice Vidal
h3. *Vérification :*
975 37 Maurice Vidal
976 37 Maurice Vidal
On vérifie :
977 37 Maurice Vidal
*service drbd status*
978 37 Maurice Vidal
979 37 Maurice Vidal
+Il faut que l'on voie nos points de montage.+
980 37 Maurice Vidal
981 39 Maurice Vidal
Sur une machine, n'importe laquelle, écrivez sur votre point de montage, par exemple pvm4 :
982 39 Maurice Vidal
*touch /media/cluster/drbd/pvm4.txt*
983 37 Maurice Vidal
*ls /media/cluster/drbd*
984 39 Maurice Vidal
On voit notre fichier : pvm4.txt
985 37 Maurice Vidal
986 39 Maurice Vidal
Sur l'autre node du cluster (pvm5) :
987 37 Maurice Vidal
*ls /media/clusterdata/drbd*
988 39 Maurice Vidal
On voit notre fichier : pvm4.txt
989 37 Maurice Vidal
990 37 Maurice Vidal
Pour voir les log du cluster :
991 37 Maurice Vidal
*tailf /var/log/cluster/corosync.log*
992 37 Maurice Vidal
993 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é.
994 37 Maurice Vidal
995 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.
996 37 Maurice Vidal
997 37 Maurice Vidal
h2. Mise en place d'un Postfix avec authentification LDAP Sans Puppet (Pas fini)
998 37 Maurice Vidal
999 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 =(*
1000 37 Maurice Vidal
1001 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).
1002 37 Maurice Vidal
1003 37 Maurice Vidal
h3. Installer LDAP :
1004 37 Maurice Vidal
1005 37 Maurice Vidal
*apt-get install slapd ldap-utils*
1006 37 Maurice Vidal
*dpkg-reconfigure slapd*
1007 37 Maurice Vidal
1008 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".
1009 37 Maurice Vidal
1010 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 :
1011 37 Maurice Vidal
*cp /usr/share/doc/slapd/example/slapd.conf /etc/ldap/*
1012 37 Maurice Vidal
1013 37 Maurice Vidal
Ensuite il faut modifier le fichier slapd.conf
1014 37 Maurice Vidal
<pre>
1015 39 Maurice Vidal
suffix          "dc=testdomain1.tetaneutral,dc=net"
1016 39 Maurice Vidal
rootdn          "cn=admin,dc=testdomain1.tetaneutral,dc=net"
1017 37 Maurice Vidal
password-hash   SSHA
1018 37 Maurice Vidal
rootpw          {SSHA}zmQHHtuIgyentPKrBw3lkNHN6JSVg/UW
1019 37 Maurice Vidal
access to attrs=userPassword,shadowLastChange
1020 39 Maurice Vidal
        by dn="cn=admin,dc=testdomain1.tetaneutral,dc=net" write
1021 37 Maurice Vidal
        by anonymous auth
1022 37 Maurice Vidal
        by self write
1023 37 Maurice Vidal
        by * none
1024 37 Maurice Vidal
access to *
1025 39 Maurice Vidal
        by dn="cn=admin,dc=dtestdomain1.tetaneutral,dc=net" write
1026 37 Maurice Vidal
        by * none
1027 37 Maurice Vidal
</pre>
1028 37 Maurice Vidal
1029 37 Maurice Vidal
h3. On peut ensuite installer les serveurs de messageries :
1030 37 Maurice Vidal
1031 37 Maurice Vidal
*apt-get install courier-ldap postfix postfix-ldap*
1032 37 Maurice Vidal
1033 37 Maurice Vidal
On peut rajouter des schema fournis par ldap :
1034 37 Maurice Vidal
*cp /usr/share/doc/courier-authlib-ldap/authldap.schema.gz /etc/ldap/schema*
1035 37 Maurice Vidal
*gunzip /etc/ldap/schema/authldap.schema.gz*
1036 37 Maurice Vidal
1037 37 Maurice Vidal
Et rajouter son chemin dans /etc/ldap/slapd.conf :
1038 37 Maurice Vidal
<pre>
1039 37 Maurice Vidal
include /etc/ldap/schema/authldap.schema
1040 37 Maurice Vidal
</pre>
1041 37 Maurice Vidal
1042 37 Maurice Vidal
On redémarre :
1043 37 Maurice Vidal
*service slapd restart*
1044 37 Maurice Vidal
1045 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 =))*
1046 37 Maurice Vidal
1047 37 Maurice Vidal
*vi exemple-type.ldif*
1048 37 Maurice Vidal
<pre>
1049 39 Maurice Vidal
dn: ou=people, dc=testdomain1.tetaneutral, dc=net
1050 37 Maurice Vidal
objectclass: top 
1051 37 Maurice Vidal
objectclass: organizationalUnit 
1052 37 Maurice Vidal
ou: people 
1053 37 Maurice Vidal
1054 39 Maurice Vidal
dn: cn=gp_tech, ou=people, dc=testdomain1.tetaneutral, dc=net 
1055 37 Maurice Vidal
objectClass: top 
1056 37 Maurice Vidal
objectClass: posixGroup 
1057 37 Maurice Vidal
cn: gp_tech
1058 37 Maurice Vidal
gidNumber: 1111 
1059 37 Maurice Vidal
1060 39 Maurice Vidal
dn: uid=toto1, ou=people, dc=testdomain1.tetaneutral, dc=net
1061 37 Maurice Vidal
objectClass: top 
1062 37 Maurice Vidal
objectClass: posixAccount 
1063 37 Maurice Vidal
objectClass: inetOrgPerson 
1064 37 Maurice Vidal
uid: toto 
1065 37 Maurice Vidal
cn: toto un 
1066 37 Maurice Vidal
sn: toto 
1067 37 Maurice Vidal
givenName: un 
1068 37 Maurice Vidal
uidNumber: 2200 
1069 37 Maurice Vidal
gidNumber: 1111 
1070 37 Maurice Vidal
homeDirectory: /home/toto1 
1071 37 Maurice Vidal
userPassword: mdp2toto1 
1072 39 Maurice Vidal
mail: toto1@testdomain1.tetaneutral.net 
1073 37 Maurice Vidal
1074 39 Maurice Vidal
dn: uid=toto2,ou=people,dc=testdomain1.tetaneutral,dc=net
1075 37 Maurice Vidal
objectClass: top
1076 37 Maurice Vidal
objectClass: inetOrgPerson
1077 37 Maurice Vidal
objectClass: posixAccount
1078 37 Maurice Vidal
uid: toto2
1079 37 Maurice Vidal
cn: toto deux
1080 37 Maurice Vidal
sn: toto
1081 37 Maurice Vidal
uidNumber: 2201
1082 37 Maurice Vidal
gidNumber: 1111
1083 39 Maurice Vidal
mail: toto2@testdomain1.tetaneutral.net
1084 37 Maurice Vidal
homeDirectory: /home/toto2
1085 37 Maurice Vidal
userPassword: mdp2toto2
1086 37 Maurice Vidal
</pre>
1087 37 Maurice Vidal
1088 37 Maurice Vidal
On applique ce changement d'arborescence :
1089 39 Maurice Vidal
*ldapadd -x -f exemple_type.ldif -D cn=admin,dc=testdomain1.tetaneutral,dc=net -W*
1090 37 Maurice Vidal
1091 37 Maurice Vidal
h3. *Configuration de Postfix*
1092 37 Maurice Vidal
1093 37 Maurice Vidal
Il faut modifier le fichier de conf du serveur de messagerie:
1094 37 Maurice Vidal
*vi /etc/postfix/main.cf*
1095 37 Maurice Vidal
1096 37 Maurice Vidal
<pre>
1097 37 Maurice Vidal
...
1098 37 Maurice Vidal
local_recipient_maps = ldap:/etc/postfix/ldap_local_recipient.cf
1099 37 Maurice Vidal
...
1100 37 Maurice Vidal
</pre>
1101 37 Maurice Vidal
1102 37 Maurice Vidal
Puis on créé le fichier ldap_local_recipient.cf :
1103 37 Maurice Vidal
1104 37 Maurice Vidal
<pre>
1105 39 Maurice Vidal
server_host = 91.224.149.38
1106 37 Maurice Vidal
server_port = 389
1107 39 Maurice Vidal
search_base = dc=testdomain1.tetaneutral,dc=net
1108 1 Laurent GUERBY
# le %s signifie "adresse du destinataire telle que fourni par la commande "RCPT TO:"
1109 1 Laurent GUERBY
query_filter = (mail=%s)
1110 1 Laurent GUERBY
result_attribute = mail
1111 1 Laurent GUERBY
</pre>
1112 1 Laurent GUERBY
1113 1 Laurent GUERBY
On peut vérifier si notre serveur de messagerie peut joindre l'annuaire ldap :
1114 39 Maurice Vidal
*postmap -q toto1@testdomain1.tetaneutral.net ldap:/etc/postfix/ldap_local_recipient.cf*
1115 1 Laurent GUERBY
1116 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").