Avainsanaan ‘user management’ liitetyt artikkelit

Läksy w49: Oman Puppet modulin julkaiseminen

13.12.2012

Harjoitustehtävän aiheena oli oman Puppet modulin julkaiseminen. Julkaistava moduli sisältää edellisessä harjoitustehtävässä kuvatun Puppet modulin toteutuksen mukaiset tiedostot. Nyt julkaistavaa Puppet modulia voidaan käyttää Linux käyttöjärjestelmän käyttäjienhallinnan perustehtäviin suorittamiseen Puppet Agent koneilla. Modulia voidaan myös helposti laajentaa erilaisten käyttötarpeiden mukaisesti.

Puppet moduli on ladattavissa Dropbox linkistä https://www.dropbox.com/s/1e9eiqo7alrnggw/eliimatt-usermgt-0.0.1.tar.gz

Harjoitusympäristö

Harjoitus suoritettiin 12.12.2012 opiskelijan kotona käyttäen Haaga-Helian TIKO-kannettavaa. Internet-yhteytenä oli Elisa Oyj:n tarjoama VDSL tyyppinen 100/10 mbit kiinteä laajakaistayhteys. 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.

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 modulin julkaiseminen

Palautin ensiksi edellisen harjoitustehtävän yhteydessä käytetyt tiedostot tekemistäni varmuuskopioista Xubuntu live-cd:n käyttäjän xubuntu kotihakemistoon. Kirjoitin modulille tekstimuotoisen README tiedoston käyttäen edellisen harjoitustehtävä tekstejä pohjana. Nimesin modulin hakemiston Puppet Forge tyylillä tekijä-moduli_nimi-versio_numero. Modulin eliimatt-usermgt-0.0.1 julkaisuhakemiston rakenne on seuraava:

├── eliimatt-usermgt-0.0.1
│   ├── files
│   │   ├── bash_aliases
│   │   └── profile
│   ├── lib
│   │   └── puppet
│   │       └── parser
│   │           └── functions
│   │               └── hashpw.rb
│   ├── manifests
│   │   ├── change_password.pp
│   │   ├── create_user.pp
│   │   ├── remove_user.pp
│   │   └── setup_etcskel.pp
│   └── README

Pakkasin modulin hakemiston tar ohjelmalla komennolla:

$ tar czvf eliimatt-usermgt-0.0.1.tar.gz eliimatt-usermgt-0.0.1/

Tein itselleni Dropbox tilin ja siirsin modulipaketin Dropbox hakemistoon. Otin Dropbox linkin talteen ja lisäsin sen tähän blogikirjoitukseen. Modulin kehittämisessä käytetyt lähteet esitetään vielä kertauksena.

Puppet modulin asennusohjeet

Pura modulin asennuspaketti Puppet Master koneella hakemistoon /etc/puppet/modules ja muuta hakemiston nimi muotoon usermgt komennolla:

$ mv eliimatt-usermgt-0.0.1/ usermgt

Modulia suositellaan käytettäviksi tiedostojen /etc/puppet/manifests/site.pp ja /etc/puppet/manifests/nodes.pp avulla. Näiden tiedostojen käyttämisestä
on esimerkki edellisessä harjoitustehtävässä.

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 w48: Oman Puppet modulin toteuttaminen.
http://eliimatt.wordpress.com/2012/12/05/laksy-w48-oman-puppet-modulin-toteuttaminen/

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

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/

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 w48: Oman Puppet modulin toteuttaminen

5.12.2012

Harjoitustehtävän aiheena oli oman Puppet modulin toteuttaminen. Moduli toteutettiin edellisen harjoitustehtävän suunnitelman mukaisesti. Toteutettua Puppet modulia voidaan käyttää Linux käyttöjärjestelmän käyttäjienhallinnan perustehtäviin suorittamiseen orjakoneilla. Modulia voidaan myös helposti laajentaa erilaisten käyttötarpeiden mukaisesti.

Harjoitusympäristö

Harjoitusta suoritettiin 4.12. – 5.12.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 toteutus

Toteutin oman Puppet modulin, jolla voidaan suorittaa Linux käyttöjärjestelmän käyttäjähallinnan perustehtäviä Puppet Agent koneilla. Modulin ominaisuuksiin kuuluvat uusien käyttäjien luominen, käyttäjäprofiilin tiedostojen ja hakemiston hallinta,  käyttäjien salasanojen ylläpitäminen sekä käyttäjäprofiileihin kopioitavien oletustiedostojen syöttämisen /etc/skel hakemistoon. Puppet modulini perustuu  määriteltyjen tyyppien hyödyntämiseen käyttäjähallinnan tehtävien suorittamiseksi. Modulissa ei ole init.pp lähtökohtaa ja kaikki modulin osat toimivat itsenäisesti.

Puppet modulini nimi on usermgt.  Modulin rakenne /etc/puppet/modules hakemistossa Puppet Master koneella on seuraavanlainen:


xubuntu@xubuntu:/etc/puppet/modules/usermgt$ tree
.
├── files  
|   ├── bash_aliases
|   └── profile
├── lib
│   └── puppet
│       └── parser
│           └── functions
│               └── hashpw.rb
└── manifests
    ├── change_password.pp
    ├── create_user.pp
    ├── remove_user.pp
    └── setup_etcskel.pp

6 directories, 7 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
profile profile tiedosto, joka kopioidaan orjakoneen käyttäjän kotihakemistoon tiedostoon .profile
hashpw.rb Omatekoinen Ruby funktio hashpw, joka generoi selväkielisestä salasanasta SHA-512 tiivisteen, joka on sopii Linux käyttöjärjestelmän salasanatiivisteeksi
create_user.pp Määritelty tyyppi usermgt::create_user, jolla luodaan käyttäjä orjakoneelle uusi käyttäjä
setup_etcskel.pp Luokka usermgt::setup_etcskel, jolla kopioidaan käyttäjän oletusasetustiedostot orjakoneen /etc/skel hakemistoon
change_password.pp Määritelty tyyppi usermgt::change_password, jolla vaihdetaan orjakoneen käyttäjän salasana. Uusi salasana voidaan antaa joko selväkielisenä tai SHA-512 tiivisteenä
remove_user.pp Määritelty tyyppi usermgt::remove_user, jolla poistetaan orjakoneen käyttäjä. Samalla voidaan poistaa myös käyttäjän kotihakemisto.

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 files/profile sisältö, johon on lisätty umask 077 eli käyttäjän luomat tiedostoihin annetaan oikeudet vain käyttäjälle itselleen:


# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.

umask 077

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Tiedoston lib/puppet/parser/functions/hashpw.rb sisältö. Salasanatiivisteen generointi koodi on lainattu Jude Pereiran ja Felipe Ortegan  julkaisemista esimerkkikoodeista:

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/create_user.pp sisältö:


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

    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,
    }

    if $secure_homedir == true {

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

         file { "/home/${username}/.profile":
               mode => 700,
               owner   => $username,
               group   => $username,      
               source  => "puppet:///modules/usermgt/profile",
               require => File["/home/${username}"],
         }

    }
}

Tiedoston manifests/setup_etcskel.pp sisältö:

class usermgt::setup_etcskel {

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

Tiedoston manifests/change_password.pp sisältö:

define usermgt::set_password($username = $title,$passwordtype = 'cleartext',$password) {

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

    user { $username:
      ensure     => present,
      password   => $shadowpw,
      require    => Group["$username"],
    }

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

}

Tiedoston manifests/remove_user.pp sisältö:

define usermgt::remove_user($username = $title, $remove_home_dir=false) {

    if $remove_home_dir == true {

        file { "/home/${username}":
                ensure  => absent,
                recurse => true,
                force   => true,
        }
    }

    user { $username:
      ensure     => absent,
    }

    group { "$username":
        ensure    => absent,
    }

}

Modulin toiminnan kuvaus

Määritelty tyyppi usermgt::create_user lisää uuden käyttäjän orjakoneelle. Samalla luodaan käyttäjänimeä vastaava ryhmä. Käyttäjän salasana generoidaan selväkielisestä merkkijonosta tai käytetään valmista SHA-512 tiivistettä parametrin password_type mukaisesti. Käyttäjän kotihakemiston ja sen tiedostojen oikeudet voidaan rajoittaa vain käyttäjälle itselleen parametrilla secure_homedir.
Parametrit: name = käyttäjänimi, shell = komentotulkin polku, password_type = cleartext | hash, password = selväkielinen salasana tai SHA-512 tiiviste, secure_homedir= true | false

Omatekoinen funktio hashpw generoi selväkielisestä merkkijonosta salasanojen tallentamiseen Linuxissa yleiseti käytetyn SHA-512 tiivisteen. Parametrit: selväkielinen merkkijono. Palautusarvo: SHA-512 tiiviste merkkijonona

Luokka usermgt::setup_etcskel siirtää Puppet modulin tiedostoresursseista käyttäprofiilin oletustiedostoja orjakoneen /etc/skel hakemistoon. Moduli siirtää tällä hetkellä vain tiedoston .bash_aliases orjakoneelle, mutta siihen voidaan helposti lisätä uusia tiedostoja. Luokalla ei ole parametreja.

Määritelty tyyppi usermgt::change_password vaihtaa käyttäjän salasana orjakoneelle. Käyttäjän uusi salasana generoidaan selväkielisestä merkkijonosta tai käytetään valmista SHA-512 tiivistettä parametrin password_type mukaisesti.
Parametrit: name = käyttäjänimi, password_type = cleartext | hash, password = selväkielinen salasana tai SHA-512 tiiviste

Määritelty tyyppi usermgt::remove_user poistaa käyttäjän orjakoneelle. Samalla poistetaan käyttäjänimeä vastaava ryhmä. Käyttäjän kotihakemiston ja sen tiedostot voidaan samalla poistaa asettamalla parametri remove_homedir.
Parametrit: name = käyttäjänimi, remove_homedir= true | false

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.101) ja orjakoneen eino-ThinkPad-R60.local (IP-osoite 192.168.100.100).

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 testaaminen orjakoneella käyttäen nodes.pp konfiguraatiota

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

Tiedoston /etc/puppet/manifests/site.pp sisältö:

import "nodes"

Tiedoston /etc/puppet/manifests/nodes.pp sisältö:

node default {

}

node manageusers {

        require usermgt::setup_etcskel
}

node 'eino-thinkpad-r60' inherits manageusers {

       usermgt::create_user{"testuser1":
            password => 'x0WaR2Id5Ows',
            secure_homedir => true,
       }

}

Tiedostossa nodes.pp luotiin orjakoneella eino-thinkpad-r60.local uusi käyttäjä testuser1, jolle määriteltiin salasana sekä kotihakemiston tiedosto-oikeudet rajoitettiin vain käyttäjälle itselleen. Lisäksi orjakoneen /etc/skel hakemistoon siirrettiin tiedosto .bash_aliases, joka kopioituu automaattisesti kaikille orjakoneella luotaville käyttäjille.

Käynnistin Puppet palvelun uudelleen orjakoneella komennolla:


$ sudo service puppet restart
* Restarting puppet agent                                               [ OK ] 

Tutkin orjakoneen /home kansion sisältöä komennolla:


$ ls -l /home/ | grep testuser
drwx------  2 testuser1 testuser1 4096 joulu  5 23:47 testuser1

Puppet moduli oli onnistuneesti luonut käyttäjän testuser1 ja kotihakemiston. Tutkin käyttäjän testuser1 kotihakemiston sisältöä komennolla:


$ sudo ls -lA /home/testuser1
total 24
-rwx------ 1 testuser1 testuser1  195 joulu  4 22:21 .bash_aliases
-rwx------ 1 testuser1 testuser1  220 huhti  3  2012 .bash_logout
-rwx------ 1 testuser1 testuser1 3486 huhti  3  2012 .bashrc
-rwx------ 1 testuser1 testuser1  674 joulu  5 23:47 .profile
-rwx------ 1 testuser1 testuser1 1601 helmi  4  2012 .Xdefaults
-rwx------ 1 testuser1 testuser1   14 marra 19  2011 .xscreensaver

Käyttäjän testuser1 tiedostojen oikeudet oli määritelty Puppet modulin mukaan, niin että vain käyttäjälle oli täydet oikeudet tiedostoihin. Tutkin tiedoston /home/testuser1/.bash_aliases sisältöä komennolla:


$ sudo cat /home/testuser1/.bash_aliases
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 .bash_aliases sisältö oli Puppet modulin määritysten mukainen. Testasin myös SSH kirjautumista käyttäjänä testuser1 komennolla:


$ ssh testuser1@localhost
testuser1@localhost's password: 
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-31-generic i686)

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

155 packages can be updated.
74 updates are security updates.

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.

testuser1@eino-ThinkPad-R60:~$ 

Käyttäjänä testuser1 kirjautuminen onnistui Puppetilla määritellyllä salasanalla. Totesin Puppet modulin toimivan kuten oli suunniteltu.

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

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/

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 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 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.