Classes & modules

Node

Un bloc node permet de définir un code Puppet qui ne s’appliquera qu’à certains noeuds donnés.

node 'ns1', 'ns2' {    # applies to ns1 and ns2 nodes
  file {'/tmp/dns':    # resource type file and filename
    ensure => present, # make sure it exists
    mode => 0644,
    content => "Only DNS servers get this file.\n",
  }
}

node /^web/ {
  include role::app_server
}
node /^db/ {
  include role::db_server
}

node default {}       # applies to nodes that aren't explicitly defined

Classe

Une classe est un wrapper pour une liste de ressource qui sont gérées ensemble comme une seule unité. Par exemple, la liste des ressources (fichiers, utilisateur, packages) pour un serveur apache.

Définir une classe

La définition d’une classe s’effectue dans le manifeste ou dans un module.
On définit le contenu et le comportement de la classe.
Définir une classe ne l’inclue pas automatiquement dans une configuration, ça ne fait que la définir.

class dev_environment {
  user { 'grace':
    ensure      => present,
    manage_home => true,
    group       => [ 'wheel' ],
  }
  package { 'vim':
    ensure => present,
  }
  file { '/home/grace/.vimrc':
    ensure => file,
    source => 'puppet:///modules/dev_environment/vimrc'
  }
}

Note: Pour une ressource file, l’option source permet de copier un fichier (au lieu de simplement spécifier le contneu du fichier avec content).
puppet:///modules/apache/info.php est interprété en /$codedir/modules/apache/files/info.php.

Déclarer une classe

La déclaration d’une classe aura pour effet d’ajouter les ressources de cette classe au catalogue — autrement dit, on instancie cette classe. Pour ce faire, on a deux possibilité:

Les classes sont réutilisables, elles peuvent être utilisées à l’intérieur de plusieurs nodes — mais ne peuvent être utilisées qu’une seule fois à l’intérieur d’un noeud donné.

node default {
  include dev_environment
}
node 'grace.puppet.vm' {
  include dev_environment
}

Les classes ne sont appliquées que lorsqu’elles sont invoquées, ce qui permet de réutiliser le code Puppet (et donc de réduire les erreurs) mais aussi de faciliter la lecture des manifestes.

node 'site.example.com' {
  include ssh
  include apache
  include mysql
  include web-app
}

Les classes peuvent être incluses dans d’autres classes en plus des ressources. C’est une manière de procéder très courante, qui permet de définir des unites logiques de configuration et de les coomposer ensuite comme des abstractions de niveau supérieur.

class foo {
  include dev_environment
  class { 'another_class':
    ensure => present,
  }
  file { '/some/file.txt',
    ensure  => file,
    content => 'some content',
  }
}

Variables

On peut définir des variables à l’intérieur de la classe, dont la portée sera limitée à cette classe.

class minecraft {
    $url = 'https://s3.amazonaws.com/Minecraft.Download/versions/1.12.2/minecraft_server.1.12.2.jar'
    $install_dir = '/opt/minecraft'
    file { $install_dir:
      ensure => directory,
    }
    file { '${install_dir}/minecraft_server.jar':
      ensure => file,
      source => $url,
    }
    ...
}

Paramètres

Plutôt que d’utiliser des variables, on peut utiliser des paramètres, déclarées entre crochets après le nom de la classe. Cela permet de définir des valeurs par défaut, mais qui peuvent être modifiées lorsqu’on déclare la classe.

Language: Classes


Modules

Un module est un répertoire avec une structure spécifique, où l’on va placer les manifestes, templates, fichiers, etc. Grâce à cette infrastructure prédéfinie, on peut bénéficier de l’autoloading des classes et données.

La structure du répertoire est la suivante:

module-name/
|- manifests
  |- init.pp
|- files
|- templates
|- lib
|- examples
|- spec

Puppet cherche les modules dans un ensemble de répertoire définis par le paramètre modulepath. Le chemin par défaut de modulepath est $codedir/modules (donc ` /etc/puppetlabs/code/environments/production/modules` pour l’environnement de production)

Module fundamentals
Exemple de module: Apache

Exemple


Forge

Puppet met à disposition un dépot public, Puppet Forge, qui permet de trouver rapidement et d’installer des modules d’installation pré-définis, tels qu’Apache ou MySQL par exemple. Vous y trouverez 3 catégories de modules:

Partager un module

Un module sur Puppet Forge respecte la structure d’un module classique et contient également

Puppet propose un outil d’aide à l’écriture de module: le Puppet Development Kit.

Utiliser un module


Roles & Profils

La méthode native pour classifier des noeuds dans Puppet est d’assigner des classes dans site.pp:

node 'hermes.example.com' {
  include network
  include users
  include exim
  include dovecot
  inclure roundcube
}

node 'ares.example.com' {
  include network
  include users
  include mysql
}

Mais plus il y de noeuds, plus il devient difficile de se rappeler le rôle de chaque noeud — on doit se faire une carte mentale de ce que fait chaque classe et de la manière dont elle se rapporte au noeud. Il peut devenir difficile de distinger les machines de dev des machines de production par exemple.

Pour régler ce problème, on utilise les rôles et profils. Il s’agit en vérité juste de modules écrits de manière à clarifier le rôle de chaque noeud.

Roles and profiles: A complete example