Puppet på 15 minuter i RedBridge Molntjänst

(Magnus Bengtsson)

När man bygger en infrastruktur i molnet är ett verktyg för att hantera och automatisera konfiguration och tjänster ett bra komplement, vi på RedBridge arbetar mycket med Puppet från 205935.

Puppet är ett konfigurationsverktyg som genom ett deklarativt språk definierar hur system skall fungera, puppet kan installera, konfigurera och hantera tjänster. På många sätt ger konfigurationsverktyg som puppet, chef och cfengine nya möjligheter i din infrastruktur.

Infrastrukturen blir:

  • deklarativ - man beskriver vad man vill göra
  • förutsägbar - samma kod kommer att användas för att konfigurera en maskin eller hundra maskiner. Med samma resultat
  • återskapningsbar - Vi kan återskapa tjänster och maskiner enkelt
  • Självdokumenterande - Genom att läsa koden för infrastrukturen är den även dokumenterad

Läs mer om puppet på Puppetlabs hemsida.

Jag kommer nedan att visa hur du kan sätta upp en automatiserad molnmiljö i RedBridge Molntjänst baserad på Puppet.

RedBridge Molntjänst

Först behöver vi 2 st instanser i RedBridge Moln, börja med att logga in i RedBridge Molntjänst. Om du inte har ett konto hos oss redan kan du skapa ett via vår portal eller så kan du läsa mer här om RedBridge molntjänst:

image0

Skapa 2 st CentOS instanser, de instanser som vi skapar kommer att ha ett lösenord autogenererat och kommer visas inne i gränssnittet:

image1

När du är klar ska du se de två instanserna som du skapat, startade och klara:

image2

Installera Puppetmastern

Logga in på den ena noden, som kommer att bli vår puppetmaster. Vi ska förbereda lite i vår instans, installera en trevlig textredigerare samt lägga till repon.

Installera vim:

[root@d8ddaec5-d396-4d73-bd22-4cb61bfa6cf6 ~]# yum -y install vim

Sätt hostnamn:

[root@d8ddaec5-d396-4d73-bd22-4cb61bfa6cf6 ~]# vim /etc/sysconfig/network
...
HOSTNAME=puppetmaster.cs3cloud.internal
...

Uppdatera /etc/hosts med ip och hostnamn:

[root@puppetmaster ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.1.81 puppetmaster puppetmaster.cs3cloud.internal

Vi kommer att använda oss av puppetlabs yum repo för Enterprise linux 6, vissa beroenden behöver dessutom paket från EPEL, så vi tar och lägger till EPEL och Puppetlabs yum repon:

[root@puppetmaster ~]# rpm -ivh
   http://ftp.df.lth.se/pub/fedora-epel/6/i386/epel-release-6-7.noarch.rpm
[root@puppetmaster ~]# rpm -ivh
   http://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-5.noarch.rpm
[root@puppetmaster ~]# yum -y install puppet-server

Då är allt klart för att starta vår puppetmaster. Starta puppetmaster:

[root@puppetmaster ~]# chkconfig puppetmaster on
[root@puppetmaster ~]# service puppetmaster start
[ OK ]

[root@puppetmaster ~]# puppet cert list --all
+ "puppetmaster.cs3cloud.internal" (5F:7F:02:98:39:DE:FC:40:19:70:CF:05:74:E8:88:44)
(alt names: "DNS:puppet", "DNS:puppet.cs3cloud.internal",
"DNS:puppetmaster.cs3cloud.internal")

Öppna brandväggen för trafik till puppetmastern:

[root@puppetmaster ~]# iptables -A INPUT -p tcp -m state --state NEW -m tcp
   --dport 8140 -j ACCEPT
[root@puppetmaster ~]# iptables-save > /etc/sysconfig/iptables

Installera Puppetklienten

Perfekt, servern är installerad! Enkelt och snabbt, nu till klienten. Logga in på puppetklienten som du provisionerade i molnet:

Vi sätter hostnamn samt installerar repon och vim, dessutom ska vi sätta vårt hostnamn i hosts filen, eftersom vi inte har en dns igång:

[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# hostname puppetclient.cs3cloud.internal
[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# yum -y install vim
[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# vim /etc/sysconfig/network

...

[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# vim /etc/sysconfig/network
[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# ip a
...
inet 10.1.1.193/24 brd 10.1.1.255 scope global eth0
...
[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# vim /etc/hosts
[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# cat /etc/hosts
...
10.1.1.193 puppetclient puppetclient.cs3cloud.internal
[root@c44efacb-6251-4ef5-9efe-d330b17b9295 ~]# exit

Installera nödvändiga repon på klienten:

[root@puppetclient ~]# rpm -ivh
   http://ftp.df.lth.se/pub/fedora-epel/6/i386/epel-release-6-7.noarch.rpm
[root@puppetclient ~]# rpm -ivh
http://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-5.noarch.rpm

Sedan är det dags att installera puppet:

[root@puppetclient ~]# yum -y install puppet

För att puppetklienten skall kunna hitta mastern bör vi (om inte en separat dns är uppsatt) lägga till puppetmastern i vår hosts-fil:

[root@puppetclient ~]# echo "10.1.1.81 puppetmaster puppetmaster.cs3cloud.internal" >> /etc/hosts

All trafik mellan puppetmastern och dess klienter krypteras med ssl, puppetmasterna agerar CA och alla klienter behöver ett signerat cert för att ansluta till mastern, certet fungerar även som autentisering. Starta sedan puppet, första gången kan det vara bra att köra puppet manuellt för att skapa cert och göra en signerings förfrågan till puppetmastern:

root@puppetclient ~]# puppet agent -t --server puppetmaster.cs3cloud.internal
info: Creating a new SSL key for puppetclient.cs3cloud.internal
info: Caching certificate for ca
info: Creating a new SSL certificate request for puppetclient.cs3cloud.internal
info: Certificate Request fingerprint (md5): 93:33:06:8D:A9:8D:B1:9C:93:99:74:5D:1D:03:D2:AB
Exiting; failed to retrieve certificate and waitforcert is disabled

Uppdatera /etc/sysconfig/puppet så att din puppetmaster pekas ut, sätt sedan puppet till att startas automatiskt.

[root@puppetclient ~]# vim /etc/sysconfig/puppet
[root@puppetclient ~]# chkconfig puppet on

Byt tillbaka till puppetmastern, nu skall en certifikat signeringsförfrågan kommit in till puppetmastern, signera denna så är klienten redo att ansluta igen :

[root@puppetmaster ~]# puppet cert list
"puppetclient.cs3cloud.internal" (93:33:06:8D:A9:8D:B1:9C:93:99:74:5D:1D:03:D2:AB)
[root@puppetmaster ~]# puppet cert sign puppetclient.cs3cloud.internal
notice: Signed certificate request for puppetclient.cs3cloud.internal
notice: Removing file Puppet::SSL::CertificateRequest puppetclient.cs3cloud.internal
at '/var/lib/puppet/ssl/ca/requests/puppetclient.cs3cloud.internal.pem'

Puppet klienten kommer nu att kunna ansluta och köra puppet mot puppetmastern:

[root@puppetclient ~]# puppet agent -t --server puppetmaster.cs3cloud.internal
info: Caching certificate for puppetclient.cs3cloud.internal
info: Caching certificate_revocation_list for ca
info: Caching catalog for puppetclient.cs3cloud.internal
info: Applying configuration version '1347610632'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.03 seconds

Men... inte mycket hände av värde, förutom att vi kunde ansluta med SSL, nu måste vi defieniera vad som skall hända när en nod ansluter till vår puppetmaster.

Infrastruktur som kod

När en klient ansluter till mastern kommer mastern att läsa in filen /etc/puppet/manifests/site.pp och se om den kan ifrån denna fil hitta en s.k nod-definition som anger hur noden ska konfigureras.

Skapa en nod-definition i site.pp:

#! /usr/bin/env puppet
# Author: Magnus Bengtsson <magnus.bengtsson@redbridge.se>
#
#
node "puppetclient.cs3cloud.internal" {
  notice("$fqdn checking in...")
  file {'motd':
  ensure => file,
  path => '/etc/motd',
  mode => 0644,
  content => "Welcome to ${hostname},\na ${operatingsystem} island in the sea of ${domain}.\n",
  }
}

I ovan (tämligen oanvändbara) nod-definition hanterar vi en fil-resurs (/etc/motd) och skriver värden från puppets facts program (facts är klientvariabler som vi kan använda i våra moduler, manifest och node-definitioner på mastern).

Mer användbart är att använda moduler i puppet. Moduler är färdiga “recept” för att hantera olika tjänster eller mjukvaror. Puppetlabs har en module-forge: http://forge.puppetlabs.com/puppetlabs där färdiga moduler kan laddas ner och användas.

Vi ska använda oss av puppetlabs apache modul för att installera och hantera en apache webbserver på klienten. För att installera modulerna kan puppet användas. Moduler installeras i /etc/puppet/modules:

[root@puppetmaster modules]# puppet module search apache
...

Den modul vi vill installera är puppetlabs-apache:

[root@puppetmaster modules]# puppet module install puppetlabs-apache
Preparing to install into /etc/puppet/modules ...
Downloading from http://forge.puppetlabs.com ...
Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-apache (v0.4.0)
├── puppetlabs-firewall (v0.0.4)
└── puppetlabs-stdlib (v3.0.1)
[root@puppetmaster modules]#

Puppet module kommer även att ladda hem eventuella beroenden...! I detta fall puppetlabs-firewall samt puppetlabs-stdlib

Nu är modulen redo att användas på vår nod, så vi deklarerar att noden skall inkludera modulen apache:

#! /usr/bin/env puppet
# Author: Magnus Bengtsson <magnus.bengtsson@redbridge.se>
#
#
node "puppetclient.cs3cloud.internal" {
notice("$fqdn checking in...")
file {'motd':
ensure => file,
path => '/etc/motd',
mode => 0644,
content => "Welcome to ${hostname},\na ${operatingsystem} island in the sea of ${domain}.\n",
}
class {'apache': }
}

Kör nu puppet igen på puppet klienten:

[root@puppetclient ~]# puppet agent -t --server puppetmaster.cs3cloud.internal –pluginsync

Kontrollera att apache är startat och installerat:

[root@puppetclient ~]# rpm -qa | grep httpd
httpd-tools-2.2.15-15.el6.centos.1.x86_64
httpd-2.2.15-15.el6.centos.1.x86_64
[root@puppetclient ~]# service httpd status
httpd (pid 2531) is running...
[root@puppetclient ~]# cat /etc/motd
Welcome to puppetclient,
a CentOS island in the sea of cs3cloud.internal.

Så! Din första automatiserade miljö är färdig!