Notre premier module de configuration

puppetNous allons maintenant attaquer notre premier module de configuration. Il s'agit pour commencer d'un exemple simple, avec un déploiement d'un fichier identique sur chaque machine. Il s'agit du fichier /etc/resolv.conf. Nous verrons ensuite en complétant ce module le déploiement d'un fichier modifié à partir d'un modèle (template erb). Ce module s'appelera "network" car à terme il traitera de la configuration générique du réseau.

Il faut d'abord créer l'arborescence de notre module:

[root@serveur] # mkdir /etc/puppet/modules/network

Chaque module possède son ou ses propres manifests, avec comme fichier principal init.pp:

[root@serveur] # mkdir /etc/puppet/modules/network/manifests

L'objectif étant de deploier un fichier identique sur chaque machine, nous allons créer un espace pour les fichiers dans notre module:

[root@serveur] # mkdir /etc/puppet/modules/network/files

Voyons maintenant le fichier init.pp de ce module:

[root@serveur] # cat /etc/puppet/modules/network/manifests/init.pp
class network {
 file { "/etc/resolv.conf":
  owner => root,
  group => root,
  mode => 644,
  source => "puppet:///network/resolv.conf"
 }
}

Facile n'est-ce pas? Nous parlons ici du fichier /etc/resolv.conf, dont le propriétaire et groupe doivent être root, et les permissions 644. La source/contenu de ce fichier étant disponible via le serveur puppet (dont on peut éviter d'indiquer l'adresse) dans le module /network/. Le contenu de ce fichier est le suivant:

[root@serveur] # cat /etc/puppet/modules/files/resolv.conf
# Module Network depuis puppet
nameserver 192.168.1.1
search in.domaine.net

Comme vous pouvez le voir, un module de configuration sert à définir des "class" ou en français des objets. Il ne reste maintenant plus qu'à définir quels objets vont s'appliquer sur quelles machines. Ceci est en fait définit dans le fichier /etc/puppet/manifests/nodes.pp qui est importé depuis notre fichier général site.pp.

Nous voulons que notre machine "noeud1.in.domaine.net" soit configurée selon notre module network crée plus haut. Voici donc le contenu du fichier nodes.pp:

[root@serveur] # cat /etc/puppet/manifests/nodes.pp
node "noeud1.in.domaine.net" {
 include "network"
}

Le fichier sera déployé lors de la prochaine communication de la machine "noeud1.in.domaine.net" avec notre serveur Puppet. On peut forcer ceci en relanceant le service puppet sur notre client.

[root@noeud1] # service puppet restart
Arrêt de puppet:                 [ OK ]
Démarrage de puppet:        [ OK ]

Après quelques seconde, notre fichier resolv.conf est présent sur notre machine:

[root@noeud1] # cat /etc/resolv.conf
# Module Network depuis puppet
nameserver 192.168.1.1
search in.domaine.net

Mais maintenant nous aimerions que notre module "network" dépose aussi un fichier /etc/hosts qui lui devra sur chaque machine être personnalisé. Pour cela il faut utiliser le système de template fournit par Puppet. Nous allons pour cela rajouter un répertoire templates dans l'arborescence de notre module:

[root@noeud1] # mkdir /etc/puppet/modules/network/templates

Dans ce repertoire nous allons créer notre fichier hosts qui servira de modèle. Voici son contenu:

[root@noeud1] # cat /etc/puppet/modules/network/templates/hosts.erb
# hosts depuis puppetmaster
127.0.0.1     localhost localhost.localdomain <%= hostname %> <%= fqdn %>
192.168.1.1 dns.in.domaine.net
192.168.1.2 puppet.in.domaine.net

Ainsi, sur chaque noeud client puppet, les mots clefs hostname et fqdn seront remplacés par les valeurs renseignées par l'outil facter. Pour notre exemple, hostname vaut noeud1 et fqdn noeud1.in.domaine.net.

Il ne reste plus qu'à associer notre module "network" aux noeuds qui en ont besoin. Pour cela il faut editier le fichier /etc/puppet/manifests/nodes.pp (ou alors site.pp si vous ne faite pas de import "nodes"):

node "noeud1.in.domaine.net" {
  include network
}

Nous verrons surement plus tard, dans de futurs billets, d'autres exemples de module de configuration pour Puppet.