Managed ad

Kom igång med Puppet för att underlätta server administrationen

Av Pontus, 10 september, 2015

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

 

 

Kategorier

Managed ad