Zachu / Jani Korhonen

Linuxin keskitetty hallinta – Viikko 44

Tuntitehtävä: Asenna Puppet Manifestilla apache ja laita yksi virtualhost toimimaan. Ratkaisu:

$ cat 1.apache.pp
package { 'apache2':
        ensure  => installed,
}
service { 'apache2':
        ensure  => running,
}
file { '/etc/apache2/sites-available/foobar':
        ensure  => present,
        content => "<VirtualHost *:80>\nDocumentRoot /var/www/foobar\nServerName foo.bar\n</VirtualHost>",
}
file { '/etc/apache2/sites-enabled/foobar':
        ensure  => link,
        target  => '/etc/apache2/sites-available/foobar',
}

w44 läksy: Opiskele (http://docs.puppetlabs.com/learning/) luvut “Ordering” ja “Modules and Classes (Part One)”. Kirjoita omia, aiheen kannalta olennaisia esimerkkiohjelmia, vähintään 1 kunkin luvun aiheesta.
Tero Karvinen

Järjestys

Puppet ei suorita manifestejaan ylhäältä alaspäin, vaan saattaa suorittaa eri määritykset eri järjestyksessä. On kuitenkin tapoja kertoa Puppetille mitkä paketit ovat riippuvaisia mistäkin. Oma suosikkini on seuraava:

$ cat 2.test1.pp
#Create a file
file {'/tmp/test1':
        ensure  => present,
        content => "Testing\n",

        #Read+write for me, nothing for others
        mode    => 600,
}

#Create link to the file
file {'/tmp/link1':
        ensure  => link,
        target  => '/tmp/test1',
}

#Notify about creating a file
notify {"newfile":
        message => "New file has been created",
}

#Notify about creating a link
notify {"newlink":
        message => "New link has been created",
}

#Order of the process
File['/tmp/test1'] -> Notify['newfile'] -> File['/tmp/link1'] -> Notify['newlink']

Joka toteuttaa kaikki halutussa järjestyksessä

$ puppet apply 2.file.pp 
warning: Could not retrieve fact fqdn
notice: /Stage[main]//File[/tmp/test1]/ensure: created
notice: There's a file
notice: /Stage[main]//Notify[ensurefile]/message: defined 'message' as 'There's a file'
notice: /Stage[main]//File[/tmp/link1]/ensure: created
notice: There's a link to the file
notice: /Stage[main]//Notify[ensurelink]/message: defined 'message' as 'There's a link to the file'
notice: Finished catalog run in 0.03 seconds

Testataan vielä, että kaikki toimi kuten halusimme

$ ls -l /tmp/
lrwxrwxrwx 1 xubuntu xubuntu 10 Nov  7 23:00 link1 -> /tmp/test1
-rw------- 1 xubuntu xubuntu  8 Nov  7 23:00 test1
$ cat /tmp/link1 
Testing

Sama asia voidaan toteuttaa myös seuraavilla tavoilla:
Viimeisellä rivillä nuolet osoittavat eri suuntaan ja resurssit esitellään päinvastaisessa järjestyksessä

$ cat 2.test2.pp
#Create a file
file {'/tmp/test1':
        ensure  => present,
        content => "Testing\n",

        #Read+write for me, nothing for others
        mode    => 600,
}

#Create link to the file
file {'/tmp/link1':
        ensure  => link,
        target  => '/tmp/test1',
}

#Notify about ensuring the file
notify {"ensurefile":
        message => "There's a file",
}

#Notify about ensuring the link
notify {"ensurelink":
        message => "There's a link to the file",
}

#Order of the process
Notify['ensurelink'] <- File['/tmp/link1'] <- Notify['ensurefile'] <- File['/tmp/test1']

Tai määrittelemällä mitä resursseja ennen kyseinen resurssi pitää suorittaa. Tämä tehdään before-attribuutilla

$ cat 2.test3.pp
#Create a file
file {'/tmp/test1':
        ensure  => present,
        content => "Testing\n",

        #Read+write for me, nothing for others
        mode    => 600,

        before  => Notify['ensurefile'],
}

#Create link to the file
file {'/tmp/link1':
        ensure  => link,
        target  => '/tmp/test1',
        before  => Notify['ensurelink'],
}

#Notify about ensuring the file
notify {"ensurefile":
        message => "There's a file",
        before  => File['/tmp/link1'],
}

#Notify about ensuring the link
notify {"ensurelink":
        message => "There's a link to the file",
}

Tottakai voimme myös määrittää saman päinvastoin kuin before. Tämä tehdään require-attribuutilla:

$ cat 2.test4.pp
#Create a file
file {'/tmp/test1':
        ensure  => present,
        content => "Testing\n",

        #Read+write for me, nothing for others
        mode    => 600,
}

#Create link to the file
file {'/tmp/link1':
        ensure  => link,
        target  => '/tmp/test1',
        require => Notify['ensurefile'],
}

#Notify about ensuring the file
notify {"ensurefile":
        message => "There's a file",
        require => File['/tmp/test1'],
}

#Notify about ensuring the link
notify {"ensurelink":
        message => "There's a link to the file",
        require => File['/tmp/link1'],
}

Kaikki edellä mainitut esimerkit siis tekevät täysin samaa asiaa. Tottakai em. esimerkeillä ei ole juurikaan käytännön hyötyä. Lähempänä käytännöllisyyttä olisi vaikkapa paketin asentaminen, konfigurointi ja servicen ajaminen. Laajennetaan vaikka tuntitehtävän Apache2-manifesti em. tavalla ja ehkä opimme samalla jotain uuttakin.

$ cat 2.apache2.pp
#Ensure there's httpd installed and running
package { 'apache2':
        ensure  => installed,
}
service { 'apache2':
        ensure  => running,

        #If puppet does changes for our site config, restart the service
        subscribe => File['/etc/apache2/sites-enabled/foobar'],
}

#Ensure there's configuration for our site
file { '/etc/apache2/sites-available/foobar':
        ensure  => present,
        content => "<VirtualHost *:80>\nDocumentRoot /var/www/foobar\nServerName foo.bar\n</VirtualHost>",
}
file { '/etc/apache2/sites-enabled/foobar':
        ensure  => link,
        target  => '/etc/apache2/sites-available/foobar',
}

#Ensure there's directory for our site
file { '/var/www/foobar':
        ensure  => directory,

        #Let everyone read and write here.
        #Note: This is usually a bad idea.
        #Since it's about directory, puppet will turn on the execute flag also.
        mode    => 666,

        #Let's require apache2 package also, since /var/www/ is created then
        require => Package['apache2'],
}

#Ensure that we have something on our site
file { '/var/www/foobar/index.html':
        ensure  => file,
        content => "Hello world!<br/>\n",
}

#Order of the packages
Package['apache2'] ->
File['/etc/apache2/sites-available/foobar'] ->
File['/etc/apache2/sites-enabled/foobar'] ->
Service['apache2']

#Note that we didn't have to order file after a directory, since Puppet already knows that, silly!

Em. manifestissa asennetaan ja käynnistetään apache2, konfiguroidaan nettisivu ja laitetaan kaikki vielä oikeaan järjestykseenkin. Lopputulos on seuraavanlainen:

$ sudo puppet apply 2.apache.pp
warning: Could not retrieve fact fqdn
notice: /Stage[main]//Package[apache2]/ensure: ensure changed 'purged' to 'present'
notice: /Stage[main]//File[/var/www/foobar]/ensure: created
notice: /Stage[main]//File[/etc/apache2/sites-available/foobar]/ensure: created
notice: /Stage[main]//File[/var/www/foobar/index.html]/ensure: defined content as '{md5}21e7e4f2938a5723fd5a2d5d5d865182'
notice: /Stage[main]//File[/etc/apache2/sites-enabled/foobar]/ensure: created
notice: /Stage[main]//Service[apache2]: Triggered 'refresh' from 1 events
notice: Finished catalog run in 4.92 seconds

Olin aiemmin jo huijannut ja lisännyt /etc/hosts -tiedostoon osoitteen foo.bar osoittamaan localhostiin eli tälle kyseiselle tietokoneelle. http://foo.bar/ sivulta voimme nettiselaimella tarkistaa, että sivustomme toimii

$ curl http://foo.bar/
Hello world!

Modulit

Modulit voivat sisältää useita manifesteja, tiedostoja ja vaikka mitä. Simppelin modulin luominen on äärimmäisen helppoa. Koko manifesti kääräistään class modulin_nimi { } sisään ja laitetaan oikeanlainen hakemistorakenne ympärille.

Tehdään apache2-moduli. Valmiina sen hakemisto- ja tiedostorakenne näyttää seuraavalta:

$ tree
.
└── apache2
    ├── files
    │   ├── foobar.site
    │   └── index.html
    └── manifests
        └── init.pp

Kaikilla moduleilla tulee olla modulin nimen mukainen hakemisto (jonka pitää olla sama kuin class { } -kohdassa). Moduleilla tulee myös olla manifests-hakemisto ja manifesti nimeltä init.pp. Tästä alkaa modulin suoritus. Kääräistäänpä siis aiemmin tehty apache2 manifesti class { }:n ympärille ja sijoitetaan se init.pp -manifestiin.

Tämän lisäksi muutamme sekä sivun konfiguraatiotiedon sekä sivun index.html:n sisällön haettavaksi tiedostoista. puppet:///modules/modulin_nimi/tiedoston_nimi URL:llä voidaan viitata tiedostoihin. Tiedostot taas asetetaan modulin files/ -hakemistoon.

$ cat apache2/manifests/init.pp
class apache2 {
        #Ensure there's httpd installed and running
        package { 'apache2':
                ensure  => installed,
        }
        service { 'apache2':
                ensure  => running,

                #If puppet does changes for our site config, restart the service
                subscribe => File['/etc/apache2/sites-enabled/foobar'],
        }

        #Ensure there's configuration for our site
        file { '/etc/apache2/sites-available/foobar':
                ensure  => present,
                source => "puppet:///modules/apache2/foobar.site",
        }
        file { '/etc/apache2/sites-enabled/foobar':
                ensure  => link,
                target  => '/etc/apache2/sites-available/foobar',
        }

        #Ensure there's directory for our site
        file { '/var/www/foobar':
                ensure  => directory,

                #Read and write for me (root) and read for others
                #Since it's about directory, puppet will turn on the execute flag also.
                mode    => 644,

                #Let's require apache2 package also, since /var/www/ is created then
                require => Package['apache2'],
        }

        #Ensure that we have something on our site
        file { '/var/www/foobar/index.html':
                ensure  => file,
                source  => "puppet:///modules/apache2/index.html",
        }

        #Order of the packages
        Package['apache2'] ->
        File['/etc/apache2/sites-available/foobar'] ->
        File['/etc/apache2/sites-enabled/foobar'] ->
        Service['apache2']

        #Note that we didn't have to order file after a directory, since Puppet already knows that, silly!
}
$ cat apache2/files/foobar.site 
<VirtualHost *:80>
	DocumentRoot /var/www/foobar
	ServerName foo.bar
</VirtualHost>

$ cat apache2/files/index.html 
<html>
<head>
	<title>Hello World!</title>
</head>
<body>
	This is HTML Hello World!
</body>
</html>

Ajetaan moduli include-komennolla ja tiiraillaan lopputulosta

$ sudo puppet apply --modulepath . -e 'include apache2'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Apache2/File[/etc/apache2/sites-available/foobar]/content: content changed '{md5}9603b8a7201aff558c91d2dc94824287' to '{md5}6c285681f24b287df9e1ee742d587d97'
notice: /Stage[main]/Apache2/File[/etc/apache2/sites-available/foobar]/owner: owner changed 'root' to 'xubuntu'
notice: /Stage[main]/Apache2/File[/etc/apache2/sites-available/foobar]/group: group changed 'root' to 'xubuntu'
notice: /Stage[main]/Apache2/File[/etc/apache2/sites-available/foobar]/mode: mode changed '0644' to '0664'
notice: /Stage[main]/Apache2/File[/var/www/foobar/index.html]/content: content changed '{md5}21e7e4f2938a5723fd5a2d5d5d865182' to '{md5}e0790d1ab8152ec4bbcd3ff1208f409a'
notice: /Stage[main]/Apache2/File[/var/www/foobar/index.html]/owner: owner changed 'root' to 'xubuntu'
notice: /Stage[main]/Apache2/File[/var/www/foobar/index.html]/group: group changed 'root' to 'xubuntu'
notice: /Stage[main]/Apache2/File[/var/www/foobar/index.html]/mode: mode changed '0644' to '0664'
notice: Finished catalog run in 0.23 seconds

Ja testataan toimivuutta

$ curl http://foo.bar
<html>
<head>
	<title>Hello World!</title>
</head>
<body>
	This is HTML Hello World!
</body>
</html>

Modulimme näyttäisi hyvinkin hyvinvoivalta ja toimivalta!

Kirjoita vastaus

Sähköpostia ei julkaista. Vaaditut kentät on merkitty *-merkillä.

Voit käyttää seuraavia HTML-tageja: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

Under heavy construction :(