Avainsanaan ‘file permissions’ liitetyt artikkelit

Läksy w44: Resurssien järjestäminen ja Puppet modulien kirjoittaminen

8.11.2012

Harjoitustehtävän aiheena oli tutustua Puppet palvelinautomaatio järjestelmän Learning Pupppet dokumentaation lukuihin Ordering ja Modules and Classes (Part One). Käytännön harjoituksena tehtiin lyhyitä Puppet ohjelmia edellä mainitun dokumentaation teemoista.

Harjoitusympäristö

Harjoitusta suoritettiin 6.11, 7.11, ja 8.11.2012 opiskelijan kotona käyttäen henkilökohtaista tietokonetta. Internet-yhteytenä oli Elisa Oyj:n tarjoama VDSL tyyppinen 100/10 mbit kiinteä laajakaistayhteys. Harjoituksessa käytettiin Lenovo R60 kannettavaa tietokonetta. Käyttöjärjestelmä ladattiin Xubuntu versio 12.04 32-bittinen Linux live-cd:ltä. Tietokoneen kiintolevylle asennettua käyttöjärjestelmää ei käytetty harjoitustehtävän suorittamiseen.

Lenovo R60 kokoonpano:

  • Suoritin: Intel Core 2 Duo T56000 @1.83 Ghz
  • Keskusmuisti: 4 Gt DDR2
  • Kiintolevy: 100 Gt SATA150 54000rpm
  • Käyttöjärjestelmä: Xubuntu versio 12.04 32-bittinen

Puppet palvelinautomaatio järjestelmän asentaminen

Aloitin harjoitustehtävän tekemisen päivittämällä Ubuntun pakettivarastot komennolla:

$sudo apt-get update

Pakettivarastojen päivitys kesti muutamia sekunteja.

Asensin Puppet järjestelmän komennolla:

$sudo apt-get install puppet

Testasin asennuksen ajamalla komennon puppet komentoriviltä:

$puppet

Komento antoi tulosteen:

See 'puppet help' for help on available puppet subcommands

Totesin puppet asennuksen onnistuneen.

Resurssien järjestäminen Puppet manifestissa

Aluksin tein hakemiston puppet ja sen alihakemiston manifests:

xubuntu@xubuntu:~$ cd
xubuntu@xubuntu:~$ mkdir puppet
xubuntu@xubuntu:~$ cd puppet/
xubuntu@xubuntu:~/puppet$ mkdir manifests
xubuntu@xubuntu:~/puppet$

Puppet resurssien suoritusjärjestys voidaan määrittää manifestissa. Kokeillakseni resurssien suoritusjärjestyksen määrittämistä, kirjoitin resurssien metaparametreja käyttävän Puppet manifestin nano-editorilla:

$nano manifests/meld.pp

Sen sisällöksi tuli seuraava:

package { "meld":

        ensure => installed,
        allowcdrom => true,
        before => File["/tmp/meld.txt"],
}

file { "/tmp/meld.txt":

        ensure => file,
        content => "Package meld was installed when system current uptime was ${uptime}",
        require => Package["meld"],
}

notify {"alreadyinstalled":
   message => 'Package meld is already installed in system.',
   subscribe => Package["meld"],
}

Tämä esimerkki-manifesti asentaa meld tiedostovertailu ohjelman Xubuntun paketinhallinnan kautta. Lisäksi manifesti kirjoittaa /tmp/meld.txt tiedoston, kun ohjelman asennus suoritetaan ensimmäisen kerran ja tulostaa ilmoituksen Puppetin ajonaikaiseen lokiin aina kun manifesti suoritetaan. Näiden kolmen resurssin suoritusjärjestys määritetään metaparametreilla. Ohjelmapaketin asentava package resurssilla on before metaparametri, jonka mukaan package resurssi on suoritettava aina ennen /tmp/meld.txt tiedoston luomisesta vastaavaa file resurssia.

File resurssilla on puolestaan require metaparametri, jonka mukaan package resurssi on suoritettava aina ennen file resurssia. Resurssien package ja file metaparametrien määrityksillä estetään /tmp/meld.txt tiedoston luominen jokaisella manifestin suorituskerralla. File resurssin content määrityksessä on käytetty interpolaatiota, jossa Puppetin järjestelmämuuttuja (fact) $uptime upotetaan merkkijonon sisälle. Muuttuja $uptime palauttaa tietokoneen yhtäkestoisen käynnissäolo-ajan (uptime) päivien, tuntien ja minuuttien tarkkuudella.  Tarkoituksena on että tiedosto /tmp/meld.txt luodaan vain package resurssin ensimmäisellä suorituskerralla. Manifestissa on myös notify resurssi, jolla on subscribe metaparametri. Metaparametrilla määritetään, että notify resurssi suoritetaan aina kun package resurssi suoritetaan.

Testaamista varten ajoin manifestin komennolla:

xubuntu@xubuntu:~/puppet$ sudo puppet apply manifests/meld.pp 
warning: Could not retrieve fact fqdn
notice: /Stage[main]//Package[meld]/ensure: ensure changed 'purged' to 'present'
notice: /Stage[main]//File[/tmp/meld.txt]/ensure: defined content as '{md5}7c1752f363e811261c4bcf29361c17c2'
notice: Package meld is already installed in system.
notice: /Stage[main]//Notify[alreadyinstalled]/message: defined 'message' as 'Package meld is already installed in system.'
notice: Finished catalog run in 13.57 seconds

Puppet manifesti asensi meld ohjelmapaketin, kirjoitti /tmp/meld.txt tiedoston ja ilmoitti notify resurssin kautta että meld paketti on jo asennettu. Resurssi notify tulosti ilmoituksensa jo ensimmäisellä kerralla, vaikka ajatuksena oli että ilmoitus annettaisiin vasta kun manifestia ajetaan seuraavan. Puppet manifesti toimi itsessään oikein ja vika oli enemmän sovelluslogiikassa, jota kehittämällä manifestin toimintaa voitaisiin parantaa. Seuraavaksi tarkistin, että meld ohjelmapaketti on asennettu dpkg komennon avulla:

xubuntu@xubuntu:~/puppet$ dpkg -l meld
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-=====================
ii  meld           1.5.3-1ubuntu1 graphical tool to diff and merge files

Ohjelmapaketin meld status on asennettu, joten asennus siis onnistui. Seuraavaksi katsoin tiedoston /tmp/meld.txt sisältöä komennolla:

xubuntu@xubuntu:~/puppet$ cat /tmp/meld.txt
Package meld was installed when system current uptime was 1:11 hours

Tiedoston sisällössä kerrottiin, että meld paketti oli asennettu kun tietokone oli ollut käynnissä 1 tunnin ja 11 minuuttia. Tiedoston luominen oli onnistunut, samoin kuin järjestelmämuuttujan interpolaatio tiedoston sisältöön. Jatkoin testaamista suorittamalla manifestin uudestaan komennolla:

xubuntu@xubuntu:~/puppet$ sudo puppet apply manifests/meld.pp 
warning: Could not retrieve fact fqdn
notice: /Stage[main]//File[/tmp/meld.txt]/content: content changed '{md5}7c1752f363e811261c4bcf29361c17c2' to '{md5}e4b6995766ecac5c4126cbf0e0ebd3fc'
notice: Package meld is already installed in system.
notice: /Stage[main]//Notify[alreadyinstalled]/message: defined 'message' as 'Package meld is already installed in system.'
notice: Finished catalog run in 0.23 seconds

Nyt ohjelmapakettia ei ajettua enää uudestaan, mutta notify resurssilla annettiin ilmoitus ja tiedosto /tmp/meld.txt kirjoitettiin uudestaan. Tämä ei ollut toivottu tulos. Katsoin uudestaan tiedoston /tmp/meld.txt sisältöä komennolla:

xubuntu@xubuntu:~/puppet$ cat /tmp/meld.txt 
Package meld was installed when system current uptime was 1:33 hours

Järjestelmämuuttujan arvo oli päivittynyt tiedostoon sisältöön, joten file resurssin tekemä tiedoston uudelleenkirjoitus oli todettavissa. Kokeilin vielä kolmannen kerran suorittaa Puppet manifestin komennolla:

xubuntu@xubuntu:~/puppet$ sudo puppet apply manifests/meld.pp
Package meld was installed when system current uptime was 1:41 hours

Tiedoston sisältö oli taas päivittynyt. Tässä vaiheessa totesin ohjelman toimivan toisin kuin suunnitellut ja päätin pysäyttää manifestin kehittämisen, koska olin kuitenkin onnistunut kokeilemaan metaparametrien käyttöä. Arvioin manifestin jatkokehityksen tarvittavan työmäärän liian korkeaksi suhteutettuna käytössäni olevaan, kotitehtävien tekemiseen varattuun aikaan. Jatkoin Puppetin harjoittelua kotitehtäviin kuuluvilla toisilla aiheilla.

Puppet modulin kirjoittaminen

Aluksin tein hakemistoon puppet alihakemiston modules omia Puppet moduleja varten:

xubuntu@xubuntu:~/puppet$ mkdir modules

Päätin tehdä Apache palvelimen asentavan Puppet modulin. Tein modules hakemistoon alihakemiston apache ja sille alihakemiston manifests:

xubuntu@xubuntu:~/puppet$ cd modules/
xubuntu@xubuntu:~/puppet/modules$ mkdir apache
xubuntu@xubuntu:~/puppet/modules$ cd apache/
xubuntu@xubuntu:~/puppet/modules/apache$ mkdir manifests
xubuntu@xubuntu:~/puppet/modules/apache$

Kirjoitin modulin käynnistävän init.pp tiedoston nano-editoria käyttäen:

xubuntu@xubuntu:~/puppet/modules/apache$ nano manifests/init.pp

Puppet modulin sisällöstä tuli seuraava:

class apache {
      package { "apache2":
        ensure => installed,
        allowcdrom => true,
      }

      service { "apache2":
        enable => true,
        ensure => stopped,
        hasrestart => true,
        hasstatus => true,
        require => Package["apache2"]
      }

}

Puppet modulissa käytetään class määrittelyä, jolla useita resursseja voidaan kootaa yhtenäiseksi ryhmäksi. Puppetin class määrittely ei suoranaisesti tarkoita olio-ohjelmoinnin luokkaa, vaan se on enemmänkin toisiinsa liittyvien resurssien hallintaan käytetty “säiliö”. Tässä Puppet modulissa class määrittelyn sisällä on Apachen palvelimen asentava package resurssi ja Apache palvelimen taustaprosessin suorittamista ohjaava service resurssi. Metaparametrilla require service resurssin suorittaminen saadaan riippuvaiseksi package resurssin suorittamisesta. Resurssissa service Apachen taustaprosessin määritetään pysäytetyksi.

Testasin Puppet modulia komennolla:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include apache'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Apache/Package[apache2]/ensure: ensure changed 'purged' to 'present'
notice: /Stage[main]/Apache/Service[apache2]/ensure: ensure changed 'running' to 'stopped'
notice: Finished catalog run in 9.29 seconds

Puppet moduli asensi Apache palvelimen ja asettti sen taustaprosessin pysäytettyyn tilaan.  Seuraavaksi tarkistin, että Apache palvelin oli asennettu dpkg komennon avulla:

xubuntu@xubuntu:~/puppet$ dpkg -l apache2
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version               Description
+++-=====================-=====================-===========
ii  apache2               2.2.22-1ubuntu1       Apache HTTP Server metapackage

Metapaketin apache2 status on asennettu, joten Apache palvelimen asennus siis onnistui.Testasin myös Apachen palvelimen toimintaa avaamalla Firefox selaimella osoitteen “localhost”:

Selain ilmoitti, että paikalliseen www-palvelimeen ei saada yhteyttä. Apache palvelin ei siis ollut käynnissä kuten Puppet modulissa oli määritelty. Jatkoin testaamista käynnistämällä Apache palvelimen komennolla:

xubuntu@xubuntu:~/puppet$ sudo service apache2 start

Kokeilin nyt uudestaan avata osoitteen “localhost” selaimella:


Nyt selaimeen avautui Apache palvelimen tyhjä juurihakemisto. Seuraavaksi suoritin uudestaan Puppet modulin komennolla:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include apache'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Apache/Service[apache2]/ensure: ensure changed 'running' to 'stopped'
notice: Finished catalog run in 2.72 seconds

Nyt Puppet moduli pysäytti manuaalisesti käynnistetyn Apache palvelimen taustaprosessin, koska Apache palvelimen taustaprosessin tavoitetila oli määritelty pysäytetyksi. Tarkistin vielä selaimella osoitteen “localhost”:

Apache palvelimeen ei saatu yhteyttä, koska se oli pysäytetty. Totesin Puppet modulin toimivan niin kuin oli suunniteltu.

Tiedosto-oikeuksien käsittely Puppet modulissa

Kokeillakseni tiedosto-oikeuksien hallintaa tein Puppet modulin, joka luo uuden käyttäjän ja sille kotihakemiston. Käyttäjälle määriteltiin salasana, joka annettiin SHA-512 tiivisteenä. Kotihakemistoon tiettyihin tiedostoihin  määritellään ennnalta haluttuja tiedosto-oikeuksia. Tein modules hakemistoon alihakemiston userfile ja sille alihakemiston manifests:

xubuntu@xubuntu:~/puppet$ cd modules/
xubuntu@xubuntu:~/puppet/modules$ mkdir userfile
xubuntu@xubuntu:~/puppet/modules$ cd userfile/
xubuntu@xubuntu:~/puppet/modules/userfile$ mkdir manifests
xubuntu@xubuntu:~/puppet/modules/userfile$

Kirjoitin modulin käynnistävän init.pp tiedoston nano-editoria käyttäen:

xubuntu@xubuntu:~/puppet/modules/userfile$ nano manifests/init.pp

Puppet modulin sisällöstä tuli seuraava:

class userfile {
    $userpw = '$6$mOMTmBdk$pCTLLq7mbII1Ggr5YTG.0EdLQcqEfxWeTogpgFXQsvkNKZQ6qS.MemOTXywzGQZi5HTbn07xwAR0/77mx2nYq1'
    $username = "filetestuser"

    user { $username:
      ensure     => present,
      gid        => $username,
      shell      => '/bin/bash',
      home       => "/home/${username}",
      managehome => true,
      password   => $userpw,
      require    => Group["$username"],
    }

    group { "$username":
        ensure    => present,
        allowdupe => false,
    }

    file { "/home/${username}":
      ensure  => directory,
      owner   => $username,
      group   => $username,
      recurse => true,
      replace => true,
      force   => true,
      require   => User["${username}"],
    }

    file { "/home/${username}/.bash_history":
        mode => 600,
        owner   => $username,
        group   => $username,
        require => File["/home/${username}"],
    }

    file { "/home/${username}/.ssh":
        ensure  => directory,
        owner   => $username,
        group   => $username,
        mode    => 700,
        require => File["/home/${username}"],
    }

}

Puppet modulissa luodaan käyttäjä nimeltä filetestuser, jolle määritellään myös salasana. Salasana annettiin SHA-512 tiivisteenä. Käyttäjälle luodaan kotihakemisto /home/filetestuser. Kotihakemistoon luodaan tiedosto .bash_history sekä hakemisto .ssh, joiden tiedosto-oikeudet määritellään. Tiedostolle .bash_history määritellään tiedoston omistajaksi filetestuser ja samoin ryhmäksi filetestuser. Mode määrittelyllä kuvataan tiedosto-oikeudet, jotka esitetään oktaalimuodossa 600. Käyttäjälle on luku- ja kirjoitusoikeudet tiedostoon (6), ryhmällä ei mitään oikeuksia (0), samoin kuin kaikilla muillakaan käyttäjillä (0).

Hakemistolle .ssh määritellään tiedoston omistajaksi filetestuser ja samoin ryhmäksi filetestuser. Mode määrittelyllä kuvataan hakemiston tiedosto-oikeudet, jotka esitetään oktaalimuodossa 700. Käyttäjälle on luku-, kirjoitus- ja suoritusoikeudet hakemistoon (7), ryhmällä ei mitään oikeuksia (0), samoin kuin ei muillakaan käyttäjillä (0).

Testasin Puppet modulia komennolla:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include userfile'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Userfile/Group[filetestuser]/ensure: created
notice: /Stage[main]/Userfile/User[filetestuser]/ensure: created
notice: /Stage[main]/Userfile/File[/home/filetestuser/.ssh]/ensure: created
notice: Finished catalog run in 0.27 seconds

Puppet moduli loi ryhmän filetestuser ja käyttäjän filetestuser sekä teki käyttäjän kotihakemistoon .ssh hakemiston. Seuraavaksi tarkastin käyttäjän tiedot /etc/passwd tiedostosta komennolla:

xubuntu@xubuntu:~/puppet$ cat /etc/passwd | grep filetestuser
filetestuser:x:1000:1000::/home/filetestuser:/bin/bash

Käyttäjän tiedot löytyivät järjestelmän salasanatietokannasta, joten käyttäjä oli luotu kuten Puppet modulissa määriteltiin. Seuraavaksi katsoin ls komennolla käyttäjän kotihakemistoa:

xubuntu@xubuntu:~/puppet$ ls -lA /home/filetestuser/
total 20
-rw-r--r-- 1 filetestuser filetestuser  220 Apr  3  2012 .bash_logout
-rw-r--r-- 1 filetestuser filetestuser 3486 Apr  3  2012 .bashrc
-rw-r--r-- 1 filetestuser filetestuser  675 Apr  3  2012 .profile
drwx------ 2 filetestuser filetestuser   40 Nov  8 20:17 .ssh
-rw-r--r-- 1 filetestuser filetestuser 1601 Feb  4  2012 .Xdefaults
-rw-r--r-- 1 filetestuser filetestuser   14 Nov 19  2011 .xscreensaver

Hakemiston .ssh tiedosto-oikeudet olivat Puppet modulin määritysten mukaiset. Tiedostoa .bash_history ei näkynyt listauksessa, koska käyttäjä ei ollut koskaan kirjautunut komentokehotteeseen. Kokeilin myös kirjautua filetestuser käyttäjänä komennolla:

xubuntu@xubuntu:~/puppet$ su - filetestuser
Password: 
filetestuser@xubuntu:~$

Kirjautuminen onnistui Puppet modulissa määriteltyä salasanaa käyttäen. Totesin Puppet modulin toimivan kuten oli suunniteltu.

Lähteet

Honeycutt, Garrett 2010. Module ghoneycutt/apache. Puppet Forge.
http://forge.puppetlabs.com/ghoneycutt/apache

Karvinen, Tero 2012. Linux keskitetty hallinta ICT4TN011-2 kurssin kotisivu.
http://terokarvinen.com/2012/aikataulu-linuxin-keskitetty-hallinta-ict4tn011-2-puppet

Puppet Labs 2012. Docs: Type Reference.
http://docs.puppetlabs.com/references/latest/type.html

Puppet Labs 2011. Learning — Modules and Classes (Part One)
http://docs.puppetlabs.com/learning/modules1.html

Puppet Labs 2011. Docs: Learning — Resource Ordering.
http://docs.puppetlabs.com/learning/ordering.html

Sobral, Daniel 2010. Module dcsobral/users. Puppet Forge.
http://forge.puppetlabs.com/dcsobral/users

Vogeraal, Bram 2012. Module attachmentgenie/ssh. Puppet Forge.
http://forge.puppetlabs.com/attachmentgenie/ssh

About

Tätä dokumenttia saa kopioida ja muokata GNU General Public License (versio 2 tai uudempi) mukaisesti.
http://www.gnu.org/licenses/gpl.html
Pohjana Tero Karvisen Linux-kurssi, www.iki.fi/karvinen


Seuraa

Get every new post delivered to your Inbox.