Listes des commandes sous Puppet 2.7.X.

1. Avant-propos
1.1. Présentation
1.1.1 Schéma d'architecture
1.1.2 Schéma fonctionnel
1.2. Introduction
2. Listes des différentes commandes sous Puppet Master
2.1. Liste des machines vu par Puppet
2.2. Liste des machines qui ont un certificat non accepté Puppet
2.3. Accepter le certificat d'un noeud Puppet
2.4. Lecture du certificat d'un noeud Puppet
2.5. Connaitre la version Puppet
2.6. Etat du Master Puppet
2.7. Démarrage du Master Puppet
2.8. Arrêt du Master Puppet
2.9. Re-Démarrage du Master Puppet
2.10. Supprimer un certificat Puppet
3. Listes des différentes commandes sous un client Puppet (noeud)
3.1. Création d'un client provisoire (pour test)
3.2. Démarrage du client Puppet
3.3. Etat du client Puppet
3.4. Arrêt du client Puppet
3.5. Version du client Puppet
3.6. Test du client Puppet vers le Master Puppet
3.6.1 Test qui fonctionne pas
3.6.2 Test qui fonctionne à moitier
3.6.3 Test qui fonctionne
3.7. Visualisation de la configuration du client Puppet
4. Mecanique Puppet
4.1. Resource Types (Types)
4.2. Resource Types reference (Un genre de Man Puppet)
4.3. Exemple simple de création de ressource Puppet
4.3.1 Installation d'un package OpenSSH
4.3.2 Creation d'un fichier /etc/motd
4.3.3 Démarrage d'un services httpd
4.4. Exemple complexe de création de ressource Puppet
4.4.1 Gestion de Nginx avec module
4.4.2 Création du fichier de configuration de Nginx avec module
4.5. Resource Abstraction Layer
4.5.1 Liste les ressources de tous les utilisateurs
4.5.2 Liste les ressources d'un utilisateur
4.5.3 Liste les ressources de tous les packages
4.5.4 Liste les ressources de tous les services
4.6. Activation/Désactivation d'une ressource service
4.7. Définition d'une Classe
4.8. Déclaration d'une Classe
4.9. Defines (définitions/déclaration)
4.10. Les Variables
4.11. Facts
4.12. Variables utilisateurs
4.13. Variables intègré dans Puppet
4.13.1 Variables intègrées dans les noeuds Puppet
4.13.2 Variables intègrées dans le Master Puppet
4.13.3 Variables intègrées dans Puppet durant la compilation du "Catalog"
4.14. Environnement Puppet
4.14.1 Configuration par fichier d'environnement (2.7.X)
4.14.2 Répertoire d'environnement (2.7.X)
4.15. Noeud Puppet
4.16. Classifications des Nœuds via ENC
4.17. Classifications des Nœuds avec Hiera
4.18. Le Catalog Puppet
5. Tutoriel mise en place rapide pour test
5.1. Installation des binaires du Master Puppet
5.1.1 Installation avec apt-get du Master Puppet
5.1.2 Installation avec yum du Master Puppet
5.2. Installation des binaires du Client Puppet
5.2.1 Installation avec apt-get du Client Puppet
5.2.2 Installation avec yum du Client Puppet
5.3. Configuration du Client Puppet
5.4. Génération des certificats du Client Puppet
5.5. Configuration du Master Puppet
5.5.1 Fichier puppet.conf
5.5.2 Fichier site.pp
5.5.3 Fichier nodes.pp
5.6. Création d'un module Puppet
5.6.1 Fichier init.pp dans module
5.6.2 Fichier a transfèrer sur les noeuds
5.7. Re-démarrage du Master Puppet
5.8. Test via un client Puppet

1. Avant-propos


1.1 - Présentation.


Puppet est un logiciel libre de gestion de configuration centralisée.
Il permet gérer les configurations de chaque machine d'un parc automatiquement.
Pour fonctionner Puppet utilise un certain nombre de composant que je vous ai listé ci-dessous :

Facter : Outil complémentaire pour récupérer des données du système.
MCollective : Framework d'orchestration des infrastructures
Hiera : Outil de recherche de clé-valeur de Puppet où les données peuvent être placés
PuppetDB : Stocke toutes les données générées par Puppet
Puppet DashBoard : C'est une interface Web de Puppet et externe Node classificateur (ENC)
The Foreman : Un outil de provisionnement tiers bien connu et Puppet ENC
Geppetto : Un IDE Puppet sur Eclipse

1.1.1 - Schema d'architecture




                                               +--------------------------------------+ 
                                               | Serveur PuppetMaster                 | 
                                               | Version : 2.7.22                     | 
                                               | Hostname : arecibo                   | 
                                               |                                      | 
                                               | IP : 10.25.85.56                     | 
                                               | Port: 8140 (port d'écoute WEB PUPPET)| 
                                               |                                      | 
        --------+                              | +---------------------------------+  | 
                |     +-------------------+    | |     PuppetMaster                |  | 
                |<----| Agent MCollective |--->| |                                 |  |
                |     +-------------------+    | +---------------------------------+  | 
                |                              +--------------------------------------+ 
 ---------------+                                       A                     A
                                                       /                      |
                                                      /                       |
                                             +-------------------+      +---------------------+ 
                                             | Agent MCollective |      | Agent MCollective   |
                                             +-------------------+      +---------------------+
                                                  /                           |
                                                 /                            |
                                                V                             V
                                +---------------------------+             +--------------------------+
                                |  Hostname : Jupiter       |             | Hostname : Saturn        |
                                |  Noeud Puppet : 2.7.22    |             | Noeud Puppet : 2.7.22    |
                                |                           |             |                          |
                                |  I.P : 168.2.15.23        |             | I.P : 168.2.15.24        |
                                |  Port :                   |             | Port :                   |
                                |                           |             |                          |
                                |  +----------------------+ |             | +----------------------+ |
                                |  | Facter               | |             | | Facter               | |
                                |  +----------------------+ |             | +----------------------+ |
                                |                           |             |                          |
                                |                           |             |                          |
                                +---------------------------+             +--------------------------+




2. Listes des différentes commandes sous Puppet


2.1 - Liste des machines vu par Puppet


Nous allons lister tous les noeuds vu par Puppet.
Autrement dit toutes les machines qui sont vu par Puppet qui ont un client Puppet.
Commande a éxecuter sur le serveur Puppet Master.
[root@arecibo] # puppetca -la
[root@arecibo] # puppetca -la 
  "saturn"	(34:07:75:41:72:AF:60:91:4B:6B:70:B8:43:16:EE:D8)
  "orion"	(31:C6:34:B7:C1:2A:70:89:A3:3F:1C:51:38:15:98:1C)
  "venus"	(CF:13:CA:17:FB:6E:37:7F:6A:01:74:C5:9D:FE:73:7A)
+ "mercure"	(78:85:E5:65:7A:71:6B:49:0D:F4:32:E0:D7:6E:05:78)
+ "uranus"	(3A:B5:F0:49:E1:99:47:87:8D:3B:DE:61:63:6E:08:BE)
+ "jupiter"	(54:33:C8:A4:9D:CD:77:88:8F:F8:FF:4A:03:9B:22:32)
+ "mars"	(41:8A:9B:9A:A9:4A:E1:12:19:D3:3D:D1:69:31:1E:0D)
+ "pluton"	(C4:90:D9:D3:E8:42:C9:93:17:73:1C:0E:D6:12:F5:4B)
+ "titan"	(14:8F:18:41:08:9F:67:F5:A3:57:1B:68:CA:8C:40:2B)
+ "europe"	(27:30:5D:3D:C1:34:7F:5A:6C:D2:B2:0E:83:83:CF:9C)
+ "sedna"	(49:FA:33:7E:05:F5:28:DD:EB:D9:0F:6E:93:7F:E6:D3)
+ "demos"	(CE:01:0C:39:41:FE:51:57:D4:56:57:14:2E:FA:04:63)
+ "phobos"	(7D:E2:A4:14:B4:2F:EA:90:0C:2A:D2:77:60:57:AB:19)
+ "soleil"	(F1:74:E1:C6:D3:4D:DF:57:96:38:84:E3:B3:6B:74:4A)
[root@arecibo] # 

2.2 - Liste des machines qui ont un certificat non accepté Puppet


Commande a éxecuter sur le serveur Puppet Master.
Afin de voir les noeuds qui ont un certificat valide mais non accepté par le master Puppet, lancer la commande suivante :
[root@arecibo] # puppet cert list
[root@arecibo] # puppet cert list
  "saturn" (34:07:75:41:72:AF:60:91:4B:6B:70:B8:43:16:EE:D8)
  "orion" (31:C6:34:B7:C1:2A:70:89:A3:3F:1C:51:38:15:98:1C)
  "venus" (CF:13:CA:17:FB:6E:37:7F:6A:01:74:C5:9D:FE:73:7A)
[root@arecibo] # 

2.3 - Accepter le certificat d'un noeud Puppet


Nous allons signer le certificat du serveur "saturn".
[root@arecibo] # puppetca --sign saturn
[root@arecibo] # puppetca --sign saturn
notice: Signed certificate request for saturn
notice: Removing file Puppet::SSL::CertificateRequest saturn at '/var/lib/puppet/ssl/ca/requests/saturn.pem'
Vérification des noeuds qui n'ont pas leur certificat accepté.
[root@arecibo] # puppetca --list
  "orion" (31:C6:34:B7:C1:2A:70:89:A3:3F:1C:51:38:15:98:1C)
  "venus" (CF:13:CA:17:FB:6E:37:7F:6A:01:74:C5:9D:FE:73:7A)
[root@arecibo] # 
Vérification des noeuds qui ont pas leur certificat accepté (serveur avec le +).
Noté que la clef du certificat a changé.
[root@arecibo] # puppetca -la
  "orion"   (31:C6:34:B7:C1:2A:70:89:A3:3F:1C:51:38:15:98:1C)
  "venus"   (CF:13:CA:17:FB:6E:37:7F:6A:01:74:C5:9D:FE:73:7A)
+ "saturn"  (F8:BE:7A:39:6D:2C:D0:00:0C:71:07:71:B0:81:EB:96)
+ "mercure" (78:85:E5:65:7A:71:6B:49:0D:F4:32:E0:D7:6E:05:78)
+ "uranus"  (3A:B5:F0:49:E1:99:47:87:8D:3B:DE:61:63:6E:08:BE)
+ "jupiter" (54:33:C8:A4:9D:CD:77:88:8F:F8:FF:4A:03:9B:22:32)
+ "mars"    (41:8A:9B:9A:A9:4A:E1:12:19:D3:3D:D1:69:31:1E:0D)
+ "pluton"  (C4:90:D9:D3:E8:42:C9:93:17:73:1C:0E:D6:12:F5:4B)
+ "titan"   (14:8F:18:41:08:9F:67:F5:A3:57:1B:68:CA:8C:40:2B)
+ "europe"  (27:30:5D:3D:C1:34:7F:5A:6C:D2:B2:0E:83:83:CF:9C)
+ "sedna"   (49:FA:33:7E:05:F5:28:DD:EB:D9:0F:6E:93:7F:E6:D3)
+ "demos"   (CE:01:0C:39:41:FE:51:57:D4:56:57:14:2E:FA:04:63)
+ "phobos"  (7D:E2:A4:14:B4:2F:EA:90:0C:2A:D2:77:60:57:AB:19)
+ "soleil"  (F1:74:E1:C6:D3:4D:DF:57:96:38:84:E3:B3:6B:74:4A)
[root@arecibo] # 

2.4 - Lecture du certificat d'un noeud Puppet


Lecture du certificat.
[root@arecibo] # openssl x509 -in /var/lib/puppet/ssl/ca/signed/saturn.pem -noout -text
[root@arecibo] # openssl x509 -in /var/lib/puppet/ssl/ca/signed/saturn.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 16 (0x10)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=Puppet CA: puppet
        Validity
            Not Before: Jan 18 13:54:27 2016 GMT
            Not After : Jan 17 13:54:27 2021 GMT
        Subject: CN=nuapgsa001
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:c2:b6:42:72:b3:1e:7e:59:48:70:29:ae:b3:d4:
                    bc:4a:8c:c4:ad:36:83:00:be:69:6b:e7:a2:7c:da:
                    36:a9:07:4a:a6:0a:cc:68:c0:9c:9c:4c:6a:36:e4:
                    e0:4c:20:57:57:96:db:6f:1e:14:7f:29:11:37:2f:
                    1d:68:c1:ed:06:55:b8:e3:bc:f6:6c:69:b1:d6:85:
                    f2:27:02:10:f6:43:a7:f2:25:56:71:9e:d4:37:79:
                    af:f6:8e:c1:94:10:4f:1e:b8:02:d0:be:93:53:fc:
                    64:8a:69:77:a0:db:d1:29:2c:52:df:c6:f0:2e:f9:
                    5a:78:5f:65:08:f2:19:a1:ed:57:c4:4e:1e:eb:be:
                    62:b1:db:de:8a:d7:35:41:bf:ae:12:1c:59:a6:f5:
                    81:17:cb:2d:2c:39:23:b1:4b:18:03:b6:dd:02:67:
                    2e:85:fd:c8:ef:4b:eb:42:3a:8f:df:16:68:8d:5d:
                    00:00:b5:c9:78:18:83:fb:e0:98:e2:9e:41:2e:36:
                    6b:af:0b:7b:4f:65:3a:c4:c7:2a:e7:90:56:a5:5f:
                    ec:98:93:49:fd:fb:d7:72:eb:54:d7:c6:ae:3e:fc:
                    11:ed:bf:62:65:d0:e6:50:f0:e4:ea:df:cc:da:69:
                    17:bf:a8:88:88:4c:95:66:59:12:ce:be:72:6f:1e:
                    72:30:fc:d8:d5:56:31:9f:d9:b0:d8:ce:55:e6:2d:
                    8c:a6:61:14:de:5c:d2:48:b5:74:f4:25:c1:17:19:
                    32:39:0b:b6:5e:e3:3f:69:5c:79:5b:ca:20:7e:35:
                    1d:4d:aa:e2:db:50:0d:ba:33:22:33:04:6a:44:b8:
                    e3:27:48:59:20:ab:5f:43:72:f8:68:44:90:a6:1a:
                    0f:7f:1c:24:c3:51:15:33:30:42:8d:6f:87:3b:68:
                    7b:06:61:d3:3e:8d:5d:64:22:f6:28:2d:99:23:05:
                    e5:0d:be:6a:f5:f6:bb:42:c6:34:ec:2c:e4:ea:79:
                    65:c2:17:06:71:66:3a:ac:9d:05:20:6c:f1:e9:af:
                    09:66:2e:0b:c4:31:be:22:03:86:31:27:49:12:3f:
                    43:a7:ab:1d:4f:ef:a7:ef:6c:9b:71:65:69:40:8f:
                    04:01:c0:39:12:93:e8:55:2f:6a:41:85:45:40:cd:
                    5a:6a:a6:0f:70:11:d2:5a:88:5b:0d:d3:a0:0b:ef:
                    66:9a:4a:02:41:53:a3:07:59:df:22:0d:58:9b:b4:
                    45:82:8b:83:36:75:a8:6d:86:45:38:9b:55:cc:5e:
                    07:4e:66:53:ad:61:98:d5:13:80:78:f5:4f:34:d4:
                    c3:b0:e3:41:4f:8b:f8:e0:02:83:cd:03:e1:86:d8:
                    dc:d7:b5
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                5E:62:9F:3B:93:F1:2D:E2:7D:09:97:FD:27:1B:81:C1:D2:DF:DC:50
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            Netscape Comment: 
                Puppet Ruby/OpenSSL Internal Certificate
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Extended Key Usage: critical
                TLS Web Server Authentication, TLS Web Client Authentication
    Signature Algorithm: sha1WithRSAEncryption
         aa:13:f4:10:31:90:ea:74:fb:16:cc:81:9d:8a:2b:16:0d:b0:
         9a:01:65:1e:65:00:10:c5:be:e5:ff:ad:e5:6d:f9:e6:7b:f1:
         00:60:ab:4b:58:b9:b2:82:2c:13:bc:e1:ab:29:b0:26:42:c2:
         99:e2:c6:e2:c4:21:2d:82:e2:e1:84:03:48:61:f7:3a:e7:66:
         1b:06:6e:0d:b5:07:74:0f:a5:b9:7f:ed:7c:31:c5:cb:f3:ef:
         38:98:c8:63:7b:d3:63:ab:8a:e8:33:8e:c1:ab:04:e2:e6:d8:
         4e:e7:d1:02:fb:72:26:8b:4c:b4:f9:ec:6b:61:29:dc:b1:4b:
         c9:b8:9a:e5:57:dc:82:de:91:91:a7:1c:e7:93:26:e7:f2:4c:
         cd:25:42:fc:29:53:76:05:ae:c8:69:ec:43:be:7d:35:36:57:
         35:ae:72:4d:58:9b:96:ac:75:b1:48:66:a3:d9:87:c7:27:da:
         dd:cf:ca:7e:f3:f1:81:b7:10:a4:38:e6:49:d0:48:35:c8:70:
         d3:e5:21:dd:87:ed:98:4c:a4:24:7b:e8:4d:53:50:3a:0f:fb:
         25:81:c2:60:d9:62:8a:2a:87:01:86:c0:7a:b9:3a:10:75:49:
         e0:2e:5b:11:27:98:75:b9:f5:37:5b:dc:c4:39:c8:a1:99:61:
         fb:1c:c4:0c:5b:a7:b1:8f:fb:52:3e:e2:36:b3:6e:a5:92:59:
         a0:53:f2:36:eb:4c:56:f2:b7:50:a4:83:d8:6b:e9:e9:d4:c6:
         61:1b:45:bf:01:11:be:e0:57:dc:04:15:68:e6:33:2e:90:c9:
         47:43:81:8a:e1:55:45:02:5d:eb:b1:ff:3e:95:33:c0:a6:c6:
         cc:4f:6e:e6:a2:40:78:94:cd:f0:f5:76:47:41:dd:7c:cc:cf:
         45:ed:3a:73:6c:b1:f2:80:b5:ce:c6:2f:63:b0:08:e0:96:11:
         99:84:4a:fb:dd:bf:8d:15:67:00:0b:07:b7:f1:2d:f8:82:02:
         45:81:40:b4:8d:0c:45:80:53:7e:89:ff:41:1e:a1:60:ad:b3:
         72:ce:e8:59:2c:fd:7b:71:ef:54:2c:4a:80:aa:2b:c3:02:72:
         54:1a:2c:6d:87:98:cb:2c:8e:81:f2:e4:db:f4:80:1a:a6:69:
         6d:ff:2f:5b:c2:1d:f7:da:bc:8b:19:c3:87:c4:8b:9d:43:63:
         4a:5d:3a:39:41:cc:6a:25:0b:0b:10:28:30:17:ce:b5:9a:1e:
         dc:f8:9a:50:2c:3d:53:86:52:bc:9c:91:d1:e1:db:13:7a:47:
         c4:33:41:9b:51:64:b5:6b:7b:6a:16:25:9c:be:f4:a7:21:9c:
         e8:e9:3a:75:07:24:c4:42
[root@arecibo] # 

2.5 - Connaitre la version Puppet


Commande a éxecuter sur le serveur Puppet Master.
Afin de connaitre la version de votre Puppet master, taper la commande suivante :
[root@arecibo] # puppet --version
[root@arecibo] # puppet --version
2.7.22
[root@arecibo] # 

2.6 - Etat du serveur Puppet Master


[root@arecibo] # service puppetmaster status
puppetmasterd est mort mais le fichier pid existe
[root@arecibo] # 

2.7 - Démarrage du serveur Puppet Master


[root@arecibo] # service puppetmaster start
Démarrage de puppetmaster :                                [  OK  ]
[root@arecibo] # 

2.8 - Arrêt du serveur Puppet Master


[root@arecibo] # service puppetmaster stop
Arrêt de puppetmaster :                                [  OK  ]
[root@arecibo] # 

2.9 - Redémarrage du serveur Puppet Master


Sur les vieux linux ont peut bien sur utiliser l'init.d au lieu du service.
[root@arecibo] # /etc/init.d/puppetmaster restart
[root@arecibo] # /etc/init.d/puppetmaster restart
Arrêt de puppetmaster :                                    [  OK  ]
Démarrage de puppetmaster :                                [  OK  ]
[root@arecibo] # 

2.10 - Supprimer un certificat client Puppet


Commande a éxecuter sur le serveur Puppet Master.
Afin de supprimer les certificats d'un client Puppet sur le serveur Master Puppet, taper la commande suivante :
Remplacé le nom de mon serveur client Puppet "saturn" par le nom de host de votre machine.
[root@arecibo] # puppet cert -c saturn
[root@arecibo] # puppet cert -c saturn
[root@arecibo] # 

3. Listes des différentes commandes sous un client Puppet (noeud)


3.1 - Création d'un client provisoire (pour test)


Ajouter le nom du serveur Puppet Master dans votre fichier host.
[root@saturn] # vi /etc/hosts
Puis rajouter l'adresse ip de votre serveur Puppet Master, dans notre exemple :
10.25.85.56	arecibo puppetmaster
Faite un test sur le serveur de votre client, avec un ping vers le master Puppet.
[root@saturn] # ping puppetmaster
[root@saturn] # ping puppetmaster
PING puppetmaster (10.25.85.56) 56(84) bytes of data.
64 bytes from puppetmaster (10.25.85.56): icmp_seq=1 ttl=64 time=0.171 ms
64 bytes from puppetmaster (10.25.85.56): icmp_seq=2 ttl=64 time=0.186 ms
^C
--- puppetmaster ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1041ms
rtt min/avg/max/mdev = 0.171/0.178/0.186/0.015 ms
[root@saturn] #
Nous allons d'abord créer un fichier de configuration d'un client Puppet provisoire.
[root@saturn] # vi turlan_puppet_agent_test.conf
Voici le fichier :
[main]
certname = turlanthebestone
server = puppetmaster
environment = production
runinterval = 1h

Puis nous allons lancer le client.
NE VOUS INQUIETEZ pas on va se faire jeter, car le certificat n'est pas présent sur le master.
[root@saturn] # puppet agent -t --config ./turlan_puppet_agent_test.conf
[root@saturn] # puppet agent -t --config ./turlan_puppet_agent_test.conf
info: Creating a new SSL key for turlanthebestone
info: Creating a new SSL certificate request for turlanthebestone
info: Certificate Request fingerprint (md5): AC:F1:94:25:F6:A4:40:D6:09:47:C1:32:15:AE:CA:C9
Exiting; no certificate found and waitforcert is disabled
[root@saturn] #
En faite, si vous souhaitez faire le test qui permet d'attendre la validation du certificat serveur, il faut rajouter l'otion "waitforcert".
Comme dans l'exemple ci-dessous :
[root@saturn] # puppet agent -t --config ./turlan_puppet_agent_test.conf --waitforcert 60
[root@saturn] # puppet agent -t --config ./turlan_puppet_agent_test.conf --waitforcert 60
info: Creating a new SSL key for turlanthebestone
info: Creating a new SSL certificate request for turlanthebestone
info: Certificate Request fingerprint (md5): 78:1A:E1:44:D9:01:96:A5:9E:FF:37:3B:7D:F6:BB:98
notice: Did not receive certificate
notice: Did not receive certificate
notice: Did not receive certificate
notice: Did not receive certificate
Puis retourner sur le serveur Puppet Master nous voyons maintenant notre client en tapant la commande suivante.
[root@arecibo] # puppetca --list
[root@arecibo] # puppetca --list
  "turlanthebestone" (AC:F1:94:25:F6:A4:40:D6:09:47:C1:32:15:AE:CA:C9)
[root@arecibo] # 
Puis nous allons valider le certificat sur le serveur.
[root@arecibo] # puppetca --sign turlanthebestone
[root@arecibo] # puppetca --sign turlanthebestone
notice: Signed certificate request for turlanthebestone
notice: Removing file Puppet::SSL::CertificateRequest turlanthebestone at '/var/lib/puppet/ssl/ca/requests/turlanthebestone.pem'
[root@arecibo] # 

3.2 - Démarrage du client Puppet


Démarrage du client Puppet.
[root@saturn] # /etc/init.d/puppet start
[root@saturn] # /etc/init.d/puppet start
Démarrage de puppet :                                      [  OK  ]
[root@saturn] # 

3.3 - Etat du client Puppet


Etat du client Puppet.
[root@saturn] # /etc/init.d/puppet status
[root@saturn] # /etc/init.d/puppet status
puppetd (pid  4356) en cours d'exécution...
[root@saturn] # 

3.4 - Arrêt du client Puppet


Arrêt du client Puppet.
[root@saturn] # /etc/init.d/puppet stop
[root@saturn] # /etc/init.d/puppet stop
Arrêt de puppet :                                      [  OK  ]
[root@saturn] # 

3.5 - Version du client Puppet


Version du client Puppet.
[root@saturn] # puppet --version
[root@saturn] # puppet --version
2.7.25
[root@saturn] # 

3.6 - Test du client Puppet vers le Master Puppet


Nous allons voir comment tester un client Puppet.
Je vais vous montrer trois exemple.
Un test avec un agent qui ne fonction pas.
Un test avec un agent qui fonctionne à moitier.
Un test avec un agent qui fonctionne.

3.6.1 - Test qui fonctionne pas


Exemple d'un test qui NE FONCTIONNEPAS. Dans le cas présent, il y a une base Postgres derrière le Master Puppet qui ne fonctionne pas.
Après le lancement de la commande suivante sur le noeud Puppet (client machine saturn), nous voyons.
[root@saturn] # puppetd --test
ou (même commande, avec une synthaxe différente)
[root@saturn] # puppet agent --test
[root@saturn] # puppet agent --test
info: Retrieving plugin
info: Loading facts in /var/lib/puppetSystem/lib/facter/puppet_vardir.rb
info: Loading facts in /var/lib/puppetSystem/lib/facter/concat_basedir.rb
info: Loading facts in /var/lib/puppetSystem/lib/facter/root_home.rb
info: Loading facts in /var/lib/puppetSystem/lib/facter/facter_dot_d.rb
info: Loading facts in /var/lib/puppetSystem/lib/facter/pe_version.rb
err: Could not retrieve catalog from remote server: Error 400 on SERVER: could not connect to server: Connection refused
	Is the server running on host "127.0.0.1" and accepting
	TCP/IP connections on port 5433?

warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
[root@saturn] # 
Pour voir d'où vient le problème.
[root@saturn] # puppet agent --test --debug

3.6.2 - Test qui fonctionne à moitier


Voici un exemple qui fonctionne à moitier.
Après le lancement de la commande suivante sur le noeud Puppet (client machine saturn), nous voyons.
[root@saturn] # puppetd --test --waitforcert 60
ou (même commande, avec une synthaxe différente)
[root@saturn] # puppet agent --test --waitforcert 60
Une action a fonctionné, celle de la création d'un fichier turlan.txt dans /etc
Une action n'a pas fonctionné, celle du démarrage du service ssh (normal je ne l'ai pas installé pour le test).
[root@saturn] # puppetd --test --waitforcert 60
info: Caching catalog for saturn
info: Applying configuration version '1454596621'
err: /Stage[main]/Ssh/Service[ssh]/ensure: change from stopped to running failed: Could not start Service[ssh]: Execution of '/sbin/service ssh start' returned 1:  at /etc/puppet/modules/ssh/manifests/init.pp:8
notice: /Stage[main]/Turlan_module/File[/etc/turlan.txt]/ensure: defined content as '{md5}d478ba42f726b909c0b7034b5fc59950'
notice: Finished catalog run in 0.73 seconds
[root@saturn] #

3.6.3 - Test qui fonctionne


Voici un exemple qui fonctionne.
Après le lancement de la commande suivante sur le noeud Puppet (client machine saturn), nous voyons.
[root@saturn] # puppetd --test --waitforcert 60
ou (même commande, avec une synthaxe différente)
[root@saturn] # puppet agent --test --waitforcert 60
[root@saturn] # puppetd --test --waitforcert 60
info: Caching catalog for saturn
info: Applying configuration version '1454597689'
notice: /Stage[main]/Turlan_module/File[motd]/content: 
--- /etc/motd 2010-01-12 14:28:22.000000000 +0100
+++ /tmp/puppet-file20160204-29626-1tpzuew-0  2016-02-04 15:54:51.247649820 +0100
@@ -0,0 +1 @@
+Bienvenue à toi mon tutu...
\ No newline at end of file

info: FileBucket adding {md5}d41d8cd98f00b204e9800998ecf8427e
info: /Stage[main]/Turlan_module/File[motd]: Filebucketed /etc/motd to main with sum d41d8cd98f00b204e9800998ecf8427e
notice: /Stage[main]/Turlan_module/File[motd]/content: content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}a4b5c376aa230d1d8632722e764bd4d7'
notice: Finished catalog run in 0.70 seconds
[root@saturn] # 

3.7 - Visualisation de la configuration du client Puppet


Visualisation de la configuration du client Puppet.
[root@saturn] # puppet --genconfig
Dans l'exemple ci-dessous nous voulons visualiser seulement le répertoire ou sont les certificats.
[root@saturn] # puppet --genconfig | grep certdir
    # The default value is '$certdir/$certname.pem'.
    # The default value is '$certdir/ca.pem'.
    certdir = /var/lib/puppet/ssl/certs
[root@saturn] # 

4. Mecanique Puppet


4.1 - Resource Types (Types).


Un ressource Type c'est quoi ? Les "Types" de ressources sont des unités simples de configuration composées par :
Un type (package, service, file, user, mount, exec ...)
Un title (how is called and referred)
Un ou plusieurs arguments.
type { 'title':
  argument  => value,
  other_arg => value,
}
Voici un exemple avec une ressource de type fichier (file resource type):
file { 'motd':
  path    => '/etc/motd',
  content => 'Bienvenue à toi mon tutu...',
}
Vous pouvez voir le resultat ici.

4.2 - Resource Types reference (Un genre de Man Puppet).


Pour trouver en ligne le type de référence complet pour les versions les plus récentes ou les plus anciennes.
En ligne de commande sur un agent Puppet ou sur le Master Puppet :
[root@jupiter] # puppet describe file
[root@jupiter] # puppet describe file

file
====
Manages files, including their content, ownership, and permissions.
The `file` type can manage normal files, directories, and symlinks; the
    type should be specified in the `ensure` attribute. Note that symlinks
cannot

[...]

root@jupiter] #
Pour connaitre tous les "Types" de ressource, taper soit à partir du client soit à partir du Master.
[root@jupiter] # puppet describe --list
[root] # puppet describe --list
These are the types known to puppet:
augeas          -  Apply a change or an array of changes to the ...
computer        - Computer object management using DirectorySer ...
cron            -  Installs and manages cron jobs
exec            - Executes external commands
file            - Manages files, including their content, owner ...
filebucket      - A repository for backing up files
group           - Manage groups
host            - Installs and manages host entries
interface       - This represents a router or switch interface

[...]

Attention !! La cerise sur le gateau, afin de connaitre où sont les scripts "Ruby" associé au "Types" de ressource.
[root@jupiter] # ls $(facter rubysitedir)/puppet/type
[root@jupiter] # ls $(facter rubysitedir)/puppet/type
augeas.rb     filebucket.rb  macauthorization.rb  nagios_contactgroup.rb    nagios_host.rb               nagios_timeperiod.rb  scheduled_task.rb      sshkey.rb  yumrepo.rb
component.rb  file.rb        mailalias.rb         nagios_contact.rb         nagios_servicedependency.rb  notify.rb             schedule.rb            stage.rb   zfs.rb
computer.rb   group.rb       maillist.rb          nagios_hostdependency.rb  nagios_serviceescalation.rb  package.rb            selboolean.rb          tidy.rb    zone.rb
cron.rb       host.rb        mcx.rb               nagios_hostescalation.rb  nagios_serviceextinfo.rb     port.rb               selmodule.rb           user.rb    zpool.rb
exec.rb       interface.rb   mount.rb             nagios_hostextinfo.rb     nagios_servicegroup.rb       resources.rb          service.rb             vlan.rb
file          k5login.rb     nagios_command.rb    nagios_hostgroup.rb       nagios_service.rb            router.rb             ssh_authorized_key.rb  whit.rb
[root@jupiter] # 
Ou bien ..
[root@jupiter] # echo $(facter rubysitedir)/puppet/type
/usr/lib/ruby/site_ruby/1.8/puppet/type
[root@jupiter] # cd /usr/lib/ruby/site_ruby/1.8/puppet/type
[root@jupiter] # ls -l
total 344
-rw-r--r--. 1 root root  6219  8 févr.  2014 augeas.rb
-rw-r--r--. 1 root root  1842  8 févr.  2014 component.rb
-rw-r--r--. 1 root root  1882  8 févr.  2014 computer.rb
-rw-r--r--. 1 root root 11891  8 févr.  2014 cron.rb
[...]

4.3 - Exemple simple de création de ressource Puppet


4.3.1 - Installation d'un package OpenSSH


package { 'openssh':
  ensure => present,
}

4.3.2 - Creation d'un fichier /etc/motd


file { 'motd':
  path => '/etc/motd',
}

4.3.3 - Démarrage d'un services httpd


service { 'httpd':
  ensure => running,
  enable => true,
}

4.4 - Exemple complexe de création de ressource Puppet


4.4.1 - Gestion de Nginx avec module


Gestion des services de nginx avec les paramètres définis dans les modules des variables.
service { 'nginx':
  ensure     => $::nginx::manage_service_ensure,
  name       => $::nginx::service_name,
  enable     => $::nginx::manage_service_enable,
}

4.4.2 - Création du fichier de configuration de Nginx avec module


Création de nginx.conf avec contenu récupéré à partir de différentes sources (le premier trouvé est le premier servi).
Pour information le fqdn c'est le hostname de la machine (Fully Qualified Domain Name).
file { 'nginx.conf':
  ensure  => present,
  path    => '/etc/nginx/nginx.conf',
  source  => [
      "puppet:///modules/site/nginx.conf--${::fqdn}",
      "puppet:///modules/site/nginx.conf" ],
}

4.5 - Resource Abstraction Layer


Les ressources sont extraites de l'OS sous-jacent (unix,windows,mac etc..).
Les "Types" de ressources ont différents fournisseurs pour différents OS.
Le "Type" de "Package" est connu par le plus grand nombre de fournisseurs.
Afin de connaitre où sont les scripts "Ruby" associé au "Package" de ressource.
[root@jupiter] # ls $(facter rubysitedir)/puppet/provider/package
[root@jupiter] # ls $(facter rubysitedir)/puppet/provider/package
aix.rb     aptitude.rb  blastwave.rb  freebsd.rb  macports.rb  openbsd.rb  pkgdmg.rb   portage.rb      rpm.rb          sun.rb      yumhelper.py   yum.rb
appdmg.rb  apt.rb       dpkg.rb       gem.rb      msi.rb       pacman.rb   pkg.rb      ports.rb        rug.rb          up2date.rb  yumhelper.pyc  zypper.rb
apple.rb   aptrpm.rb    fink.rb       hpux.rb     nim.rb       pip.rb      pkgutil.rb  portupgrade.rb  sunfreeware.rb  urpmi.rb    yumhelper.pyo
[root@jupiter] # 
Ou bien ..
[root@jupiter] # cd $(facter rubysitedir)/puppet/provider/package
[root@jupiter] # ls
aix.rb     aptitude.rb  blastwave.rb  freebsd.rb  macports.rb  openbsd.rb  pkgdmg.rb   portage.rb      rpm.rb          sun.rb      yumhelper.py   yum.rb
appdmg.rb  apt.rb       dpkg.rb       gem.rb      msi.rb       pacman.rb   pkg.rb      ports.rb        rug.rb          up2date.rb  yumhelper.pyc  zypper.rb
apple.rb   aptrpm.rb    fink.rb       hpux.rb     nim.rb       pip.rb      pkgutil.rb  portupgrade.rb  sunfreeware.rb  urpmi.rb    yumhelper.pyo
[root@jupiter] # 
Utilisez les ressources Puppet pour interroger le RAL (Ressource Abstraction Layer):

4.5.1 - Liste les ressources de tous les utilisateurs


[root@jupiter] # puppet resource user
[root] # puppet resource user
user { 'adm':
  ensure           => 'present',
  comment          => 'adm',
  gid              => '4',
  groups           => ['sys', 'adm'],
  home             => '/var/adm',
  password         => '*',
  password_max_age => '99999',
  password_min_age => '0',
  shell            => '/sbin/nologin',
  uid              => '3',
}
user { 'admin':
  ensure           => 'present',
  gid              => '1000',
  home             => '/home/admin',

[...]

4.5.2 - Liste les ressources d'un utilisateur


[root@jupiter] # puppet resource user root
[root] # puppet resource user root
user { 'root':
  ensure           => 'present',
  comment          => 'root',
  gid              => '0',
  home             => '/root',
  password         => 'XXOG/hmGOLBVk',
  password_max_age => '99999',
  password_min_age => '0',
  shell            => '/bin/bash',
  uid              => '0',
}
[root] # 

4.5.3 - Liste les ressources de tous les packages


[root@jupiter] # puppet resource package
[root] # puppet resource package 
warning: Package libgcc found in both yum and yum; skipping the yum version
warning: Package glibc found in both yum and yum; skipping the yum version
warning: Package nss-softokn-freebl found in both yum and yum; skipping the yum version
package { 'ConsoleKit':
  ensure => '0.4.1-3.el6',
}
package { 'ConsoleKit-libs':
  ensure => '0.4.1-3.el6',
}
package { 'GConf2':
  ensure => '2.28.0-6.el6',
}
package { 'Lib_Utils':
  ensure => '1.00-09',
}


[...]

4.5.4 - Liste les ressources de tous les services


[root@jupiter] # puppet resource service
[root] # puppet resource service
service { 'acpid':
  ensure => 'running',
  enable => 'true',
}
service { 'anamon':
  ensure => 'stopped',
  enable => 'false',
}
service { 'apcupsd':
  ensure => 'stopped',
  enable => 'false',
}
service { 'atd':
  ensure => 'running',
  enable => 'true',
}


[...]

4.6 - Activation/Désactivation d'une ressource service


Pour l'activation d'une "ressource service" taper la commande suivante sur le serveur Master Puppet.
[root@arecibo] # puppet resource service httpd ensure=running enable=true
[root@arecibo] # puppet resource service httpd ensure=running enable=true
service { 'httpd':
  ensure => 'running',
  enable => 'true',
}
[root@arecibo] # 
Pour la désactivation d'une "ressource service" taper la commande suivante sur le serveur Master Puppet.
[root@arecibo] # puppet resource service httpd ensure=running enable=false
[root@arecibo] # puppet resource service httpd ensure=running enable=false
notice: /Service[httpd]/enable: enable changed 'true' to 'false'
service { 'httpd':
  ensure => 'running',
  enable => 'false',
}
[root@arecibo] # 

4.7 - Définition d'une Classe


Les classes sont des "Containers" de différentes ressources.
Depuis Puppet 2.6, ils peuvent avoir des paramètres.
Voici un exemple de définition d'une Class.
class mysql (
  root_password => 'valeur_par_defaut',
  port          => '3306',
) {
  package { 'mysql-server':
    ensure => present,
  }
  service { 'mysql':
    ensure    => running,
  }
  [...]
}
Notez que lorsque nous définissons une Classe, nous décrivons tout ce qu'elle fait et nous définissons ses paramètres.
On n'ajoute pas des ressources au catalogue.

4.8 - Déclaration d'une Classe


Avant d'utiliser la Classe précédement défini (chapitre 4.7), nous devons dabord la déclarer.
Il existe deux méthodes différentes :
Déclaration de classe "Old School" à l'ancienne quoi ;-), sans paramètres:
Dans un catalogue, nous pouvons avoir de multiples "include" de la même classe, mais la classe ne sera appliquée q'une seule fois.
include mysql
Déclaration de classe avec des paramètres explicites, sans mauvais jeu de mot "la classe quoi" :
class { 'mysql':
  root_password => 'my_value',
  port          => '3307',
}
La syntaxe est la même que les "ressources normales" et la même classe peut être déclarée, de cette manière, seulement une fois à l'intérieur du même catalogue.

4.9 - Defines (définitions/déclaration)


Les "defines" sont également appelés: Définitions des types de ressources ou types définis.
Les "defines" se configurent comme les classes, mais les "defines" peuvent-être utilisés plusieurs fois avec des titres (title) différents.

Définition d'un "define":
define apache::virtualhost (
  $ensure   = present,
  $template = 'apache/virtualhost.conf.erb' ,
  [...] ) {

  file { "ApacheVirtualHost_${name}":
    ensure  => $ensure,
    content => template("${template}"),
  }
}
Déclaration d'un "define":
apache::virtualhost { 'www.arecibo.fr':
  template => 'site/apache/www.arecibo.fr-erb'
}

4.10 - Les Variables


Nous en avons besoin pour fournir la configuration des différentes types de serveurs.
Elles peuvent être définies dans des endroits différents et par différents acteurs:

Elles peuvent-être fournies par les "noeuds" clients comme des "facts"
Elles peuvent-être définies par les utilisateurs dans du code Puppet (à la fin des hieradatas)
Elles peuvent-être intégrées et être fournie directement par Puppet

4.11 - Facts


Le process Facter fonctionne sur les noeuds Puppet (client) et recueille des "Facts" (de la configuration) que le serveur peut utiliser comme variables.
[root@saturn] # facter
[root@saturn] # facter
architecture => x86_64
augeasversion => 0.9.0
boardmanufacturer => IBM
boardproductname => 00FL490
boardserialnumber => 46N031
facterversion => 1.6.6

[...] 

[root@saturn] # 

4.12 - Variables utilisateurs


Vous pouvez définir des variables personnalisées de différentes manières:
Dans un "Manifest" Puppet.
$utilisateur = 'web'

    $package = $::operatingsystem ? {
      /(?i:Ubuntu|Debian|Centos)/ => 'apache2',
      default                   => 'httpd',
    }
Dans un Noeud Classificateur Externe (ENC).
ENC est couramment utilisés dans le "DashBoard" de Puppet Entreprise (tableau de bord Foreman).

Dans Hiera.
Exemple :
$syslog_server = hiera(syslog_server)

4.13 - Variables intègré dans Puppet


Puppet offre des variables déjà intègrés. Qui sont les suivantes :

4.13.1 - Variables intègrées dans les noeuds Puppet


Exemple de variables intègré dans les noeuds :
$clientcert - Nom du certificat du noeud. Par défaut c'est $::fqdn (le nom du serveur)
$clientversion - Version du client Puppet du noeud.
etc..
Pour afficher une variable en ligne de commande, vous pouvez taper la commande suivante :
[root@saturn] # puppet apply -e 'notice("$clientversion")'
[root@saturn] # puppet apply -e 'notice("$clientversion")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): 2.7.22
notice: Finished catalog run in 0.02 seconds
[root@saturn] # 
Allez on se fait plaisir on place un "echo" en mode verbose pour le timestamp.
[root@saturn] # puppet apply -ve 'notice("La version du client est : ${clientversion}")'
[root@saturn] # puppet apply -ve 'notice("La version du client est : ${clientversion}")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): La version du client est : 2.7.22
info: Applying configuration version '1454511647'
notice: Finished catalog run in 0.02 seconds
[root@saturn] # 
Ou bien ..
[root@saturn] # puppet apply -e 'notice("$clientcert")'
root@saturn] # puppet apply -e 'notice("$clientcert")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): nuapgsp001
notice: Finished catalog run in 0.02 seconds
root@saturn] # 
Sinon, vous pouvez toujours ajouter dans un "Manifest" du Master Puppet les lignes suivantes :
fail("Server version: $serverversion, Client version: $clientversion")'
fail(inline_template("<%=clientversion.split('.')[0]%>"))

4.13.2 - Variables intègrées dans le Master Puppet


Exemple de variables intègré dans le Master Puppet :
$environment - L'environnement de Puppet où sont placés les modules et les manifestes. (par défaut environnement de production)
$servername - Le nom du serveur Master Puppet (FQDN).
$serverip - L'adresse IP du serveur Master Puppet.
$serverversion - La version du serveur Master Puppet.
$settings:: - Toute la configuration du fichier puppet.conf du Master Puppet.
etc..
[root@arecibo] # puppet apply -e 'notice("$environment")'
[root@arecibo] # puppet apply -e 'notice("$serverip")'
[root@arecibo] # puppet apply -e 'notice("$servername")'
[root@arecibo] # puppet apply -e 'notice("$serverversion")'
[root@arecibo] # puppet apply -ve 'notice("Le nom du certificat Puppet Master est : ${settings::certname}")'
[root@arecibo] # puppet apply -e 'notice("$environment")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): production
notice: Finished catalog run in 0.02 seconds
[root@arecibo] # puppet apply -ve 'notice("Le nom du certificat Puppet Master est : ${settings::certname}")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): Le nom du certificat Puppet Master est : arecibo
info: Applying configuration version '1454511832'
notice: Finished catalog run in 0.02 seconds
[root@arecibo] # 
[root@arecibo] # puppet apply -e 'notice("$serverip")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): 
notice: Finished catalog run in 0.02 seconds
[root@arecibo] # puppet apply -e 'notice("$servername")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): 
notice: Finished catalog run in 0.02 seconds
[root@arecibo] # 

4.13.2 - Variables intègrées dans Puppet durant la compilation du "Catalog"


Exemple de variables intègrées dans Puppet durant la compilation du "Catalog":
$module_name - Le nom des modules qui sont contenus dans la ressource de définition courante.
$caller_module_name - Le nom des modules qui sont contenus dans la ressource de déclaration courante.
[root@arecibo] # puppet apply -e 'notice("$module_name")'
[root@arecibo] # puppet apply -e 'notice("$caller_module_name")'
[root@arecibo] # puppet apply -e 'notice("$module_name")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): 
notice: Finished catalog run in 0.02 seconds
[root@arecibo] # puppet apply -e 'notice("$caller_module_name")'
warning: Could not retrieve fact fqdn
notice: Scope(Class[main]): 
notice: Finished catalog run in 0.02 seconds
[root@arecibo] # 

4.14 - Environnement dans Puppet


Un environnements Puppet permet l'isolement d'un code et des données d'un Puppet.
Pour chaque environnement, nous pouvons avoir :
Des chemins différents
Des fichiers différents
Des "Manifest" différents
Des données Hiera différents
Et des modules différents
Bref, un environnement.
Les environnements Puppet NE CORRESPONDENT PAS forcément aux environnements des serveurs.
Nous pouvons avoir par exemple un environnement de production sur un serveur de recette.
Bref, il n'y a pas de réciprocité.
La gestion des environnements a changé sur Puppet à partir de la version 3.6 :
Les versions antérieures étaient basées sur un environnement dit de fichier de configuration où chaque environnement devait être défini dans puppet.conf.
Les environnements par "directory" ont été introduits dans la version 3.6 et les environnements par fichier de configuration sont "deprecated".
Sur Puppet 4.x seul les environnements par "directory" sont pris en charge.

4.14.1 - Configuration par fichier d'environnement (2.7.X)


Les «anciennes» configurations des environnements par fichiers de configuration sont définies à l'intérieur du fichier puppet.conf avec une syntaxe comme:
[root@arecibo] # vi /etc/puppet/puppet.conf
[developpement]
   modulepath = $confdir/environments/developpement/modules:$condfir/modules
   manifest = $confdir/environments/developpement/manifests
Pour l'environnement de production par défaut, il y avait les paramètres de configuration, désormais obsolète, chemin manifeste et module dans la section [main].
Redémarré ensuite le Master Puppet.

4.14.2 - Répertoire d'environnement (2.7.X)


Les répertoires d'environnements sont configurés dans puppet.conf comme suit:
[main]
environmentpath = $configdir/
Ensuite, à l'intérieur du répertoire /etc/puppet/environments/$environment/, nous avons :
modules/   # Répertoire qui contient les modules
manifests/ # Répertoire qui contient site.pp
puppet-developpement.conf # fichier de configuration de l'environnement

4.15 - Nœuds


Les nœuds sont identifiés par le Master Puppet par leurs "certname", qui par défaut est le nom de domaine complet du nœud.
Dans le premier fichier manifeste analysé par le Master Puppet, site.pp, nous pouvons définir les noeuds avec une syntaxe comme:
node 'saturne' {
  include apache
}
On peut aussi définir une liste de serveur.
node 'saturne' , 'jupiter' {
  include apache
}
Ou une expression regulière permettant d'identifier un type de serveur.
node /^www\d+$/ {
  include apache
}
Un nœud peut hériter d'un autre noeud et hériter de toutes ses classes et de ses variables.
Cependant, cette fonction est maintenant obsolète et elle n'est plus pris en charge dans la version 4.x de Puppet.

4.16 - Classifications des Nœuds via ENC


Puppet peut interroger une source externe pour récupérer les classes et les paramètres à affecter à un noeud.
Cette source est appelée Externe Node Classificateur (ENC).
Un ENC n’est rien d’autre qu’un programme appelé par le puppetmasterd au moment où un client se présente pour obtenir son catalogue.
Puppet va alors appeler le programme défini avec pour paramètre le hostname (en fqdn).
Ce programme peut être écrit dans le langage de votre choix.
Dans votre ENC, vous pouvez utiliser le backend de votre choix comme source de donnée.
La seule obligation est de fournir les informations en YAML (fichier .yaml).
Il est également possible d’utiliser Puppet dashboard ou The Foreman comme ENC.

Pour permettre l'utilisation de l'ENC placer ces paramètres dans votre fichier puppet.conf.
# Active l'usage des scripts pour classifier les noeuds
node_terminus = exec

# Chemin du script qui classifit les noeuds
external_nodes = /etc/puppet/node.rb

4.17 - Classifications des Nœuds avec Hiera


Hiera fournit une fonction de hiera_include qui permet l'inclusion de classes tel que défini sur Hiera.
Ceci est une approche qui peut être utile quand il y a une utilisation massive de Hiera comme backend pour les données de Puppet.
Pour utiliser Hiera, placer les lignes suivantes dans votre fichier "/etc/puppet/manifests/site.pp".
hiera_include('classes')
Puis metter sous forme de tableau les classes à inclure dans les sources de donnée du Hiera pour les catégories principales.

4.18 - Le Catalog Puppet


Le "Catalog" est la liste complète des ressources, et de leurs relations, que le Puppet Master génère pour les clients.
Il est le résultat de tout le code de Puppet et de la logique que nous définissons pour un noeud donné dans nos manifestes.
Le "Catalog" est appliqué sur le client après qu'il a été envoyé par le Master Puppet.

--------------------------+                                                    +-----------------------
     Master Puppet        |-------------- envoi le "Catalog" au noeud -------->| Noeud Puppet
        ------------------+                                                    +-----------
Le client utilise le RAL (Abstraction Ressources Layer) pour exécuter les commandes du système actuel qui convertissent des ressources abstraites, comme ci-dessous :
package { 'openssh': }
Le catalogue est sauvé par le client dans /var/lib/puppet/client_data/catalog/$certname.json.
Exemple :
[root@saturn] # pwd
/var/lib/puppet
[root] # tree
.
├── clientbucket
├── client_data
│   └── catalog
│       └── saturn.json
├── client_yaml
├── facts
├── lib
├── ssl
│   ├── certificate_requests
│   │   ├── saturn.pem
│   ├── certs
│   │   ├── ca.pem
│   │   └── saturn.pem
│   ├── crl.pem
│   ├── private
│   ├── private_keys
│   │   └── saturn.pem
│   └── public_keys
│       └── saturn.pem
└── state
    ├── graphs
    ├── last_run_report.yaml
    └── last_run_summary.yaml

13 directories, 12 files
[root@saturn] # 

5. Tutoriel mise en place rapide pour test


5.1 - Installation des binaires du Master Puppet


5.1.1 - Installation avec apt-get du Master Puppet


Sur le serveur Puppet Master dans notre exemple le serveur Arecibo.
Tapez la commande suivante en temps que "root" ou avec la commande sudo.
[root@arecibo] # apt-get install puppetmaster
Voici un exemple fait sur une Debian.
root@arecibo # apt-get install puppetmaster
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Le paquet suivant a été installé automatiquement et n'est plus nécessaire :
  libjpeg62:i386
Veuillez utiliser « apt-get autoremove » pour le supprimer.
Les paquets supplémentaires suivants seront installés : 
  augeas-lenses debconf-utils facter libaugeas0 puppet-common
  puppetmaster-common ruby-augeas ruby-hiera ruby-json ruby-rgen
  ruby-safe-yaml ruby-shadow
Paquets suggérés :
  augeas-doc virt-what augeas-tools ruby-selinux ruby-rrd librrd-ruby
  puppet-el ruby-ldap ruby-stomp stompserver vim-puppet mcollective-common
Les NOUVEAUX paquets suivants seront installés :
  augeas-lenses debconf-utils facter libaugeas0 puppet-common puppetmaster
  puppetmaster-common ruby-augeas ruby-hiera ruby-json ruby-rgen
  ruby-safe-yaml ruby-shadow
0 mis à jour, 13 nouvellement installés, 0 à enlever et 381 non mis à jour.
Il est nécessaire de prendre 1 518 ko dans les archives.
Après cette opération, 8 116 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] ^C

[...] 

[root@arecibo] # 

5.1.2 - Installation avec yum du Master Puppet


Sur le serveur Puppet Master dans notre exemple le serveur Arecibo.
Tapez la commande suivante en temps que "root" ou avec la commande sudo.
[root@arecibo] # yum install puppetmaster
Voici un exemple fait sur une Red-Hat.
[root@arecibo] # yum install puppetserver
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package puppetserver:2.7.25-2.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================
 Package               Arch         Version         Repository                                 Size
========================================================================================================
Installing:
 puppetserver          noarch       2.7.25-2.el6    socle-2015-6.04-redhat-x86_64            24 k

Transaction Summary
========================================================================================================
Install       1 Package(s)

Total download size: 24 k
Installed size: 12 k
Is this ok [y/N]: y


[...] 

[root@arecibo] # 

5.2 - Installation des binaires du Client Puppet


5.2.1 - Installation avec apt-get du Client Puppet


Sur un des client Puppet dans notre exemple le client Saturn.
Tapez la commande suivante en temps que "root" ou avec la commande sudo.
[root@saturn] # apt-get install puppet
Voici un exemple fait sur une Debian.
[root@saturn] # apt-get install puppet
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Le paquet suivant a été installé automatiquement et n'est plus nécessaire :
  libjpeg62:i386
Veuillez utiliser « apt-get autoremove » pour le supprimer.
Les paquets supplémentaires suivants seront installés : 
  augeas-lenses debconf-utils facter libaugeas0 puppet-common ruby-augeas
  ruby-hiera ruby-json ruby-rgen ruby-safe-yaml ruby-shadow
Paquets suggérés :
  augeas-doc virt-what augeas-tools puppet-el vim-puppet etckeeper
  ruby-selinux ruby-rrd librrd-ruby mcollective-common
Les NOUVEAUX paquets suivants seront installés :
  augeas-lenses debconf-utils facter libaugeas0 puppet puppet-common
  ruby-augeas ruby-hiera ruby-json ruby-rgen ruby-safe-yaml ruby-shadow
0 mis à jour, 12 nouvellement installés, 0 à enlever et 381 non mis à jour.
Il est nécessaire de prendre 1 507 ko dans les archives.
Après cette opération, 8 030 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O


[...] 

[root@saturn] # 

5.2.2 - Installation avec yum du Client Puppet


Sur un des client Puppet dans notre exemple le client Saturn.
Tapez la commande suivante en temps que "root" ou avec la commande sudo.
[root@saturn] # yum install puppet
Voici un exemple fait sur une Debian.
[root@saturn] # yum install puppet
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package puppet-2.7.25-2.el6.noarch will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================
 Package               Arch         Version         Repository                                 Size
========================================================================================================
Installing:
 puppet                noarch       2.7.25-2.el6    socle-2015-6.04-redhat-x86_64            24 k

Transaction Summary
========================================================================================================
Install       1 Package(s)

Total download size: 24 k
Installed size: 12 k
Is this ok [y/N]: y

[...] 

[root@saturn] # 

5.3 - Configuration du Client Puppet


La première chose à faire est de renseigner le FQDN (hostname) du Master Puppet (dans notre exemple arecibo) dans la section main du fichier /etc/puppet/puppet.conf du client.
[root@saturn] # vi /etc/puppet/puppet.conf
[main]
server=arecibo

5.4 - Génération des certificats du Client Puppet


Puppet utilise des certificats SSL pour ses communications.
Il est imperatif de générer des certificats.
Pour se faire nous devons réaliser une connexion depuis le client vers le Master Puppet.
[root@saturn] # puppet agent --test --waitforcert 60
Puis sur le Master Puppet, taper la commande :
Cette commande permet de lister les certificats en attente de validation.
Vous allez voir votre client.
[root@arecibo] # puppetca --list
Valider le certificat de votre client Puppet en tapant la commande suivante sur le Master Puppet.
[root@arecibo] # puppetca --sign saturn
Vous pouvez également valider tous le certificat de tous les client Puppet, en tapant la commande suivante sur le Master Puppet.
[root@arecibo] # puppetca --sign --all
Attention !! Si vous avez un firewall les communications puppet utilise le port 8139.

5.5 - Configuration du Master Puppet


5.5.1 - Fichier puppet.conf


Le fichier de configuration du Master Puppet est le fichier puppet.conf (sur la version 2.7).
[root@arecibo] # vi /etc/puppet/puppet.conf
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
server = arecibo
environment = production
runinterval = 1h
strict_variables = true


[master]
report=true
reports=log,store
modulepath=/etc/puppet/modules
certname = arecibo
dns_alt_names = saturn,jupiter
environment_timeout = unlimited

5.5.2 - Fichier site.pp


Le fichier /etc/puppet/manifests/site.pp est le premier fichier lu par le Master Puppet.
[root@arecibo] # vi /etc/puppet/manifests/site.pp
import "nodes"

filebucket { main: server => "arecibo" }
File { backup => main }

Exec { path => "/usr/bin:/usr/sbin:/bin:/sbin" }

5.5.3 - Fichier nodes.pp


Le fichier /etc/puppet/manifests/nodes.pp est lu lors de l'import de celui-ci dans le fichier site.pp.
[root@arecibo] # vi /etc/puppet/manifests/nodes.pp
node basenode {
include turlan_module
}

5.6 - Création d'un module Puppet


5.6.1 - Fichier init.pp dans module


Le fichier /etc/puppet/modules/$nom_du_module/manifests/init.pp est lu lors de l'appel du module par un noeud.
[root@arecibo] # vi /etc/puppet/modules/turlan_module/manifests/init.pp
class turlan_module {


file { "/etc/turlan.txt":
owner => root,
group => root,
mode => 644,
source => "puppet:///turlan_module/turlan.txt"
}

file { 'motd':
  path    => '/etc/motd',
  content => 'Bienvenue à toi mon tutu...',
}


}

5.6.2 - Fichier a transfèrer sur les noeuds


Les fichiers à uploader sur les noeuds doivent-être placés dans /etc/puppet/modules/$nom_du_module/files.
Dans notre exemple dans "/etc/puppet/modules/turlan_module/files".
[root@arecibo] # vi /etc/puppet/modules/turlan_module/files/turlan.txt

Bonjour tout le monde.

5.7 - Re-démarrage du Master Puppet


Afin que la configuration soit prise en compte, nous allons re-démarrer le Master Puppet.
[root@arecibo] # /etc/init.d/puppetmaster restart
[root@arecibo] # /etc/init.d/puppetmaster restart
Arrêt de puppetmaster :                                    [  OK  ]
Démarrage de puppetmaster :                                [  OK  ]
[root@arecibo] #

5.8 - Test via un client Puppet


Puis on lance un puppet agent en mode test pour vérifier si tout fonctionne :
[root@saturn] # puppet agent --test
ou
[root@saturn] # pupeptd --test
[root@saturn] # puppet agent --test 
info: Caching catalog for saturn
info: Applying configuration version '1454676126'
notice: /Stage[main]/Turlan_module/File[motd]/ensure: defined content as '{md5}a4b5c376aa230d1d8632722e764bd4d7'
notice: /Stage[main]/Turlan_module/File[/etc/turlan.txt]/ensure: defined content as '{md5}d478ba42f726b909c0b7034b5fc59950'
notice: Finished catalog run in 0.81 seconds
[root@saturn] # 
Normalement, vous devez trouver le fichier turlan.txt dans le /etc/ du client (saturn) et le fichier motd mise à jour sur le même serveur.