Puppet dostępny jest w komercyjnej wersji Enterprise i bezpłatnej OpenSource. W artykule tym zajmiemy się instalacją wersji OpenSource w systemie CentOS 7 ale wspomnimy też o wersji Enterprise.
W skład pakietu Puppet (Enterprise) wchodzą komponenty po stronie agenta:
- Puppet agent – klient, który komunikuje się z serwerem.
 - Puppet – rdzeń platformy zarządzania konfiguracją. Zawiera specjalny język programowania do opisywania pożądanego stanu systemu.
 - Facter – narzędzie profilowania systemu, wykorzystywane do wysyłania do serwera ważnych informacji o systemie.
 - Hiera – narzędzie używane do konfiguracji własnych klas.
 - MCollective (Marionette Collective) – framework do budowania systemu orkiestracji serwera lub równoległego wykonywania zadań.
 
oraz komponenty po stronie serwera:
- Puppet Server – aplikacja uruchamiana w JVM, która świadczy usługi agentom (klientom). Agenci pobierają od serwera katalogi z konfiguracją węzłów.
 - Puppet Master – aplikacja Ruby, która kompiluje konfiguracje dla węzłów agentów.
 - PuppetDB – baza, która zawiera dane generowane przez Puppeta i API do analizowania tych danych.
 - R10k – narzędzie zarządzania kodem.
 - Razor Server – aplikacja do provisioningu systemów przez PXE.
 - PostgreSQL – DBMS używana przez PuppetDB
 - ActiveMQ – messsage broker używany przez MCollective.
 - Nginx – web serwer używany przez Puppet Enterprise Console.
 - Console – interfejs webowy (tylko dla Puppet Enterpise).
 
Narzędzia klienckie dla wersji Puppet Enterpise:
- Puppet orchestrator – kontrola wdrażanych zmian w infrastrukturze.
 - Puppet access – narzędzie do autentykacji użytkowników.
 - Code manager – narzędzie do zarządzania kodem i synchronizacji plików.
 - PuppetDB CLI – linia komend bazy PuppetDB.
 
Architektura Agent / Master.
W tej architekturze na zarządzanym węźle uruchamiany jest agent, który co pewien czas wysyła pewne dane do serwera i pobiera z niego tzw. katalog. W katalogu tym znajduje się konfiguracja pożądanego stanu agenta.
Architektura Stand-Alone.
W tej architekturze każdy węzeł ma swoją kopię konfiguracji i sam kompiluje swój katalog. Aplikacja puppet apply uruchamiana jest okresowo przez cron.
Wymagania wstępne.
Ponieważ serwera Puppeta pracuje jako Certificate Authority (CA) czasy na serwerze i klientach powinny być zsynchronizowane. Instalujemy zatem na serwerze i kliencie NTP oraz synchronizujemy czas:
| 
					 1 2  | 
						# yum -y install ntpdate # ntpdate 0.centos.pool.ntp.org  | 
					
Wszystkie węzły muszą mieć ponadto skonfigurowaną tą samą strefę czasową:
| 
					 1  | 
						# timedatectl set-timezone Europe/Warsaw  | 
					
Puppet korzysta z nazw domenowych hostów do komunikacji z zarządzanymi hostami dlatego ważne aby wszystkie węzły miały odpowiednie wpisy na serwerze DNS lub ewentualnie w plikach /etc/hostname na wszystkich węzłach.
Instalacja.
Na serwerze i agentach instalujemy repozytorium PuppetLabs:
| 
					 1  | 
						# rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm  | 
					
Instalacja Puppet Serwera.
| 
					 1  | 
						# yum install -y puppetserver  | 
					
Domyślnie Puppet Server skonfigurowany jest do wykorzystywania 2GB pamięci, co możemy zmienić w pliku:
| 
					 1  | 
						# vim /etc/sysconfig/puppetserver  | 
					
Aby zmienić użycie 2GB na 512MB, zastępujemy wpis:
| 
					 1  | 
						JAVA_ARGS="-Xms2g -Xmx2g"  | 
					
wpisem:
| 
					 1  | 
						JAVA_ARGS="-Xms512m -Xmx512m"  | 
					
Domyślnie Puppet master nie wymaga żadnej dodatkowej konfiguracji, można uruchomić usługę puppetserver. Jeżeli chcemy jednak zmienić nazwę domenową Puppet mastera to robimy to w pliku:
| 
					 1 2 3 4 5 6 7 8 9  | 
						# vim /etc/puppetlabs/puppet/puppet.conf [master] dns_alt_names =ppmaster.example.com,server [main] certname = ppmaster.example.com server = ppmaster.example.com environment = production runinterval = 1h  | 
					
Uruchomienie i autostart Puppet Server.
| 
					 1 2  | 
						# systemctl start puppetserver # systemctl enable puppetserver  | 
					
Odblokowanie portu Puppeta na serwerze:
| 
					 1 2  | 
						# firewall-cmd --permanent  --add-port=8140/tcp # firewall-cmd --reload  | 
					
Instalacja Puppet Agenta.
| 
					 1  | 
						# yum install -y puppet-agent  | 
					
Konfiguracja:
| 
					 1 2 3 4 5 6 7  | 
						# vi /etc/puppetlabs/puppet/puppet.conf [main] certname = ppagent1.example.com server = ppserver.example.com environment = production runinterval = 1h  | 
					
Zmienna runinterval kontroluje ile agent ma czekać na ponowne pobranie katalogu z konfiguracją z Puppet Servera. Można go zmienić i wartość zapisać także w sekundach jeżeli jest taka potrzeba.
Uruchomienie i autostart Puppet Agenta:
| 
					 1  | 
						# /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true  | 
					
Wyjście:
| 
					 1 2 3 4 5  | 
						Notice: /Service[puppet]/ensure: ensure changed 'stopped' to 'running' service { 'puppet': ensure => 'running', enable => 'true', }  | 
					
Sygnowanie certyfikatu agenta na serwerze.
W architekturze agent/master serwer musi zatwierdzić certyfikat każdego agenta, który się będzie do niego podłączał.
Po stronie serwera wyświetlamy listę certyfikatów oczekujących na zatwierdzenie:
| 
					 1 2 3  | 
						# /opt/puppetlabs/bin/puppet cert list "ppagent1.example.com" (SHA256) 63:5C:F8:19:76:AE:16:A6:1C:43:12:FE:34:CE:57:EB:45:37:40:98:FF:3E:CC:FE:05:7E:AF:BF:E4:2C:31:FC  | 
					
Można wylistować także zatwierdzone i nie zatwierdzone żądania. Zatwierdzone żądania zaczynają się od znaku “+”:
| 
					 1 2 3  | 
						# /opt/puppetlabs/bin/puppet cert list --all  "ppagent.example.com" (SHA256) C8:F5:FB:13:BE:80:13:22:F2:20:B6:6B:38:5E:DB:10:BB:DF:B2:3C:9F:60:89:44:D8:1E:24:DE:7C:1B:29:50 + "ppmaster..example.com" (SHA256) E2:A5:94:F8:64:EA:4A:DF:EE:1C:F1:FD:DA:6E:5B:1E:78:1E:2E:95:03:11:0F:C0:0A:84:AA:F9:38:28:CF:BB (alt names: "DNS:puppet", "DNS:ppmaster.example.com")  | 
					
Zatwierdzenie certyfikatu:
| 
					 1 2 3 4 5 6  | 
						# /opt/puppetlabs/bin/puppet cert sign ppagent1.example.com Signing Certificate Request for: "ppagent1.example.com" (SHA256) 63:5C:F8:19:76:AE:16:A6:1C:43:12:FE:34:CE:57:EB:45:37:40:98:FF:3E:CC:FE:05:7E:AF:BF:E4:2C:31:FC Notice: Signed certificate request for ppagent1.example.com Notice: Removing file Puppet::SSL::CertificateRequest ppagent1.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/ppagent1.example.com.pem'  | 
					
Teraz klient Puppeta może komunikować się z serwerem.
Jeżeli mamy wiele żądań od agentów o zatwierdzenie ich certyfikatów możemy je sygnować jedną komendą:
| 
					 1  | 
						# /opt/puppetlabs/bin/puppet cert sign --all  | 
					
Certyfikat możemy odwołać w razie potrzeby komendą:
| 
					 1  | 
						# /opt/puppetlabs/bin/puppet cert clean ppagent1.example.com  | 
					
Po zatwierdzeniu certyfikatu przeprowadzamy test na kliencie:
| 
					 1 2 3 4 5 6 7 8 9  | 
						# puppet agent --test Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Loading facts Info: Caching catalog for ppagent.netico.pl Info: Applying configuration version '1505237337' Notice: Applied catalog in 0.47 seconds  | 
					


