| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
| puppet_conf [2022/11/21 20:35] – [Les fonctions de base] nekan | puppet_conf [2022/11/22 23:03] (Version actuelle) – [Balises] nekan |
|---|
| |
| 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. | 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. |
| |
| Au niveau des composants, les fichiers ''*.pp'' contiendra : | |
| * Des fonctions : peut être la création, modification, suppression d'un fichier, la gestion d'un service, l'installation, suppression d'un paquet, etc... | |
| * Des classes : il s'agit d'un ensemble de fonctions. | |
| * Des modules : il s'agit d'un ensemble de classes. | |
| |
| * Référence : [[https://puppet.com/docs/puppet/7/language-and-concepts.html|Puppet]] | * Référence : [[https://puppet.com/docs/puppet/7/language-and-concepts.html|Puppet]] |
| | |
| ===== Le langage Puppet ===== | ===== Le langage Puppet ===== |
| |
| |
| Le langage utilisé par ''puppet'' permet de décrire l'état dans lequel au souhaite mettre le système. On parlera alors de : | Le langage utilisé par ''puppet'' permet de décrire l'état dans lequel au souhaite mettre le système. On parlera alors de : |
| * ''catalogs'' : l'ensemble des données (''ressources'', ''classes'' et ''manifests'') disponibles pour un agent. | |
| * ''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. | * ''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 : |
| | <file>ressource { 'Titre': |
| | paramètre1 => 'valeur', |
| | paramètre2 => 'valeur', |
| | }</file> |
| |
| ===== Les fonctions de base ===== | 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 à : |
| |
| ==== Gestion des fichiers ==== | ==== Déclaration de variables ==== |
| |
| La gestion d'un fichier est introduit par les termes : | <file>$variable = 'valeur'</file> |
| * ''file'' : création, suppression ou modification de l'intégralité du contenu. | |
| * ''file_line'' : création, suppression ou modification d'une ligne spécifique. | La variable est nommée et utilisé par le biais du symbole ''$''. |
| | |
| | ==== Condition à test unitaire (if) ==== |
| | |
| | <file>if $trusted['hostname'] == 'serv1' { |
| | include class1 |
| | } elsif $trusted['hostname'] == 'serv2' { |
| | include class2 |
| | } else { |
| | include class3 |
| | }</file> |
| | |
| | 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. |
| | |
| | ==== Condition à test multiple (case) ==== |
| | |
| | <file>case $trusted['hostname'] { |
| | 'serv1': { |
| | include class1 |
| | } |
| | 'serv2': { |
| | include class2 |
| | } |
| | default: { |
| | include class3 |
| | } |
| | }</file> |
| | |
| | ''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. |
| | |
| | ==== Condition négative (unless) ==== |
| | |
| | <file>unless $trusted['hostname'] == 'serv1' { |
| | include class4 |
| | }</file> |
| | |
| | ''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''. |
| | |
| | ==== Sélecteur (?) ==== |
| | |
| | <file> $servfunction = $trusted['hostname'] ? { |
| | 'serv1' => 'dns', |
| | 'serv2' => 'apache2', |
| | default => 'none', |
| | }</file> |
| | |
| | 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. |
| | |
| | ==== Hiérarchie ==== |
| | |
| | Il est possible de définir une hiérarchie aux niveaux des ressources afin de s'assurer la mise en place de dépendances. On aura donc le choix parmi : |
| | * ''before'' : applique la ressource principale avant la ressource déclarée après le ''before''. |
| | * ''require'' : applique la ressource introduite par le ''require'' avant la ressource principale. |
| | * ''notify'' : comme ''before'' à la différence sauf que si la ressource principale est modifié, la ressource secondaire est réappliquée. |
| | * ''subscribe'' : comme ''require'' à la différence que si la ressource introduite est modifié, la ressource principale est réappliquée. |
| | ===== Type de ressources les plus fréquents ===== |
| | |
| | ==== exec ==== |
| | |
| | Permet l'exécution d'une commande spécifique. |
| | |
| | * Référence : [[https://puppet.com/docs/puppet/7/types/exec.html|Resource Type: exec]] |
| | |
| | <file>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 |
| | }</file> |
| | |
| | ==== file ==== |
| | |
| | Pour la création, modification suppression d'un fichier. |
| |
| * Référence : [[https://puppet.com/docs/puppet/5.5/types/file.html|Ressource Type: file]] | * Référence : [[https://puppet.com/docs/puppet/5.5/types/file.html|Ressource Type: file]] |
| * Référence : [[http://www.puppetmodule.info/modules/puppetlabs-stdlib/4.25.1/puppet_types/file_line|Ressource Type: file_line]] | |
| |
| <file>file { '/home/nekan/test.txt': # Chemin du fichier | <file>file { '/home/nekan/test.txt': # Chemin du fichier |
| content => template('file/test.txt'), # Emplacement de la source | content => template('file/test.txt'), # Emplacement de la source |
| ensure => 'present', # 'present' pour la création et 'absent' pour la suppression | ensure => 'present', # 'present' pour la création et 'absent' pour la suppression |
| mode => '0755', # Droits du fichier (chmod) | mode => '0755', # Droits du fichier (chmod) |
| owner => 'nekan', # Propriétaire du fichier (chown) | owner => 'nekan', # Propriétaire du fichier (chown) |
| group => 'adm', # Groupe du fichier (chgrp) | group => 'adm', # Groupe du fichier (chgrp) |
| } | }</file> |
| | |
| | ==== file_line ==== |
| | |
| | Pour l'ajout, la modification ou la suppression d'une ligne dans un fichier. |
| | |
| | * Référence : [[http://www.puppetmodule.info/modules/puppetlabs-stdlib/4.25.1/puppet_types/file_line|Ressource Type: file_line]] |
| |
| file_line { 'puppet_test': # Nom de la ligne (arbitraire) | <file>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 | 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 | 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 | 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 | 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 | notify => Service['nagios-nrpe-server'], # Service à notifier (redémarrer, recharger) après modification |
| }</file> | }</file> |
| |
| | ==== package ==== |
| |
| | Pour gérer les paquets (installation, suppression, ...) |
| | |
| | * Référence : [[https://puppet.com/docs/puppet/7/types/package.html|Resource Type: package]] |
| | |
| | <file>package { 'openssl': # Paquet à gérer |
| | ensure => 'present', # A installer si absent |
| | mark => 'hold', # Verrouiller la version (empêche les mises à jour) |
| | }</file> |
| | |
| | ==== service ==== |
| | |
| | Permet de gérer un service (démarrage, arrêt, redémarrage, rechargement, etc.) |
| | |
| | * Référence : [[https://puppet.com/docs/puppet/7/types/service.html|Resource Type: service]] |
| | |
| | <file>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 |
| | }</file> |
| | |
| | ==== ssh_authorized_key ==== |
| | |
| | Permet de gérer les fichiers authorized_keys (contenant les clés SSH publiques ainsi que leurs options) |
| | |
| | * Référence : [[https://puppet.com/docs/puppet/5.5/types/ssh_authorized_key.html|Resource Type: ssh_authorized_key]] |
| | |
| | <file>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 |
| | }</file> |
| | |
| | ==== user ==== |
| | |
| | Permet de gérer les utilisateurs (création, suppression, etc) |
| | |
| | * Référence : [[https://puppet.com/docs/puppet/7/types/user.html|Resource Type: user]] |
| | |
| | <file>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 |
| | }</file> |
| |
| ===== Les classes ===== | ===== Les classes ===== |
| |
| ===== Les modules ===== | * Référence : [[https://puppet.com/docs/puppet/7/lang_classes.html|Classes]] |
| |
| | Les classes sont des déclarations de ressources introduites par le terme ''class''. Une fois déclarée, la classe peut être ajoutée à l'exécution par les termes : |
| | * ''include'' : il s'agit de la déclaration la plus fréquente, elle exécute simplement la classe. |
| | * ''require'' : ce terme introduit la classe en tant que dépendance. |
| | * ''contain'' : ce terme introduit la classe en tant que composant d'une autre classe. |
| | |
| | A l'intérieur de la classe, on trouvera une succession de déclarations d'autres ressources, le but étant de gérer toutes ces ressources en une seule fois. |
| | |
| | <file>class apache { |
| | package {'apache2': |
| | ensure => present |
| | before => File['/etc/apache2/apache2.conf'], |
| | } |
| | file {'/etc/apache2/apache2.conf': |
| | ensure => file, |
| | owner => 'www-data', |
| | content => file('apache/apache2.conf'), |
| | } |
| | service {'apache2': |
| | ensure => running, |
| | enable => true, |
| | subscribe => File['/etc/apache2/apache2.conf'], |
| | } |
| | }</file> |
| |
| ===== Les nœuds ===== | ===== Les nœuds ===== |
| <file>node 'test1' { include class1, class2, class3 } | <file>node 'test1' { include class1, class2, class3 } |
| node 'test2' { | node 'test2' { |
| include class1 | include class1 |
| include class4 | include class4 |
| include class5 | include class5 |
| }</file> | }</file> |
| ===== Exemples ===== | |
| |
| ==== Gestion d'un utilisateur ==== | ===== Les templates ===== |
| <file>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 | * Référence : [[https://puppet.com/docs/puppet/7/lang_template_epp.htm|Creating templates using Embedded Puppet]] |
| ensure => present, # present : création si absent | absent : suppression si présent | |
| user => $user, # Définition du l'utilisateur lié à la clé | Les ''templates'' sont des fichiers particuliers dont l'extension est ''*.epp'' (pour les versions ''puppet'' pures) ou ''*.erb'' (pour les versions ''ruby''). La différence principale avec les fichiers de ressources est que les ''templates'' embarquent du code dans leurs contenus permettant une personnalisation du résultat final, là où les fichiers sont statiques. Les ''templates'' sont enregistrés dans le sous-dossier du même nom dans les dossiers des modules auxquels ils appartiennent. En résumé : |
| type => 'ssh-rsa', # Type de la clé à ajouter | * ''file'' : |
| key => 'AAAAB3NzaC[...]Z6q17zF4sW1WvU=', # Clé à ajouter | * emplacement : ''/etc/puppetlabs/code/environment/<ENVIRONEMENT>/modules/<MODULE>/files/<FICHIER>'' |
| } | * contenu : fixe |
| | * ''template'' : |
| | * emplacement : ''/etc/puppetlabs/code/environment/<ENVIRONEMENT>/modules/<MODULE>/templates/<FICHIER>'' |
| | * contenu : dynamique |
| | |
| | ==== Balises ==== |
| | |
| | Le code intégré dans un ''template'' est basiquement le même que dans les fichiers de ressources. Cependant, afin de spécifier ce qui est interprétable de ce qui ne l'est pas, chaque élément de code est balisé : |
| | |
| | ^ Balise ^ Explication ^ Exemple ^ Retour ^ |
| | | Expression interprétable |||| |
| | | ''<%='' | Ouvre une expression interprétable. Le contenu sera donc exécuté et son résultat renvoyé comme valeur définitive. |<file><%= $facts[hostname] %></file>|<file>serv1</file>| |
| | | ''%>'' | Ferme l'expression interprétable. | ::: | ::: | |
| | | ''-%>'' | Ferme l'expression interprétable en supprimant les espaces ou retour charriot présents. | ::: | ::: | |
| | | Expression non interprétable |||| |
| | | ''<%'' | Ouvre une expression non interprétable. Le contenu ne sera donc exécuté et renvoyé tel quel comme valeur définitive. |<file><% if $facts[hostname] == 'serv1' { -%></file>|<file>if $facts[hostname] == 'serv1' {</file>| |
| | | ''<%-'' | Ouvre une expression non interprétable et supprime l'indentation. | ::: | ::: | |
| | | ''%>'' | Ferme l'expression non interprétable. | ::: | ::: | |
| | | ''-%>'' | Ferme l'expression non interprétable en supprimant les espaces ou retour charriot présents. | ::: | ::: | |
| | | Paramètres |||| |
| | | ''<% |'' | Ouvre la déclaration des paramètres. Ces derniers sont sous la forme '' type $nom = 'valeur par défaut%%'%%''. |<file><% | String $service_state = 'running', |
| | Boolean $service_enable = true |
| | | %></file>|| |
| | | ''<%- %%|%%'' | Ouvre la déclaration des paramètres en supprimant l'indentation. | ::: || |
| | | ''%%|%% %>'' | Ferme la déclaration des paramètres. | ::: || |
| | | ''%%|%% -%>'' | Ferme la déclaration des paramètres en supprimant les espaces ou retour charriot présents. | ::: || |
| | | Commentaires |||| |
| | | ''<%#'' | Ouvre un commentaire. |<file><%# Commentaire %></file>|<file># Commentaire</file>| |
| | | ''%>'' | Ferme le commentaire. | ::: | ::: | |
| | | ''-%>'' | Ferme le commentaire en supprimant les espaces ou retour charriot présents. | ::: | ::: | |
| | |
| | Exemple de ''template'' : |
| | <file># File Managed by Puppet |
| | # Module apache2, Template virtualhost.epp |
| | |
| | <%- | String $Domain = undef, |
| | String $Website = undef, |
| | String $DocumentRoot = undef, |
| | Optional[String] $Alias = undef |
| | | -%> |
| | |
| | <VirtualHost *:80> |
| | ServerAdmin webmaster@<%= $Domain %> |
| | ServerName <%= $Website %> |
| | |
| file{"/home/$user": # Gestion du dossier home | RewriteEngine On |
| mode => '0700', # Droits à appliquer sur le dossier | RewriteCond %{SERVER_NAME} =<%= $Domain %> |
| } | RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] |
| | </VirtualHost> |
| | <VirtualHost *:443> |
| | ServerAdmin webmaster@<%= $Domain %> |
| | DocumentRoot <%= $DocumentRoot %> |
| | ServerName <%= $Website %> |
| | <% if $Alias != "" -%> |
| | ServerAlias <%= $Alias %> |
| | <% end -%> |
| | ErrorLog <%= scope.lookupvar('apache::log_dir')%>/<%= $Website %>-error_log |
| | CustomLog <%= scope.lookupvar('apache::log_dir')%>/<%= $Website %>-access_log combined |
| | |
| | SSLCertificateFile /etc/letsencrypt/live/<%= $Website %>/fullchain.pem |
| | SSLCertificateKeyFile /etc/letsencrypt/live/<%= $Website %>/privkey.pem |
| | Include /etc/letsencrypt/options-ssl-apache.conf |
| | |
| | Header always set Strict-Transport-Security "max-age=63072000" |
| | Header always set X-Content-Type-Options nosniff |
| | |
| | Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" |
| | </VirtualHost></file> |
| |
| file {"/home/$user/.bashrc": # Gestion du fichier ~/.bashrc | Une fois créé, le ''template'' peut être appelé via le terme ''epp'' : |
| ensure => present, # present : création si absent | absent : suppression si présent | <file>file { '/etc/apache2/sites-available/www.shyrkasystem.com.conf': |
| owner => $user, # Définition du propriétaire du fichier (chown) | ensure => file, |
| group => $user, # Définitions du groupe du fichier (chgrp) | content => epp('apache2/virtualhost.epp', { |
| 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>' | 'Domain' => 'shyrkasystem.com', |
| | 'Website' => 'www.shyrkasystem.com', |
| | 'Alias' => 'web.shyrkasystem.com', |
| | 'DocumentRoot' => '/var/www/html' |
| } | } |
| | ) |
| }</file> | }</file> |
| |
| {{ :underconstruction-copy-300x150.jpg |}} | |
| |
| ~~DISCUSSION~~ | ~~DISCUSSION~~ |