puppet_conf

Ceci est une ancienne révision du document !


Configurer les automatisations de Puppet

CréationNicolas THOREZ 2022/11/20 17:37

L'ensemble des règles de Puppet est contenu dans le dossier /etc/puppetlabs/code/environments. A ce premier niveau on trouvera les différents environnements. production est créé par défaut mais il est possible d'en ajouter d'autres, preprod, test, etc…

Au sein des dossiers d'environnement, on trouvera notamment :

  • le fichier environment.conf : contient les paramétrages de puppet pour cet environnement.
  • le dossier manifest : contient les règles d'automatisation a appliquer.
  • le dossier modules : contient les modules disponibles pour cet environnement.

Lorsqu'un agent se connecte, le serveur puppet compile l'ensemble des fichiers *.pp de l'environnement sélectionné et informe l'agent des règles qui le concerne et par conséquent, des actions à réaliser. Parmis ces fichiers, le plus important est le fichier site.pp qui correspond au fichier général pour l'ensemble des clients.

Le langage utilisé par puppet permet de décrire l'état dans lequel au souhaite mettre le système. On parlera alors de :

  • ressources : l'état d'un élément du système. Il peut s'agir d'un paquet, un fichier, un service, accompagné pour chacun d'entre eux de l'état du-dit objet.
  • classes : un ensemble de ressources regroupées au sein d'un même objet afin de pouvoir être géré en une seule fois.
  • manifest : un fichier avec l'extension pp contenant des déclarations de ressources et/ou de classes.
  • catalogs : l'ensemble des données (ressources, classes et manifests) disponibles pour un agent.

La syntaxe utilisée est généralement du type :

ressource { 'Titre':
  paramètre1 => 'valeur',
  paramètre2 => 'valeur',
}

Au delà de ces déclarations de ressources, puppet inclue des éléments de codage afin de dynamiser les manifestes. Parmi ces éléments, on a droit à :

$variable = 'valeur'

La variable est nommée et utilisé par le biais du symbole $.

if $trusted['hostname'] == 'serv1' {
  include class1
} elsif $trusted['hostname'] == 'serv2' {
  include class2
} else {
  include class3
}

Le test est introduit par if. Si le résultat du test est correct alors la ressource suivante est envoyée. Sinon, une nouvelle condition peut être introduite par elsif. Si aucune condition n'est valide, le terme else permet d'envoyer une ressource spécifique.

case $trusted['hostname'] {
  'serv1': {
    include class1
  }
  'serv2': {
    include class2
  }
  default: {
    include class3
  }
}

case introduit la condition à vérifier. Cette dernière est alors comparée à chacune des propositions disponibles et, à chaque correspondance, exécute la ressource qui y est attachée. Le terme default permet de définir une réponse par défaut.

unless $trusted['hostname'] == 'serv1' {
  include class4
}

unless permet d'appliquer un résultat à chaque fois que la condition est fausse. Ainsi, dans cet exemple, la classe n°4 sera inclue sur chaque serveur à l'exception de serv1.

 $servfunction = $trusted['hostname'] ? {
  'serv1' => 'dns',
  'serv2' => 'apache2',
  default => 'none',
}

Le sélecteur fonctionne de la même manière que case à la différence qu'au lieu de fournir des ressources à exécuter, il définie une valeur. il est introduit par le symbole ? suivant la condition à évaluer.

Permet l'exécution d'une commande spécifique.

exec { 'HelloWorld':                                    # Nom de la ressource
  command => 'echo "Hello World!"',                     # Commande à exécuter
  cwd     => '/tmp',                                    # Dossier à partir duquel exécuter la commande
  path    => ['/bin/', '/usr/bin', '/usr/sbin',],       # Dossiers dans lesquels chercher la commande à exécuter
}

Pour la création, modification suppression d'un fichier.

file { '/home/nekan/test.txt':                                             # Chemin du fichier
  content => template('file/test.txt'),                                    # Emplacement de la source
  ensure  => 'present',                                                    # 'present' pour la création et 'absent' pour la suppression
  mode    => '0755',                                                       # Droits du fichier (chmod)
  owner   => 'nekan',                                                      # Propriétaire du fichier (chown)
  group   => 'adm',                                                        # Groupe du fichier (chgrp)
}

Pour l'ajout, la modification ou la suppression d'une ligne dans un fichier.

file_line { 'puppet_test':                                                 # Nom de la ligne (arbitraire)
  line    => 'ligne = ligne de test',                                      # contenu de la ligne tel qu'elle doit être dans le fichier
  match   => '^ligne',                                                     # 'match' permet de vérifier la ligne à modifier par le biais d'une regex 
  after   => '^# Logs',                                                    # recherche la ligne à modifier après une ligne spécifié par la regex
  path    => '/etc/nagios/nrpe.d/check_debian.cfg',                        # Chemin du fichier à modifier
  notify  => Service['nagios-nrpe-server'],                                # Service à notifier (redémarrer, recharger) après modification
}

Pour gérer les paquets (installation, suppression, …)

package { 'openssl':               # Paquet à gérer
  ensure => 'present',             # A installer si absent
  mark   => 'hold',                # Verrouiller la version (empêche les mises à jour)
}

Permet de gérer un service (démarrage, arrêt, redémarrage, rechargement, etc.)

service { 'apache2':                     # Service à gérer
  ensure => 'running',                   # Le service doit être en cours d'exécution
  enable => 'true',                      # Le service doit être en démarrage automatique
}

Permet de gérer les fichiers authorized_keys (contenant les clés SSH publiques ainsi que leurs options)

ssh_authorized_key { '/home/nekan/.ssh/authorized_keys':       # Gestion du fichier ~/.ssh/authorized_keys
  ensure  => 'present',                                        # present : création si absent | absent : suppression si présent
  user    => 'nekan',                                          # Définition du l'utilisateur lié à la clé
  type    => 'ssh-rsa',                                        # Type de la clé à ajouter
  key     => 'AAAAB3NzaC[...]Z6q17zF4sW1WvU=',                 # Clé à ajouter
}

Permet de gérer les utilisateurs (création, suppression, etc)

user { 'nekan':                                      # Création de l'utilisateur
  ensure     => present,                             # present : création si absent | absent : suppression si présent        
  shell      => "/bin/bash",                         # Le shell qu'utilisera l'utilisateur
  password   => '$6$/odkSIo4.[...]YW/lpsg1',         # Le mot de passe de l'utilisateur en version sécurisée
  groups     => ['sudo'],                            # La lise de groupes que doit intégrer l'utilisateur 
  managehome => yes,                                 # Création du dossier home
}

Les nœuds ne sont rien d'autres que les clients du serveur puppet. Ils sont définis par le mot-clé node, suivi du nom du client et de l'ensemble des modules et classes qui doivent s'appliquer à ce dernier. Exemple :

node 'test1' { include class1, class2, class3 }
node 'test2' {
  include class1
  include class4
  include class5
}
class user_nekan{                                      # Nom de la classe
  $user = 'nekan'                                      # Nom de l'utilisateur variabilité afin de faciliter la duplication de la classe
  user { $user:                                        # Création de l'utilisateur
    ensure     => present,                             # present : création si absent | absent : suppression si présent        
    shell      => "/bin/bash",                         # Le shell qu'utilisera l'utilisateur
    password   => '$6$/odkSIo4.[...]YW/lpsg1',         # Le mot de passe de l'utilisateur en version sécurisée
    groups     => ['sudo'],                            # La lise de groupes que doit intégrer l'utilisateur 
    managehome => yes,                                 # Création du dossier home
  }

  ssh_authorized_key { $user:                          # Gestion du fichier ~/.ssh/authorized_keys
    ensure  => present,                                # present : création si absent | absent : suppression si présent
    user    => $user,                                  # Définition du l'utilisateur lié à la clé
    type    => 'ssh-rsa',                              # Type de la clé à ajouter
    key     => 'AAAAB3NzaC[...]Z6q17zF4sW1WvU=',       # Clé à ajouter
  }
    
  file{"/home/$user":                                  # Gestion du dossier home
    mode    => '0700',                                 # Droits à appliquer sur le dossier
  }

  file {"/home/$user/.bashrc":                         # Gestion du fichier ~/.bashrc
    ensure  => present,                                # present : création si absent | absent : suppression si présent
    owner   => $user,                                  # Définition du propriétaire du fichier (chown)
    group   => $user,                                  # Définitions du groupe du fichier (chgrp)
    content => file('file/root_bashrc'),               # Source du fichier à copier sous la forme module/fichier. La racine est '/etc/puppetlabs/code/environments/<environnement>/modules/<module>/files/<fichier>'
  }
}

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • puppet_conf.1669113415.txt.gz
  • Dernière modification : 2022/11/22 11:36
  • de nekan