introduction
Puppet, de Puppet Labs, est un outil de gestion de la configuration qui aide les administrateurs système à automatiser l’approvisionnement, la configuration et la gestion d’une infrastructure de serveur. En planifiant à l'avance et en utilisant des outils de gestion de la configuration tels que Puppet, vous réduirez le temps consacré à la répétition des tâches de base et garantissez la cohérence et la précision de vos configurations sur l'ensemble de votre infrastructure. Une fois que vous aurez maîtrisé vos serveurs avec Puppet et d’autres outils d’automatisation, vous disposerez de plus de temps libre qui pourra être utilisé pour améliorer d’autres aspects de votre configuration.
Il existe deux types de marionnettes: Puppet Enterprise et Open Source Puppet. Il fonctionne sur la plupart des distributions Linux, diverses plates-formes UNIX et Windows.
Dans ce tutoriel, nous expliquerons comment installer Open Source Puppet 4 dans une configuration d'agent principal sous Ubuntu 14.04. Dans cette configuration, le serveurPuppet master, qui exécute le logiciel Puppet Server, peut être utilisé pour contrôler tous vos autres serveurs ou nœudsPuppet agent. Notez que nous utiliserons le package Puppet Server au lieu de Passenger ou de tout autre environnement d’exécution.
Conditions préalables
Pour suivre ce didacticiel, vous devez avoir un accès root ou superutilisateur à tous les serveurs avec lesquels vous souhaitez utiliser Puppet. You will also be required to create a new Ubuntu 14.04 server to act as the Puppet master server. Si vous n'avez pas d'infrastructure de serveur existante, n'hésitez pas à recréer l'exemple d'infrastructure (décrit ci-dessous) en suivant le tutoriel d'installation DNS requis.
Avant de commencer à installer Puppet, assurez-vous que les conditions préalables suivantes sont remplies:
-
Private Network DNS: Les DNS directs et inversés doivent être configurés et chaque serveur doit avoir un nom d'hôte unique. Voici un tutoriel surconfigure your own private network DNS server. Si vous n'avez pas configuré DNS, vous devez utiliser votre fichier
hosts
pour la résolution de noms. Nous supposerons que vous utiliserez votre réseau privé pour la communication au sein de votre infrastructure. -
Firewall Open Ports: Le maître Puppet doit être accessible sur le port 8140. Si votre pare-feu est trop restrictif, consultez ceUFW tutorial pour savoir comment autoriser les requêtes entrantes sur le port 8140.
Exemple d'infrastructure
Nous utiliserons l’infrastructure suivante pour montrer comment configurer Puppet:
Nom d'hôte | Role | FQDN privé |
---|---|---|
hôte1 |
Serveur Ubuntu 14.04 générique |
host1.nyc3.example.com |
host2 |
Serveur Ubuntu 14.04 générique |
host2.nyc3.example.com |
ns1 |
Serveur de noms principal |
ns1.nyc3.example.com |
ns2 |
Serveur de noms secondaire |
ns2.nyc3.example.com |
L'agent de marionnettes sera installé sur tous ces hôtes. Ces hôtes seront référencés par leurs interfaces réseau privées, qui sont mappées sur le sous-domaine «.nyc3.example.com» dans le système DNS. Il s'agit de la même infrastructure que celle décrite dans le didacticiel des prérequis:How To Configure BIND as a Private Network DNS Server on Ubuntu 14.04.
Une fois toutes les conditions préalables remplies, passons à la création du serveur maître Puppet!
Créer un serveur maître de marionnettes
Créez un nouveau serveur x64Ubuntu 14.04, en utilisant «puppet» comme nom d'hôte. La configuration matérielle requise dépend du nombre de nœuds d'agent que vous souhaitez gérer; deux cœurs de processeur et 1 Go de mémoire est la condition requise deminimumpour gérer une poignée de nœuds, mais vous aurez besoin de plus de ressources si votre infrastructure de serveur est plus grande. Puppet Server est configuré pour utiliser 2 Go de RAM par défaut.
Ajoutez son réseau privé à votre DNS avec les détails suivants:
Nom d'hôte | Role | FQDN privé |
---|---|---|
fantoche |
Maître de la marionnette |
puppet.nyc3.example.com |
Si vous venez de configurer votre DNS et que vous ne savez pas comment inclure de nouveaux hôtes, reportez-vous à la sectionMaintaining DNS Records du didacticiel DNS. Pour l'essentiel, vous devez ajouter un enregistrement "A" et "PTR" et permettre au nouvel hôte d'effectuer des requêtes récursives. Assurez-vous également de configurer votre domaine de recherche de sorte que vos serveurs puissent utiliser des noms d’hôte abrégés pour se rechercher.
[.Remarque]##
Note: Ce didacticiel suppose que le nom d'hôte de votre maître de marionnettes est "puppet". Si vous utilisez un nom différent, vous devrez faire quelques écarts par rapport à ce didacticiel. Plus précisément, vous devez spécifier le nom d'hôte de votre maître de marionnettes dans les fichiers de configuration de vos nœuds d'agent de marionnettes, et vous devez régénérer le certificat SSL de votre maître de marionnettes avant de signer tout certificat d'agent. Sinon, vous recevrez cette erreur:Error: Could not request certificate: The certificate retrieved from the master does not match the agent's private key.
.
La configuration de ce paramètre n'est pas couverte dans ce didacticiel.
Installer NTP
Parce qu’il agit en tant qu’autorité de certification pour les nœuds d’agent, le serveur maître Puppet doit conserver une heure système précise pour éviter tout problème éventuel lorsqu’il émet des certificats d’agent. Les certificats peuvent sembler expirés s’il existe des écarts de temps. Nous allons utiliser le protocole NTP (Network Time Protocol) à cette fin.
Tout d’abord, jetez un coup d’œil aux fuseaux horaires disponibles avec cette commande:
timedatectl list-timezones
Cela vous donnera une liste des fuseaux horaires disponibles pour votre serveur. Lorsque vous trouvez que le paramètre région / fuseau horaire est correct pour votre serveur, définissez-le avec cette commande (remplacez votre région et votre fuseau horaire préférés):
sudo timedatectl set-timezone America/New_York
Installez NTP via apt-get avec ces commandes:
sudo apt-get update
sudo apt-get -y install ntp
Il est courant de mettre à jour la configuration NTP pour utiliser des «zones de pools» géographiquement plus proches de votre serveur NTP. Dans un navigateur Web, accédez auxNTP Pool Project et recherchez unpool zone qui ferme géographiquement le centre de données que vous utilisez. Nous utiliserons le pool États-Unis (http://www.pool.ntp.org/zone/us) dans notre exemple, car nos serveurs sont situés dans un centre de données de New York.
Ouvrezntp.conf
pour l'édition:
sudo vi /etc/ntp.conf
Ajoutez les serveurs de temps de la page Projet de pool NTP en haut du fichier (remplacez-les par les serveurs de votre choix):
/etc/ntp.conf excerpt
server 0.us.pool.ntp.org
server 1.us.pool.ntp.org
server 2.us.pool.ntp.org
server 3.us.pool.ntp.org
Sauvegarder et quitter.
Démarrez NTP pour ajouter les nouveaux serveurs de temps:
sudo service ntp restart
Maintenant que notre serveur garde l'heure exacte, installons le logiciel Puppet Server.
Installer le serveur de marionnettes
Puppet Server est le logiciel qui s'exécute sur le serveur maître Puppet. C'est le composant qui transmettra les configurations à vos autres serveurs, qui exécuteront le logiciel de l'agent Puppet.
Activez le référentiel de collection officiel de Puppet Labs avec les commandes suivantes:
cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
sudo dpkg -i puppetlabs-release-pc1-trusty.deb
sudo apt-get update
Installez le packagepuppetserver
:
sudo apt-get -y install puppetserver
Le serveur de marionnettes est maintenant installé sur votre serveur maître, mais il n'est pas encore en cours d'exécution.
Configurer l'allocation de mémoire
Par défaut, Puppet Server est configuré pour utiliser 2 Go de RAM. Vous devez personnaliser ce paramètre en fonction de la quantité de mémoire disponible de votre serveur maître et du nombre de nœuds d'agent qu'il va gérer.
Tout d'abord, ouvrez/etc/default/puppetserver
dans votre éditeur de texte préféré. Nous utiliseronsvi
:
sudo vi /etc/default/puppetserver
Recherchez ensuite la ligneJAVA_ARGS
et utilisez les paramètres-Xms
et-Xmx
pour définir l'allocation de mémoire. Par exemple, si vous souhaitez utiliser 3 Go de mémoire, la ligne devrait ressembler à ceci:
Allocation de mémoire
JAVA_ARGS="-Xms3g -Xmx3g"
Enregistrez et quittez lorsque vous avez terminé.
Démarrer le serveur de marionnettes
Nous sommes maintenant prêts à démarrer Puppet Server avec cette commande:
sudo service puppetserver restart
Ensuite, activez Puppet Server pour qu’il démarre au démarrage de votre serveur maître:
sudo /opt/puppetlabs/bin/puppet resource service puppetserver ensure=running enable=true
Puppet Server est en cours d'exécution, mais il ne gère pas encore de nœud d'agent. Apprenons comment installer et ajouter des agents Puppet!
Installer l'agent de marionnettes
Le logiciel agent Puppet doit être installé sur tout serveur géré par le maître Puppet. Dans la plupart des cas, cela inclura tous les serveurs de votre infrastructure. Comme indiqué dans l'introduction, l'agent Puppet peut s'exécuter sur toutes les principales distributions Linux, certaines plates-formes UNIX et Windows. Comme l'installation varie légèrement d'un système d'exploitation à l'autre, nous ne couvrirons que l'installation sur les serveurs Ubuntu 14.04. Les instructions d'installation de l'agent Puppet sur les serveurs CentOS 7 sont disponibles àhere.
Effectuez ces étapes sur tous vos serveurs d'agents.
Activez le référentiel de collection officiel de Puppet Labs avec les commandes suivantes:
cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
sudo dpkg -i puppetlabs-release-pc1-trusty.deb
Ensuite, installez le packagepuppet-agent
:
sudo apt-get update
sudo apt-get install puppet-agent
Maintenant que l'agent Puppet est installé, démarrez-le avec cette commande:
sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
La première fois que vous exécutez l'agent Puppet, il génère un certificat SSL et envoie une demande de signature au maître Puppet. Une fois que le maître de marionnettes a signé le certificat de l'agent, il sera en mesure de communiquer avec le nœud de l'agent et de le contrôler.
N'oubliez pas de répéter cette section pour tous vos nœuds d'agents Puppet.
[.note] #Note: S'il s'agit de votre premier agent Puppet, il est recommandé d'essayer de signer le certificat sur le maître Puppet, ce qui est traité à l'étape suivante, avant d'ajouter vos autres agents. Une fois que vous avez vérifié que tout fonctionne correctement, vous pouvez revenir en arrière et ajouter les nœuds d'agent restants en toute confiance.
#
Signer des certificats sur le maître de marionnettes
La première fois que Puppet s'exécute sur un nœud d'agent, il envoie une demande de signature de certificat au maître Puppet. Avant que Puppet Server puisse communiquer avec le nœud agent et le contrôler, il doit signer le certificat de ce nœud agent particulier. Nous allons décrire comment signer et vérifier les demandes de signature.
Liste des demandes de certificats en cours
Sur le maître de marionnettes, exécutez la commande suivante pour répertorier toutes les demandes de certificat non signé:
sudo /opt/puppetlabs/bin/puppet cert list
Si vous venez de configurer votre premier noeud d'agent, vous verrez une demande. Cela ressemblera à ce qui suit, avec le nom d’hôte du noeud de l’agent:
Output: "host1.nyc3.example.com" (SHA256) 15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:DD:B5:1C:33:F7:76:67:F3:F6:23:AE:07:4B:F6:E3:CC:04:11:4C
Notez qu'il n'y a pas de+
devant lui. Cela indique qu'il n'a pas encore été signé.
Signer une demande
Pour signer une demande de certificat, utilisez la commandepuppet cert sign
, avec le nom d'hôte du certificat que vous souhaitez signer. Par exemple, pour signer le certificat dehost1.nyc3.example.com
, vous utiliseriez la commande suivante:
sudo /opt/puppetlabs/bin/puppet cert sign host1.nyc3.example.com
Vous verrez la sortie suivante, qui indique que la demande de certificat a été signée:
Output:Notice: Signed certificate request for host1.nyc3.example.com
Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc3.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/host1.nyc3.example.com.pem'
Le maître de marionnettes peut maintenant communiquer et contrôler le nœud auquel appartient le certificat signé.
Si vous souhaitez signer toutes les requêtes en cours, utilisez l'option--all
, comme ceci:
sudo /opt/puppetlabs/bin/puppet cert sign --all
Révoquer des certificats
Vous voudrez peut-être supprimer un hôte de Puppet ou reconstruire un hôte puis le rajouter à Puppet. Dans ce cas, vous souhaiterez révoquer le certificat de l’hôte du maître des marionnettes. Pour ce faire, vous pouvez utiliser l'actionclean
:
sudo /opt/puppetlabs/bin/puppet cert clean hostname
Les certificats associés à l’hôte spécifié seront supprimés de Puppet.
Afficher toutes les demandes signées
Si vous souhaitez afficher toutes les demandes, signées et non signées, exécutez la commande suivante:
sudo /opt/puppetlabs/bin/puppet cert list --all
Vous verrez une liste de toutes les demandes. Les demandes signées sont précédées d'un` and unsigned requests do not have the `
.
Output:+ "puppet" (SHA256) 5A:71:E6:06:D8:0F:44:4D:70:F0:BE:51:72:15:97:68:D9:67:16:41:B0:38:9A:F2:B2:6C:BB:33:7E:0F:D4:53 (alt names: "DNS:puppet", "DNS:puppet.nyc3.example.com")
+ "host1.nyc3.example.com" (SHA256) F5:DC:68:24:63:E6:F1:9E:C5:FE:F5:1A:90:93:DF:19:F2:28:8B:D7:BD:D2:6A:83:07:BA:FE:24:11:24:54:6A
+ "host2.nyc3.example.com" (SHA256) CB:CB:CA:48:E0:DF:06:6A:7D:75:E6:CB:22:BE:35:5A:9A:B3:93:63:BF:F0:DB:F2:D8:E5:A6:27:10:71:78:DA
+ "ns2.nyc3.example.com" (SHA256) 58:47:79:8A:56:DD:06:39:52:1F:E3:A0:F0:16:ED:8D:40:17:40:76:C2:F0:4F:F3:0D:F9:B3:64:48:2E:F1:CF
Félicitations! Votre infrastructure est maintenant prête à être gérée par Puppet!
Débuter avec Puppet
Maintenant que votre infrastructure est configurée pour être gérée avec Puppet, nous allons vous montrer comment utiliser Puppet pour effectuer quelques tâches de base.
Comment sont rassemblés les faits
Puppet rassemble des faits sur chacun de ses nœuds avec un outil appeléfacter. Facter, par défaut, rassemble des informations utiles pour la configuration du système (par exemple, Noms de système d'exploitation, noms d'hôte, adresses IP, clés SSH, etc.). Il est possible d’ajouter des faits personnalisés qui ne font pas partie de l’ensemble de faits par défaut.
Les faits rassemblés peuvent être utiles dans de nombreuses situations. Par exemple, vous pouvez créer un modèle de configuration de serveur Web et renseigner automatiquement les adresses IP appropriées pour un hôte virtuel particulier. Ou vous pouvez déterminer que la distribution de votre serveur est «Ubuntu», vous devez donc exécuter le serviceapache2
au lieu dehttpd
. Ce sont des exemples basiques, mais ils devraient vous donner une idée de la manière dont les faits peuvent être utilisés.
Pour afficher une liste des faits collectés automatiquement sur votre noeud d'agent, exécutez la commande suivante:
/opt/puppetlabs/bin/facter
Fichier manifeste principal
Puppet utilise un langage spécifique au domaine pour décrire les configurations système. Ces descriptions sont enregistrées dans des fichiers appelés «manifestes», qui ont une extension de fichier .pp. Le fichier manifeste principal par défaut se trouveon your Puppet master server à/etc/puppetlabs/code/environments/production/manifests/site.pp
. Nous allons créer un fichier d’espace réservé pour le moment:
sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp
Notez que le manifeste principal est vide pour le moment, donc Puppet n’effectuera aucune configuration sur les nœuds de l’agent.
Comment le manifeste principal est-il exécuté?
L'agent de marionnettes vérifie régulièrement avec le serveur de marionnettes (généralement toutes les 30 minutes). Lors de son enregistrement, il envoie au maître des faits sur lui-même et extrait un catalogue actuel: une liste compilée de ressources et leurs états souhaités, pertinents pour l'agent, déterminés par le manifeste principal. Le nœud d'agent tentera ensuite d'apporter les modifications appropriées pour atteindre l'état souhaité. Ce cycle se poursuivra tant que le maître de marionnettes est en cours d'exécution et communique avec les nœuds d'agent.
Exécution immédiate sur un nœud d'agent particulier
Il est également possible de lancer manuellement la vérification d'un noeud d'agent particulier en exécutant la commande suivante (sur le noeud d'agent en question):
/opt/puppetlabs/bin/puppet agent --test
Cette opération appliquera le manifeste principal à l'agent exécutant le test. Vous pouvez voir une sortie comme celle-ci:
Output:Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
...
Info: Loading facts
Info: Caching catalog for host1
Info: Applying configuration version '1457389302'
Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as '{md5}dd769ec60ea7d4f7146036670c6ac99f'
Notice: Applied catalog in 0.04 seconds
Cette commande est utile pour voir comment le manifeste principal affectera immédiatement un seul serveur.
Manifestes ponctuels
La commandepuppet apply
vous permet d'exécuter des manifestes qui ne sont pas liés au manifeste principal, à la demande. Il applique uniquement le manifeste au nœud à partir duquel vous exécutez lesapply. Voici un exemple:
sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp
L'exécution de manifestes de cette manière est utile si vous souhaitez tester un nouveau manifeste sur un nœud d'agent ou si vous souhaitez simplement exécuter un manifeste une fois (par exemple, pour initialiser un noeud d’agent à l’état souhaité).
Un exemple de manifeste
Comme vous vous en souvenez peut-être, le fichier manifeste principal sur le maître Puppet se trouve à/etc/puppetlabs/code/environments/production/manifests/site.pp
.
Sur le serveur maître de Puppet, modifiez-le maintenant:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
Ajoutez maintenant les lignes suivantes pour décrire une ressource de fichier:
site.pp example
file {'/tmp/example-ip': # resource type file and filename
ensure => present, # make sure it exists
mode => '0644', # file permissions
content => "Here is my Public IP Address: ${ipaddress_eth0}.\n", # note the ipaddress_eth0 fact
}
Maintenant, enregistrez et quittez. Les commentaires en ligne doivent expliquer la ressource que nous définissons. En clair, cela garantira que tous les nœuds d'agent auront un fichier à/tmp/example-ip
avec les autorisations-rw-r--r--
, avec un contenu qui inclut l'adresse IP publique du nœud.
Vous pouvez soit attendre que l'agent s'enregistre automatiquement auprès du maître, soit exécuter la commandepuppet agent --test
(à partir de l'un de vos nœuds d'agent). Puis exécutez la commande suivante pour imprimer le fichier:
cat /tmp/example-ip
Vous devriez voir un résultat ressemblant à ce qui suit (avec l’adresse IP de ce nœud):
Output:Here is my Public IP Address: 128.131.192.11.
Spécifier un nœud
Si vous souhaitez définir une ressource pour des nœuds spécifiques, définissez unnode
dans le manifeste.
Sur le maître, éditezsite.pp
:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
Maintenant, ajoutez les lignes suivantes:
site.pp example
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 default {} # applies to nodes that aren't explicitly defined
Sauvegarder et quitter.
Désormais, Puppet s'assurera qu'un fichier à/tmp/dns
existera surns1 etns2. Vous pouvez exécuter la commandepuppet agent --test
(à partir de ns1 ou ns2), si vous ne souhaitez pas attendre l'extraction programmée de l'agent Puppet.
Notez que si vous ne définissez pas de ressource, Puppet fera de son mieux pour ne pas y toucher. Donc, si vous supprimez ces ressources du manifeste, Puppet ne supprimera pas les fichiers qu'il a créés. Si vous voulez qu'il supprime les fichiers, remplacezensure
parabsent
.
Ces exemples ne servent à rien, mais ils prouvent que Puppet fonctionne correctement.
Utiliser un module
Maintenant, utilisons un module. Les modules sont utiles pour regrouper des tâches. De nombreux modules sont disponibles dans la communauté Puppet et vous pouvez même écrire les vôtres.
Sur le maître Puppet, installez le modulepuppetlabs-apache
de forgeapi:
sudo /opt/puppetlabs/bin/puppet module install puppetlabs-apache
[.warning] #Warning: n'utilisez pas ce module sur une configuration Apache existante. Il purgera toutes les configurations Apache qui ne sont pas gérées par Puppet.
#
Maintenant, éditezsite.pp
:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
Ajoutez maintenant les lignes suivantes pour installer Apache surhost2:
site.pp example
node 'host2' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
# node default {} # uncomment this line if it doesn't already exist in your manifest
Sauvegarder et quitter. Désormais, la prochaine fois que Puppet mettra à jour host2, il installera le package Apache et configurera un hôte virtuel appelé «example.com», à l'écoute sur le port 80, et avec une racine de document/var/www/html
.
Surhost2, exécutez la commande suivante:
sudo /opt/puppetlabs/bin/puppet agent --test
Vous devriez voir un tas de résultats indiquant qu'Apache est en cours d'installation. Une fois l’opération terminée, ouvrez l’adresse IP publique de l’hôte2 dans un navigateur Web. Vous devriez voir une page servie par Apache.
Félicitations! Vous avez utilisé votre premier module de marionnettes!
Conclusion
Maintenant que vous disposez d'une installation de base de puppet agent / maître, vous êtes maintenant prêt à en apprendre davantage sur l'utilisation de Puppet pour gérer votre infrastructure de serveur. Consultez le didacticiel suivant:Getting Started With Puppet Code: Manifests and Modules.