Arkisto marraskuu 2012

Läksy w47: Oman Puppet modulin suunnitteleminen ja nodes.pp:n kokeileminen

29.11.2012

Harjoitustehtävän aiheena oli oman Puppet modulin suunniteleminen ja nodes.pp:n kokeileminen Käytännön harjoituksena tehtiin testiversioita oman Puppet ominaisuuksist sekä kokeiltiin nodes.pp:tä kahden tietokoneen Puppet Master/Agent testiympäristössä.

Harjoitusympäristö

Harjoitusta suoritettiin 29.11.2012 opiskelijan kotona käyttäen 1 henkilökohtaista tietokonetta ja 1 Haaga-Helian TIKO-kannettavaa. Internet-yhteytenä oli Elisa Oyj:n tarjoama VDSL tyyppinen 100/10 mbit kiinteä laajakaistayhteys. Harjoituksessa käytettiin Lenovo R60 kannettavaa tietokonetta ja sen kiintolevylle asennettua Xubuntu 12.04  32-bittistä Linux käyttöjärjestelmää. Haaga-Helian TIKO-kannettavan 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. Tietokoneet olivat kytkettyinä VDSL modeemin reitittimeen ja ne olivat samassa lähiverkossa 192.168.100.0/24.

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

Haaga-Helian TIKO-kannettava HP EliteBook 2560p kokoonpano:

  • Suoritin:Intel Core i5-2450M @2.50GHz
  • Keskusmuisti: 8 Gt DDR3
  • Kiintolevy: 500 Gt SATA300 7200rpm
  • Käyttöjärjestelmä: Windows 7 Professional 64-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.

Oman Puppet modulin suunnittelu

Valitsin oman Puppet modulin aiheeksi käyttäjien hallinnan Puppet Agent koneilla. Modulin ominaisuuksiin suunnittelin käyttäjien luomisen, käyttäjäprofiilin tiedostojen ja hakemiston hallinnan, salasanojen ylläpitämisen sekä käyttäjien oletusasetusten syöttämisen /etc/skel hakemistoon. Olin tehnyt aikaisemmissa kotitehtävissä käyttäjien hallintaan liittyviä Puppet moduleja ja ajattelin hyödyntää niitä oman Puppet modulin suunnittelussa. Olin myös tutustunut valmiisiin käyttäjien hallintaan tarkoitettuihin Puppet moduleihin ja niistä erityisesti Daniel Sobralin dscobral/users moduli vaikutti parhaimmalta toteutukselta.

Annoin modulille työnimen usermgt. Suunniteltu modulin rakenne /etc/puppet/modules hakemistossa Puppet Master koneella:


xubuntu@xubuntu:/etc/puppet/modules/usermgt$ tree
.
├── files
│   └── bash_aliases
├── lib
│   └── puppet
│       └── parser
│           └── functions
│               └── hashpw.rb
└── manifests
    ├── account.pp
    ├── etcskel.pp
    └── init.pp

6 directories, 5 files

Kuvaus modulin tiedostoista:

Tiedostonimi Lyhyt kuvaus tiedostosta ja sen käyttötarkoituksesta
bash_aliases Bash komentotulkin aliases määritykset, jotka kopioidaan orjakoneen tiedostoon /etc/skel/.bash_aliases
hashpw.rb Omatekoinen Ruby funktio hashpw, joka generoi selväkielisestä salasanasta SHA-512 tiivisteen, joka on sopii Linux käyttöjärjestelmän salasanatiivisteeksi
account.pp Määritelty tyyppi usermgt::account, jolla luodaan käyttäjä orjakoneelle uusi käyttäjä
etcskel.pp Luokka usermgt::etcskel, jolla kopioidaan käyttäjän oletusasetustiedostot orjakoneen /etc/skel hakemistoon
init.pp Modulin tulokohta, sisältää vain tyhjän luokan usermgt

Tiedoston files/bash_aliases sisältö, joka on lainattu Advanced Bash-Scripting Guide dokumentin osasta Appendix M Sample .bashrc and .bash_profile Files:


alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# -> Prevents accidentally clobbering files.
alias mkdir='mkdir -p'

alias h='history'
alias j='jobs -l'
alias which='type -a'
alias ..='cd ..'

Tiedoston lib/puppet/parser/functions/hashpw.rb sisältö:

module Puppet::Parser::Functions
  newfunction(:hashpw, :type => :rvalue) do |args|
    passwd = args[0]
    hashtype = '$6$'
    salt = rand(36**8).to_s(36)
    hash = passwd.crypt(hashtype + salt)
  end 
end

Tiedoston manifests/account.pp sisältö:


define usermgt::account($username = $title,$shell = '/bin/bash',$passwordtype='cleartext',$password) {

    if $passwordtype == 'cleartext' {
        $shadowpw = hashpw($password)
    }
    elsif $passwordtype ='hash' {
        $shadowpw = $password
    }

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

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

}

Tiedoston manifests/etcskel.pp sisältö:


class usermgt::etcskel {

    file { "/etc/skel/.bash_aliases":
        mode => 0755,
        owner   => root,
        group   => root,
        source => ["puppet:///modules/usermgt/bash_aliases"],
    }
}

Tiedoston manifests/init.pp sisältö:


class usermgt  {

}

Puppet Master/Agent testiympäristön pystyttäminen

Testasin oma moduliani Puppet Master/Agent testiympäristössä, jossa Haaga-Helian TIKO-kannettava oli Puppet Master koneena ja Lenovo R 60 kannettava tietokone oli orjakoneena. Käytin koneiden .local nimiä Avahi palvelun kautta. Puppet Master koneen nimi oli xubuntu.local (IP-osoite 192.168.100.100) ja orjakoneen eino-ThinkPad-R60.local (IP-osoite 192.168.100.101).

Asensin Puppet Master palvelun xubuntu.local koneelle komennolla:

$ sudo apt-get install puppetmaster

Poistin vanhan SSL-sertfikaatin Puppet Master koneelle komennoilla:

$ sudo service puppetmaster stop
$ sudo rm -r /var/lib/puppet/ssl

Muokkasin Puppet Masterin asetuksiin xubuntu.local koneen nimen:

$ sudo nano /etc/puppet/puppet.conf

Lisäsin [master] lohkon sisään rivin:

dns_alt_names = puppet, xubuntu.local, puppet.xubuntu.local

Käynnistin Puppet Master palvelun uudelleen komennolla:

$ sudo service puppetmaster start

Tarkistin uuden SSL-sertifikaatin komennoilla:

xubuntu$ sudo ls /var/lib/puppet/ssl/certs/
ca.pem	xubuntu.pem
xubuntugt$ sudo openssl x509 -in /var/lib/puppet/ssl/certs/xubuntu.pem  -text | grep -i dns
DNS:puppet, DNS:puppet.xubuntu.local, DNS:xubuntu, DNS:xubuntu.local

Asensin Puppetin orjakoneelle komennolla:

$ sudo apt-get install puppetmaster

Muokkasin Puppetin asetuksiin Puppet Master koneen xubuntu.local nimen:

$ sudo nano /etc/puppet/puppet.conf

Lisäsin [agent] lohkon sisään rivin:

server = xubuntu.local

Muokkasin Puppetin oletusasetuksia tiedostossa /etc/default/puppet.conf:

$ sudo nano /etc/default/puppet.conf

Muutin seuraavan rivin:

START=yes

Käynnistin Puppet palvelun uudelleen orjakoneella komennolla:

$ sudo service puppet restart

Allekirjoitin orjakoneen sertifikaatin Puppet Master koneella komennoilla:

xubuntu@xubuntu:/etc/puppet/modules/usermgt$ sudo puppet cert --list
  "eino-thinkpad-r60" (51:92:00:89:8B:2D:B7:1C:27:97:0F:43:F6:99:66:CB)
xubuntu@xubuntu:/etc/puppet/modules/usermgt$ sudo puppet cert --sign eino-thinkpad-r60
notice: Signed certificate request for eino-thinkpad-r60
notice: Removing file Puppet::SSL::CertificateRequest eino-thinkpad-r60 at '/var/lib/puppet/ssl/ca/requests/eino-thinkpad-r60.pem'

Oman modulin työversion kokeileminen nodes.pp konfiguraatiolla

Loin Puppet Master koneelle tiedostot /etc/puppet/manifests/site.pp ja /etc/puppet/manifests/nodes.pp, joilla orjakoneella ajettavat asetukset määritellään.
Tiedoston site.pp sisältö:

import "nodes"

Tiedoston nodes.pp sisältö:

node default {

}

node manageusers {
	include usermgt
        include usermgt::etcskel
}

node 'eino-thinkpad-r60' inherits manageusers {

       usermgt::account{"testuser1":
            password => 'x0WaR2Id5Ows',
       }
}

Käynnistin Puppet palvelun uudelleen orjakoneella komennolla:


$ sudo service puppet restart

Uuden käyttäjän luominen orjakoneelle ei kuitenkaan onnistunut. Puppet moduli vaatii lisäkehitystyötä, jotta toiminta voitaisiin korjata.

Lähteet

Cooper, M. 2012. Advanced Bash-Scripting Guide. Appendix M. Sample .bashrc and .bash_profile Files.
http://tldp.org/LDP/abs/html/sample-bashrc.html

Finninday.net 2011. Zero to puppet in one day. Puppet master configs.
http://finninday.net/wiki/index.php/Zero_to_puppet_in_one_day#Puppet_master_configs

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

Karvinen, Tero 2012b. PuppetMaster on Ubuntu 12.04.
http://terokarvinen.com/2012/puppetmaster-on-ubuntu-12-04

Liimatta, Eino 2012. Läksy w45: Muotit, parametrisoidut luokat ja määritellyt tyypit.
http://eliimatt.wordpress.com/2012/11/15/laksy-w45-muotit-parametrisoidut-luokat-ja-maaritellyt-tyypit

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

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

Läksy w46: Valmiin Puppet modulin käyttäminen ja Puppet Cookbook

22.11.2012

Harjoitustehtävän aiheena oli tutustua Puppet Forgesta tai GitHubista saataviin valmiisiin Puppet moduleihin sekä Puppet Cookbook ohjekokoelmaan. Käytännön harjoituksena analysoitiin valmista Puppet modulia sekä tehtiin lyhyitä Puppet ohjelmia edellä mainitun Puppet Cookbook dokumentaation teemoista.

Harjoitusympäristö

Harjoitusta suoritettiin 22.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.about:config

Valmiin Puppet modulin käyttäminen

Aluksin tein hakemiston puppet ja sen alihakemiston modules:

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

Valitsin tutkittavaksi Puppet moduliksi GitHubista saatavan R.I. Pieenarin kehittämän puppet-concat modulin, jolla voidaan koota tekstimuotoisia konfiguraatiotiedostoja pienemmistä osatiedostoista. Osatiedostoja säilytetään modulin työhakemistossa ja ne voidaan numeroida kokoamisjärjestyksen mukaisesti. Osatiedostojen numerointikäytäntö vastaa /etc hakemiston asetustiedostoissa yleisesti käytettyä mallia. jossa tiedostonimen alkuun lisätty numero kuvaa tiedoston lukemisen prioriteettijärjestystä. Pienempi numero merkitsee suurempaa prioriteettia. Latasin modulin ZIP pakettina ja purin hakemistoon $HOME/puppet/modules. Modulin rakenne oli seuraavanlainen:

xubuntu@xubuntu:~/puppet/modules/concat$ tree
.
├── CHANGELOG
├── files
│   ├── concatfragments.sh
│   └── null
├── lib
│   └── facter
│       └── concat_basedir.rb
├── LICENSE
├── manifests
│   ├── fragment.pp
│   ├── init.pp
│   └── setup.pp
├── Modulefile
├── Rakefile
├── README.markdown
└── spec
    ├── defines
    │   └── init_spec.rb
    ├── fixtures
    │   └── manifests
    │       └── site.pp
    └── spec_helper.rb

9 directories, 13 files

Modulissa käytetyt tiedostot:

Tiedostonimi Lyhyt kuvaus tiedostosta ja sen käyttötarkoituksesta
concatfragments.sh Shell skripti, jota käytetään kokoamaan tekstimuotoinen konfiguraatiotiedosto alihakemistossa olevista lyhyistä numeroidusta osista. Skriptille voidaan antaa parametriksi erilaisia komentolippuja
concat_basedir.rb Kustomoitu Puppet fact, joka palauttaa modulin väliaikaistiedostojen hakemistopolun, joka on Puppetin työhakemisto vardir/concat
fragment.pp Puppet modulin määritelty tyyppi concat::fragment, joka kopioi määritellyn konfiguraatiotiedoston osatiedostot modulin työhakemistoon
init.pp Puppet modulin tulokohta, jossa kuvataan konfiguraatiotiedostojen kokoamiseen käytettävä määritelty tyyyppi concat.
setup.pp Puppet modulin apuluokka concat::setup, jossa asetetaan modulin tarvitsemia resursseja. Käyttää kustomoitua Fact funktiota concat_basedir työhakemiston määritykseen ja asentaa shell skriptin concatfragments.sh modulin työhakemistoon
Modulefile Puppet modulin DSL kuvaus
Rakefile Puppet modulin RSpec testien ohjaustiedosto
Licence Puppet modulin lisenssi, joka Apache Licence v2.0
Changelog Puppet modulin muutoshistoria
README.markdown Puppet modulin lyhyt esittely, joka on kirjoitettu markdown työkalun formaatissa
init_spec.rb Puppet modulin RSpec testitiedosto
site.pp Tyhjä site.pp RSpec testejä varten
site.pp Tyhjä site.pp RSpec testejä varten
spec_helper.rb spec_helper työkalu RSPec testejä varten

Testasin puppet-concat modulia tekemällä sitä käyttävän testconcat modulin, joka kokoaa kahdesta osasta tiedoston /tmp/testfile.txt. Modulin rakenne oli seuraava:

xubuntu@xubuntu:~/puppet/modules/testconcat$ tree
.
└── manifests
    └── init.pp

1 directory, 1 file

Tiedoston init.pp sisältö:

class testconcat {
  
  include concat::setup
  
  concat{"/tmp/testfile.txt":

  }

  concat::fragment{"file_fragment_1":
    target  => "/tmp/testfile.txt",
    order   => 10,
    content => "\nThis is the first fragment of this file\n",
  }
  concat::fragment{"file_fragment_2":
    target  => "/tmp/testfile.txt",
    order   => 12,
    content => "\nThis is the second fragment of this file\n",

  }

}

Modulin testaaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include testconcat'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Testconcat/Concat[/tmp/testfile.txt]/File[/tmp/testfile.txt]/ensure: defined content as '{md5}540b3047e9d90d715b20045e724653c3'
notice: Finished catalog run in 0.28 seconds

Tiedoston /tmp/testfile.txt sisältö:

xubuntu@xubuntu:~/puppet$ cat /tmp/testfile.txt 

This is the first fragment of this file

This is the second fragment of this file

Osatiedostot modulin työhakemistossa:

xubuntu@xubuntu:~/puppet$ sudo tree /var/lib/puppet/concat
/var/lib/puppet/concat
├── bin
│   └── concatfragments.sh
└── _tmp_testfile.txt
    ├── fragments
    │   ├── 10_file_fragment_1
    │   └── 12_file_fragment_2
    ├── fragments.concat
    └── fragments.concat.out

3 directories, 5 files

Modulille ei löytynyt kunnollista vertailukohdetta, koska suurimmaksi osaksi kaikki GitHubin vastaavat Puppet modulit olivat tämän modulin fork-versioita. Modulin tekninen toteutus on korkeatasoinen ja toteutuksessa on otettu monipuolisesti erilaisia käyttötapauksia huomioon. Modulin rakenne on modulaarinen ja toimiva.

Puppet Cookbook dokumentaation käyttäminen modulien kirjoittamisessa

Tein Puppet modulin, jossa käytettiin kahta Puppet Cookbook dokumentaation ohjetta Create a directory tree ja Only manage absent files. Moduli tekee oman hakemistopuun /tmp hakemistoon ja luo tiedoston, joka ei ole Puppetin ylläpidettävänä. Modulin rakenne on seuraava:

xubuntu@xubuntu:~/puppet/modules/testdir$ tree
.
└── manifests
    └── init.pp

1 directory, 1 file

Tiedoston init.pp sisältö:

class testdir {

   file { [ "/tmp/testdir", "/tmp/testdir/node1",
         "/tmp/testdir/node2", "/tmp/testdir/node2/docs" ]:

        ensure => "directory",
        mode   => 750,
        recurse => true,
        owner => 'xubuntu',
        group => 'xubuntu',

   }

   file { "/tmp/testdir/node2/unmaintained.txt":

        replace => "no",
        ensure  => "present",
        owner => 'xubuntu',
        group => 'xubuntu',
        content => "This file is not maintained by Puppet\n",
        require => File['/tmp/testdir/node2'],

    }
}

Modulin testaaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include testdir'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Testdir/File[/tmp/testdir]/ensure: created
notice: /Stage[main]/Testdir/File[/tmp/testdir/node2]/ensure: created
notice: /Stage[main]/Testdir/File[/tmp/testdir/node1]/ensure: created
notice: /Stage[main]/Testdir/File[/tmp/testdir/node2/docs]/ensure: created
notice: /Stage[main]/Testdir/File[/tmp/testdir/node2/unmaintained.txt]/ensure: created
notice: Finished catalog run in 0.09 seconds

Hakemisto puu /tmp/testdir:

xubuntu@xubuntu:~/puppet$ tree /tmp/testdir
/tmp/testdir
├── node1
└── node2
    ├── docs
    └── unmaintained.txt

3 directories, 1 file

Tiedoston /tmp/node2/unmaintained.txt muuttaminen:

xubuntu@xubuntu:~/puppet$ cat /tmp/testdir/node2/unmaintained.txt 
This file is not maintained by Puppet
xubuntu@xubuntu:~/puppet$ echo "Making local changes to file" > /tmp/testdir/node2/unmaintained.txt 
xubuntu@xubuntu:~/puppet$ cat /tmp/testdir/node2/unmaintained.txt 
Making local changes to file
xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include testdir'
warning: Could not retrieve fact fqdn
notice: Finished catalog run in 0.20 seconds
xubuntu@xubuntu:~/puppet$ cat /tmp/testdir/node2/unmaintained.txt 
Making local changes to file

Lähteet

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

Pienaar, R.I. 2012. ripienaar/puppet-concat. GitHub.
https://github.com/ripienaar/puppet-concat

Puppet Labs 2011. Docs: Publishing Modules on the Puppet Forge.
http://docs.puppetlabs.com/puppet/2.7/reference/modules_publishing.html

Sharpe, Tim 2012. rspec-puppet
http://rspec-puppet.com/

Soimasysadmin 2012. Simple facts with Puppet.
http://soimasysadmin.wordpress.com/2012/09/12/simple-facts-with-puppet/

Wilson, Dean 2011. Puppet Cookbook.
http://www.puppetcookbook.com/

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

Linux keskitty hallinta kurssilla 9.11.2012 tehty template tiedostoa käyttävä Puppet moduli

16.11.2012

Moduli käyttää template tiedostoa, joka käytetään pohjana /tmp/templatetest.txt tiedostolle.

Modulin rakenne:

xubuntu@xubuntu:~/puppet/modules$ tree
.
└── templatetest
    ├── manifests
    │   └── init.pp
    └── templates
        └── templatetest.txt.erb

Modulin init.pp tiedoston sisältö:

class templatetest {
   $banner= "---------------------"

  file { '/tmp/templatetest.txt':
    ensure => file,
    content => template('templatetest/templatetest.txt.erb'), 
  }
}

Tiedoston templatetest.txt.erb sisältö:

Testing Puppet templates
<%=banner %>
System uptime is <%= @uptime%>
<%=DateTime.now.strftime('%D %R') %>

Modulin suorittaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include templatetest'

Modulin testaaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include templatetest'
notice: /Stage[main]/Templatetest/File[/tmp/templatetest.txt]/ensure: defined content as '{md5}86f01e6e2ab88b5e6fb152eb0816bc3f'
notice: Finished catalog run in 0.02 seconds

Tiedoston /tmp/template.txt sisältö:

Testing Puppet templates
---------------------
System uptime is 1:19 hours
11/16/12 09:31
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

Läksy w45: Muotit, parametrisoidut luokat ja määritellyt tyypit

15.11.2012

Harjoitustehtävän aiheena oli tutustua Puppet palvelinautomaatio järjestelmän Learning Pupppet dokumentaation lukuihin Templates, Parameterized Classes (Modules, Part Two) ja Defined Types sekä awaseroot blogiin. Käytännön harjoituksena tehtiin lyhyitä Puppet ohjelmia edellä mainitun dokumentaation teemoista.

Harjoitusympäristö

Harjoitusta suoritettiin 15.11. 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.

Muottien (templates) käyttäminen Puppet modulissa

Aluksin tein hakemiston puppet ja sen alihakemiston modules:

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

Kokeillakseni templates ominaisuuden käyttöä Puppetissa tein modulin, joka kirjoittaa tekstitiedostoon tietoja järjestelmästä käyttäen template pohjaa ja Facterin tietoja. Tein modules hakemistoon alihakemiston sysinfo Puppet modulia varten.

Modulin rakenne:

xubuntu@xubuntu:~/puppet/modules/sysinfo$ tree
.
├── manifests
│   └── init.pp
└── templates
    └── sysinfo.txt.erb

2 directories, 2 files

Modulin init.pp tiedoston sisältö:

class sysinfo {
  $banner= "\nSystem information\n---------------------\n"

  file { '/tmp/sysinfo.txt':
    ensure => file,
    content => template('sysinfo/sysinfo.txt.erb'), 
  }
}

Tiedoston sysinfo.txt.erb sisältö:

<%=banner %>
Current time is <%=DateTime.now.strftime('%D %R') %>
System uptime is <%= @uptime%>

System architecture: <%= @architecture%>
Computer manufacurer: <%= @manufacturer%>
Computer model: <%= @productname%>
Computer serialnumber: <%= @serialnumber%>

Total memory: <%= @memorytotal%>

Modulin suorittaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include sysinfo'

Modulin testaaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include sysinfo'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Sysinfo/File[/tmp/sysinfo.txt]/ensure: defined content as '{md5}97d638409b07e5c232298ec3b025efac'
notice: Finished catalog run in 0.06 seconds

Modulin tekemän raporttitiedoston /tmp/sysinfo.txt sisältö:

xubuntu@xubuntu:~/puppet$ cat /tmp/sysinfo.txt 

System information
---------------------

Current time is 11/15/12 18:52
System uptime is 1:39 hours

System architecture: i386
Computer manufacurer: LENOVO
Computer model: 9461DXG
Computer serialnumber: L3BC786

Total memory: 2.95 GB

Parametrisoitujen luokkien käyttäminen Puppet modulissa

Kokeillakseni parametrisoitujen luokkien käyttöä Puppetissa, tein SSH palvelimen asentavan modulin, jolle voidaan antaa parametriksi SSH porttinumero sekä SSH paketin sekä palvelun tila. Oletusarvoisesti SSH portti on 22, SSH paketti on asennettuna ja SSH taustaprosessi on käynnissä.Tein modules hakemistoon alihakemiston sshport Puppet modulia varten.

Modulin rakenne:

xubuntu@xubuntu:~/puppet/modules/sshport$ tree
.
└── manifests
    └── init.pp

1 directory, 1 file

Modulin init.pp tiedoston sisältö:

class sshport ($port='22', $enable = true, $ensure = running) {

  package { 'openssh-server':
    ensure => present,
     allowcdrom => true,
  }

  file { '/etc/ssh/sshd_config':
    ensure => file,
    require => Package['openssh-server'],
  }

  augeas{"set_port":
    context => "/files/etc/ssh/sshd_config",
    changes => "set Port $port",
    require => File['etc/ssh/sshd_config'],
   }

  service { 'ssh':
    ensure    => $running,
    enable    => $enable,
    hasstatus => true,
    subscribe => [Package['openssh-server'], File['/etc/ssh/sshd_config']],
    require   => File['/etc/ssh/sshd_config'],
  }
}

Modulin suorittaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include sshport'

Modulin testaaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include sshport'
warning: Could not retrieve fact fqdn
notice: /Stage[main]/Sshport/Package[openssh-server]/ensure: ensure changed 'purged' to 'present'
notice: /Stage[main]/Sshport/Service[ssh]/enable: enable changed 'false' to 'true'
notice: /Stage[main]/Sshport/Service[ssh]: Triggered 'refresh' from 1 events
notice: Finished catalog run in 21.38 seconds

Oletuksena avattu ssh portti netstat listauksessa:

xubuntu@xubuntu:~/puppet/modules/sshport$ netstat -l -t -n
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:34264         0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN 

SSH yhteyden kokeileminen:

xubuntu@xubuntu:~/puppet/modules/sshport$ ssh xubuntu@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is dc:25:50:0c:e1:01:0e:01:d6:2d:e2:d6:68:fc:c9:79.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
xubuntu@localhost's password: 
Permission denied, please try again.
xubuntu@localhost's password:

Määriteltyjen tyyppien käyttäminen Puppet modulissa

Kokeillakseni määriteltyjen tyypppien käyttöä Puppetissa, tein uuden version aikaisemman harjoitustehtävän uusien  käyttäjätunnuksen luomiseen tarkoitetusta Puppet modulista. Uusi versio käyttää määriteltyä tyypppiä human::account, jolla voidaan luoda uusi käyttäjätunnus ja parametriksi voidaan antaa haluttu komentotulkki ja selväkielinen salasana. Salasanasta luodaan omatekoisella funktiolla hashpw Linuxin /etc/shadow tiedoston formaattiin sopiva SHA-512 tiiviste. Tein modules hakemistoon alihakemiston human Puppet modulia varten.

Modulin rakenne:

xubuntu@xubuntu:~/puppet/modules/human$ tree
.
├── lib
│   └── puppet
│       └── parser
│           └── functions
│               └── hashpw.rb
└── manifests
    ├── account.pp
    └── init.pp

5 directories, 3 files

Modulin hashpw.rb tiedoston sisältö:

module Puppet::Parser::Functions
  newfunction(:hashpw, :type => :rvalue) do |args|
    passwd = args[0]
    hashtype = '$6$'
    salt = rand(36**8).to_s(36)
    hash = passwd.crypt(hashtype + salt)
  end 
end

Modulin init.pp tiedoston sisältö:

class human  {

  human::account { 'humanuser1':
     shell => '/bin/zsh',
  } 

}

Modulin account.pp tiedoston sisältö:

define human::account($shell = '/bin/bash',$password='pA$$w0rd') {
    $username = $title
    $shadowpw = hashpw($password)
    user { $username:
      ensure     => present,
      gid        => $username,
      shell      => $shell,
      password   => $shadowpw,
      home       => "/home/${username}",
      managehome => true,
      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}"],
    }

}

Modulin suorittaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include human'

Modulin testaaminen:

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

Testikäyttäjän “humanuser1″ salasanatiiviste /etc/shadow tiedostossa:

humanuser1:$6$vicoxo86$iLh8A21dSjSRZanv9qRo.jlNp5bSK9KiMmERkMtQLoSE/fiHghD04BxevD.46pqvGRCTYdu8EDk5xVAb/ue1n0:15659:0:99999:7:::

Testikäyttäjän “humanuser1″ tiedot /etc/passwd tiedostossa:

humanuser1:x:1000:1000::/home/humanuser1:/bin/zsh

SSH yhteyden kokeileminen:

xubuntu@xubuntu:~/puppet$ ssh humanuser1@localhost
humanuser1@localhost's password: 
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic i686)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

humanuser1@xubuntu ~ % 

Mount resurssin käyttäminen Puppet modulissa

Kokeillakseni awaseroot blogissa esiteltyä Puppetin mount resurssia, tein määriteltyä tyyppiä mount resurssin yhteydessä käyttävän Puppet modulin. Tein modules hakemistoon alihakemiston mountdev Puppet modulia varten.

Modulin rakenne:

xubuntu@xubuntu:~/puppet/modules/mountdev$ tree
.
└── manifests
    ├── init.pp
    └── mounter.pp

1 directory, 2 files

Modulin init.pp tiedoston sisältö:

class mountdev  {

  mountdev::mounter { '/dev/sr0':
     mountpoint => '/cdrom'',
     fstype => 'iso9660',
     ensure => 'unmounted',
  } 

}

Modulin mounter.pp tiedoston sisältö:

define mountdev::mounter($mountpoint,$ensure,$fstype,$options="defaults") {
    mount { $mountpoint :
        device  => $title,
        fstype  => $fstype,
    ensure  => $ensure,
    options => $options,
    }
}

Modulin suorittaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include mountdev'

Modulin testaaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include mountdev'
warning: Could not retrieve fact fqdn
err: /Stage[main]/Mountdev/Mountdev::Mounter[/dev/sr0]/Mount[/cdrom]/ensure: change from ghost to unmounted failed: Execution of '/bin/umount /cdrom' returned 1: umount: /cdrom: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

notice: Finished catalog run in 0.29 seconds

Xubuntun live-cd:n unmounttaaminen ei onnistunut, koska live-cd on käytössä.

Lähteet

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

Ortega, Felipe 2012. [Puppet Users] rand losing its randomness after using fqdn_rand.
https://groups.google.com/forum/#!msg/puppet-users/kc_KJwLwHvo/FjokplF1IuoJ

Pereira, Jude 2012. Use Ruby to Generate your Shadow Password.
http://judepereira.com/blog/use-ruby-to-generate-your-shadow-password/

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

Puppet Labs 2011. Docs: Learning — Defined Types.
http://docs.puppetlabs.com/learning/definedtypes.html

Puppet Labs 2011. Docs: Learning — Parameterized Classes (Modules, Part Two).
http://docs.puppetlabs.com/learning/modules2.html

Puppet Labs 2011. Docs: Learning — Templates.
http://docs.puppetlabs.com/learning/templates.html

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

Movsesjans, Armens 2012. Puppet module for /etc/fstab mounts.
https://awaseroot.wordpress.com/2012/11/03/puppet-module-for-etcfstab-mounts/

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

Linux keskitetty hallinta kurssilla 9.11.2012 tehty SSH palvelimen asentava Puppet moduli

9.11.2012

Puppet moduli, joka asentaa SSH palvelimen. Moduli asettaa myös SSH palvelimen asetustiedoston, jossa SSH palvelun porttinumero on vaihdettu 2222:n.

Modulin perusversio

Modulin rakenne:

xubuntu@xubuntu:~/puppet/modules$ tree
.
└── sshport
    ├── files
    │   └── sshd_config
    └── manifests
        └── init.pp

3 directories, 2 files

Modulin init.pp tiedoston sisältö:

class sshport {

   package { 'openssh-server':
     ensure => present,
     allowcdrom => true,
   }

   file { '/etc/ssh/sshd_config':
     ensure => file,
     source =>"puppet:///modules/sshport/sshd_config",
     require => Package['openssh-server'],
   }

   service { 'ssh':
     ensure => running,
     enable => true,
     hasstatus => true,
     subscribe => [Package['openssh-server'], File['/etc/ssh/sshd_config']],
     require => File['/etc/ssh/sshd_config'],
   }
}

Modulin suorittaminen:
xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include sshport'

Modulin testaaminen:

xubuntu@xubuntu:~/puppet/modules/sshport$ ssh -p 2222 xubuntu@localhost xubuntu@localhost's password: 
Permission denied, please try again.

Modulin toteutus template tiedostoa käyttämällä

Vaihtoehtoinen toteutus modulista, jossa SSH palvelimen asetustiedosto luodaan käyttämällä template tiedostoa. Template tiedostossa porttimäärityksen sisältävä riville tehdään interpolaatio modulissa käytetystä muuttujasta. SSH portin numero määritetään modulissa muuttujalla $port.

Modulin rakenne:

xubuntu@xubuntu:~/puppet/modules$ tree
.
└── sshport
    ├── files
    │   └── sshd_config
    ├── manifests
    │   └── init.pp
    └── templates
        └── sshd_config.erb

Modulin init.pp tiedoston sisältö:

class sshport {

  $port='2562'

  package { 'openssh-server':
     ensure => present,
     allowcdrom => true,
  }

  file { '/etc/ssh/sshd_config':
    ensure => file,
    content => template('sshport/sshd_config.erb'),
    require => Package['openssh-server'],
  }

  service { 'ssh':
    ensure    => running,
    enable    => true,
    hasstatus => true,
    subscribe => [Package['openssh-server'], File['/etc/ssh/sshd_config']],
    require   => File['/etc/ssh/sshd_config'],
  }
}

Modulin sshd_config.erb tiedosto on samanlainen kuin normaali SSH palvelimen asetustiedosto. Poikkeuksena porttimäärityksen sisältä rivi, jossa on seuraavanlainen muuttuja interpolaatio:

Port <%= port %>

Modulin suorittaminen:

xubuntu@xubuntu:~/puppet$ sudo puppet apply --modulepath modules/ -e 'include sshport'

Modulin testaaminen:

xubuntu@xubuntu:~/puppet$ ssh -p 2562 xubuntu@localhost 
xubuntu@localhost's password: 
Permission denied, please try again.

Lähteet

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

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.