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
Avainsanat: GitHub, Puppet, Puppet Cookbook, Puppet Forge, Puppet module, Xubuntu