Puppet är ett ramverk som hjälper systemadministratörer att administrera många datorer genom att automatisera allt från en central plats. Med hjälp av kod kan man installera programvara, kontrollera rättigheter på filer, uppdatera användarkonton mm. Det spelar ingen roll om servarna är Windows eller Linux, Puppet hanterar båda lika bra. Dock finns inte Puppet-servern till Windows utan där måste det vara en Linux burk.
Man kan använda Puppet antingen som fristående på en server, den administrerar då enbart den servern. Eller som klient/server, då får man en central plats för all administration. Här går vi igenom installationen av ett klient/server system i Ubuntu.
Konfigurerar DNS
Först lägger vi till puppet-servern i DNSen. Eftersom att klienterna som standard söker efter en värd som heter puppet på den lokala domänen så är det enklast att döpa den till just puppet.
Därför lägger vi till en rad i den lokala domänen i BIND.
puppet IN A 192.168.0.25
Samt i filen för den omvända DNS-uppslagningen
30 IN PTR puppet.
Glöm inte att öka serienummret och starta om dns-servern.
$ sudo service bind9 restart
Installera Puppetmaster
Eftersom att Puppet förlitar sig mycket på certifikaten så är det viktigt att alla datorer använder samma tid. Se därför till att NTP är konfigurerat på alla.
För att installera Puppet-servern så skriver vi följande på maskinen som ska agera server.
$ sudo apt-get install puppetmaster
Puppet använder sig av certifikat för att säkerställa att rätt klienter ansluter, därför behöver vi skapa ett certifikat på servern som är giltligt för alla adresser som puppetmastern kan nås på. Lägg först in alla adresser i filen puppet.conf
$ sudo joe /etc/puppet/puppet.conf
Under [main] lägger vi till följande rad, självklart ändrar du adresserna till de som gäller för ditt nätverk. Ett tips är att använda puppet.dindoman.com eftersom att klienterna försöker ansluta till puppet om inget annat är inställt, det underlättar senare när det är dags att lägga upp klienter.
Den här processen gäller om servern även ska agera CA server, alltså den som ansvarar för certifikaten. Om du bara ska ha en puppetmaster så är det säkert så. Om du däremot kommer att driva flera puppetmaster servrar så kommer en av dem att agera CA-server och processen ser något annorlunga ut, eftersom att det inte är fallet hos mig så har jag inte testat det.
dns_alt_names = puppet,puppet.example.com,puppet01,puppet01.example.com
Därefter ser vi till att skapa certifikatet, då måste vi stoppa puppetmastern och starta den manuellt, när den har startat så avslutar vi den med ctrl+c för att slutligen starta upp den som tjänst igen med rätt certifikat.
$ sudo service puppetmaster stop
$ sudo puppet master --verbose --no-daemonize
Notice Starting Puppet master version 3.7.2
Här trycker vi ctrl+c
Notice: Caught INT; calling stop
$ sudo service puppetmaster start
För bättre prestanda på servern så lägger vi till följande rader i /etc/puppet/puppet.conf under [master] sektionen.
alway_cache_features = true
Så glömmer vi inte en liten omstart för att läsa in ändringen.
$ sudo service puppetmaster restart
Installera apache webbserver till puppetmastern
Med puppetmastern följer det med en väldigt enkel webbserver som inte klarar av någon större belastning, så om du ska hantera mer än ett par servar så behöver den bytas ut mot en mer robust webbserver, antingen Nginx eller Apache. Här kommer vi att installera Apache med Passenger. Vad är då Passenger? Passenger är en modul till Apache som gör så att Rails applikationer kan köras på webbservern. Allt finns färdigt i ett paket i Ubuntu så vi behöver i princip bara installera det paketet.
$ sudo apt-get install puppetmaster-passenger
Alla inställningar ska vara färdiga när vi använder packetet, men om det är några inställningar som behöver ändras så ligger inställningarna för puppetmastern i /etc/apache2/sites-available-puppetmaster.conf
Installera och konfigurera en Puppet klient
Sedan installerar vi klienten på en av servarna som ska administreras via puppet servern.
Säkerställ först att tiden stämmer med hjälp av NTP.
sudo apt-get install puppet
Ändra eventuellt inställningarna i puppet.conf
$ sudo joe /etc/puppet/puppet.conf
Det som kan vara aktuellt är att lägga till nedanstående rad under [main], såvida vi inte döpte server till puppet i DNSen
server = puppetserver
Tjänsten startas automatiskt men för att klienten ska kunna ansluta till servern så måste den godkännas. Logga in på servern och skriv
$ sudo puppet cert list
Då listas alla klienters certifikat som måste godkännas.
"puppetklient.example.com" (SHA256) 5D:4E:12:ER:Q3:M8:8S:82:FC:01:6A:DB:71:AE:D6:D7:3F:28:07:B4:6F:EG:73:IA:61:J5:77:E4:58:78:1B:5U
För att godkänna en klient skriver man, puppetklient.example.com byts ut mot vad klienten heter.
$ sudo puppet cert sign puppetklient.example.com
Alternativt kan man godkänna alla som ligger i listan med
$ sudo puppet cert sign --all
Om man någon gång vill ta bort en klient från servern så skriver man följande på mastern.
$ sudo puppet cert clean puppetklient.example.com
Klienten är nu redo att ta emot konfigurationer från servern men först måste vi ska en manifest på servern så att klienten vet vad den ska göra.
Node definitioner, manifest och environments
Vi har nu en färdig klient/server installation av Puppet med en klient som är godkänd på servern. Fast klienten har inte fått något att göra än, det gör man genom att skapa en noddefinition på servern. Klienten ansluter sedan två gånger i timmen och hämtar instruktionerna. Instruktionerna kan vara att kontrollera att ett paket är installerat, en fil finns, en tjänst körs. FInns i princip inga begränsningar.
Nod defintionen anges i en manifest, som standard är det en fil som heter site.pp i katalogen /etc/puppet/manifest/.
Puppet kan även hantera flera olika miljöer (environments), till exempel en testmiljö och en produktionsmiljö. Om man använder olika miljöer så knyter man klienten till en av miljöerna och kan då testa olika inställningar i testmiljön utan att störa produktionsmiljön.
Om man inte ändrar en nods miljö så är det production som den frågar efter. Finns inte den miljön så är det site.pp i /etc/puppet/manifest som används. Att bara ha en fil för alla noder blir lätt omständigt när antalet klienter ökar, av den anledningen skapar jag nu production miljön. Fördelen med att använda den miljön är för att istället för konfigurera alla noder från site.pp så kan man skapa en fil för varje nod i production miljöns manifest katalog.
Antingen kan man alltså lägga in alla noder i site.pp eller skapa en miljö och då skapa en fil per nod. Vill du hellre administrera allt i site.pp så kan du hoppa över nästa steg och fortsätta längre ner där vi skapar test manifesten för noden.
Skapa production miljön
De olika mijöerna är egentligen bara lite olika kataloger och en inställning var de katalogerna finns. Här kan du hitta mer information om strukturen i Puppets mljöer.
Först ställer vi in var katalogerna finns i puppet.conf
$ sudo joe /etc/puppet/puppet.conf
Under [master] sektionen lägger du till följande rad.
environmentpath = /etc/puppet/environments
Därefter skapar vi katalogerna.
cd /etc/puppet
sudo mkdir environments
cd environments
sudo mkdir production
cd production
sudo mkdir manifests
sudo mkdir modules
Skapa en test definition till noden
Nu ska vi lägga till klienten och testa så att det fungerar genom att skapa en fil på klienten genom att ange den i manifesten.
Öppna /etc/puppet/environments/production/manifests/klient1.pp
$ sudo joe /etc/puppet/environments/production/manifests/kient1.pp
I filen ska vi nu definiera klienten. Det görs genom att skriva node och klientens fulla domännamn, till exempel klient.exemple.com. Därefter anges vad som ska ingå på klienten inuti en klammerparentes. Senare kommer vi att installera moduler och då kan vi här ange classer från modulerna. På det sätter behöver man inte ange allt som ska ingå i manifesten utan det hämtas från modulen, finns en uppsjö med färdiga moduler på puppets hemsidan samt instruktioner för hur du skriver dina egna. Vi kommer senare att gå igenom installationen och konfigurationen av några. Nu ska vi bara snabbt testa om våran installation fungerar så då skapar vi en definition som kontrollerar att en fil finns. I filen site.pp skriver vi följande.
node 'client.example.com' {
file { 'apa.txt':
path => '/tmp/apa.txt',
ensure => file,
content => 'En testfil för att se om puppet fungerar',
}
}
Därefter går vi till klienten och aktiverar puppet genom att skriva
$ sudo puppet agent --enable
Sedan kan vi testa om vår nya manifest fungerar med följande
$ sudo puppet agent --test
Nu bör det scrolla förbi lite text och längst ner står det.
Info: Loading facts
Info: Caching catalog for client.example.com
Info: Applying configuration version '1440580307'
Notice: Finished catalog run in 0.09 seconds
Nu ska det då finnas en fil i /tmp som heter apa.
$ ls /tmp/
apa.txt
Tada! Om vi nu tar bort den här filen så ska den återskapas nästa gång klienten kontrollerar, så därför tar vi bort filen.
$ rm /tmp/apa.txt
Vänta en halvtimme och kolla om filen finns.
$ ls /tmp/
apa.txt
Allting fungerar och vi kan nu börja installera färdiga moduler för att sköta om servern.
Diverse bra att kunna saker
Ändra serverns domän
För att ändra domänen eller lägga till ett nytt namn på servern så måste man skapa nya certifikat som innehåller de nya namnen.
Först lägger vi till de nya namnen genom att redigera puppet.conf
$ sudo joe /etc/puppet/puppet.conf
Sedan lägger vi till de nya namnen i listan under dns_alt_names
dns_alt_names = puppet,puppet.example.com,puppet01,puppet01.example.com,namn.example.com
Därefter stoppar vi puppet mastern, tar bort de gamla certifikaten och skapar nya.
$ sudo service puppetmaster stop
$ sudo rm -r /var/lib/puppet/ssl/*
Skapa certifikaten görs på samma sätt som när vi installerade. När texten Notice Starting Puppet master version 3.7.2 kommer upp så avslutar vi med ctrl+c för att sedan starta mastern som daemon igen.
$ sudo puppet master --verbose --no-daemonize
Info: Creating a new SSL key for ca
Info: Creating a new SSL certificate request for ca
osv ...
Notice Starting Puppet master version 3.7.2
ctrl+c
$ sudo service puppetmaster start
Nu kommer förhoppningsvis servern att kunna svara på anrop även på den nya adressen. Dock fick jag även göra
$ sudo puppet cert generate namn.example.com
Innan det fungerade. Eller om det var något annat fel ...
Alla klienterna måste sedan förnya certifikaten.
$ sudo rm -r /var/lib/puppet/ssl/*
$ sudo puppet agent --test
och godkänn de nya certifikaten på mastern.
$ sudo puppet master cert sign node.example.com
Ändra en nodes FQDN
Klienternas hosname kan styras i puppet.conf med hjälp av värdet certname.
certname = node.example.com