Puppeteers Blog

Puppet-pohjaisten asennusohjelmien luonti Kafolla

November 30, 2017 

Puppet on erittäin kätevä erityisesti hyvin monimutkaisten järjestelmien rakentamisessa ja ylläpidossa. Sen avulla on helppoa myös häivyttää suuriakin käyttöjärjestelmäeroja yhden luokkarajapinnan taakse. Hyvänä esimerkkinä käyvät Puppet-Finland-projektin thunderbird- ja openvpn-moduulit, jotka toimivat useilla eri Linux-jakeluilla ja Windowsilla.

Yleensä Puppettia varten rakennetaan palvelinympäristö, joka koostuu puppetserveristä, yleensä puppetdb:stä sekä mahdollisesti myös puppetboardista tai foremanista. Kullekin hallittavalle koneelle asennettu puppet-agent ottaa yhteyden puppetserveriin esim. kerran puolessa tunnissa, päivittää konfiguraationsa vastaamaan puppetserverillä määriteltyä tilaa ja lähettää raportin puppetserverin kautta puppetdb:lle.

Puppettia voidaan ajaa myös paikallisesti ilman puppetserveriä käyttämällä puppet apply-komentoa esimerkiksi seuraavasti:

$ puppet apply init.pp

Yksittäisellä manifest-tiedostolla (yllä init.pp) ei kuitenkaan pystytä tekemään ihmeitä. Puppet apply osaakin käyttää paikallisessa hakemistossa olevia puppet-moduuleita:

$ puppet apply --modulepath=/opt/puppet-modules init.pp

Yllä hakemisto /opt/puppet-modules sisältää kaikki ne moduulit, joita init.pp tarvitsee. Lisäksi siellä on oltava asennettuna moduulien vaatimat riippuvuudet. Moduulikansion ylläpito käsin on melko työlästä, mutta apuna voi käyttää esimerkiksi librarian-puppet-työkalua.

Puppet apply-pohjainen konfigurointi voidaan viedä astetta pidemmälle Kafolla. Kafolla puppet applyn päälle rakennetaan oikea asennusohjelma, jonka toimintaa voidaan ohjata komentoriviparametreilla. Kullekin Kafo-asennusohjelmalle on hyvä luoda rajapinnaksi räätälöity, yksinkertainen Puppet-moduuli muutamastakin eri syystä:

  • Kafo-asentimen komentoriviparametrit luodaan rajapintamoduulin pääluokan dokumentaation (rdoc) pohjalta, jonka muodon suhteen Kafo on erittäin tarkka. Etenkin muiden ylläpitämien Puppet-moduulien dokumentaation muokkaaminen Kafon haluamaan muotoon ei ole välttämättä järkevää, koska muutoksia ei luultavasti saisi hyväksytyksi, vaikka niitä moduulien varsinaisille ylläpitäjille tarjoaisikin.
  • Rajapintamoduulilla voidaan piilottaa asentimen kannalta epäoleelliset parametrit
  • Rajapintamoduulilla voidaan yhdistää useiden eri moduulien toiminnallisuutta samaan tapaan kuin profiileilla "roles and profiles patternissa"

Kafo-asentimien luontiin vaadittava ympäristö on helppoa luoda Vagrant + Virtualbox -yhdistelmällä:

$ git clone https://github.com/Puppet-Finland/puppet-kafo
 $ cd puppet-kafo
 $ vagrant up kafo

Kun virtuaalikone on pystyssä, yhdistetään siihen seuraavasti:

$ vagrant ssh kafo

Sen jälkeen luodaan virtuaalikoneella hakemisto Kafo-asentimelle:

$ mkdir puppetmaster-installer
 $ cd puppetmaster-installer
 $ kafofy -n puppetmaster-installer

Asentimen hakemistoon on nyt luotu Kafon vaatima hakemistorakenne konfiguraatiotiedostoineen. Seuraavassa vaiheessa hakemistoon asennettaan asentimen vaatimat Puppet-moduulit. Tämän voisi tehdä käsinkin, mutta librarian-puppet -työkalulla homma hoituu kätevämmin:

$ rm -rf modules
 $ librarian-puppet init

Tämän jälkeen määritetään asentimen tarvitseman moduulit ja niiden version Puppetfile-tiedostossa, jonka "librarian-puppet init" loi. Alla esimerkki hyvin yksinkertaisesta Puppetfilestä, jossa kaikki moduulit on määritetty noudettaviksi Git-repositoryistä:

#!/usr/bin/env ruby 
 #^syntax detection
# Puppet Forgen osoite 
forge "https://forgeapi.puppetlabs.com"
# Kafo-installerin rajapintaluokka ("entrypoint") 
mod 'puppetfinland-puppetmaster', 
:git => 'https://github.com/Puppet-Finland/puppet-puppetmaster.git'
# Luokka, jolla asennetaan puppetserver 
mod 'puppet-puppetserver', 
:git => 'https://github.com/Puppet-Finland/puppet-puppetserver.git'
# Stdlib, jota hyvin monet muut luokat käyttävät. m
od 'puppetlabs-stdlib', 
:git => 'https://github.com/puppetlabs/puppetlabs-stdlib.git', 
:ref => '4.19.0

Puppetfileen voidaan määrittää myös moduuleja, jotka noudetaan Gitin sijaan Puppet Forgesta. Puppet Forgen käytön etuna on se, että librarian-puppet osaa moduulien vaatimat moduulit automaattisesti. Sen sijaan Gitiä käytettäessä moduulien vaatimukset on määritettävä itse Puppetfileen.

Rajapintamoduulin (yllä puppet-puppetmaster) pääluokka manifests/init.pp voi olla hyvinkin yksinkertainen:

# A simple wrapper class for setting up puppetmasters. Primarily 
# aimed at use in Kafo installers. 
# 
# == Parameters: 
# 
# $puppetserver:: Setup puppetserver 
# class puppetmaster 
( Boolean $puppetserver = true 
) 
{ if $puppetserver { 
class { 'puppetserver::repository': } 
class { 'puppetserver': } 
} 
}

Huom! Kafo on erittäin tarkka parametrien dokumentaation muodosta. Esim. parametrien dokumentaatiossa ei sallita sarkaimia. Dokumentaatio pitää siis kirjoittaa juuri yllä esitetyssä muodossa.

Kun Puppetfile on luotu, voidaan siellä määritetyt moduulit asentaa moduulikansioon librarian-puppetilla:

$ librarian-puppet install 
 $ ls modules 
 apt 
 augeas 
 augeasproviders_core 
 puppetmaster 
 puppetserver 
 puppetserver_gem 
 stdlib
 
Kuten yltä nähdään, librarian-puppet nouti Puppet Forgesta automaattisesti myös sellaisia moduuleja, joita ei oltu määritetty Puppetfileen käsin (apt, augeas, augeasproviders_core).
 
Lopuksi määritetään mitä rajapintaluokkaa asentimen halutaan käyttävän:
$ echo "puppetmaster: true" > config/installer-scenarios.d/default-answers.yaml
Kuten yltä voi arvata, Kafo tukee useita asennusskenaarioita. Asentimen tukemat skenaariot voi listata seuraavasti:
$ bin/puppetmaster-installer --list-scenarios
 Available scenarios
 default (INSTALLED)
Oletusskenaario eli default riittää kuitenkin aivan hyvin useimpiin käyttötapauksiin.
 
Asentimen komentoriviparametrit näkee --help -vivulla:
$ bin/puppetmaster-installer --help
 Usage:
 puppetmaster-installer [OPTIONS]
 
 Options:
 
 = Generic:
 --[no-]colors Use color output on STDOUT (default: true)
 --color-of-background COLOR Your terminal background is :bright or
 :dark (default: :dark)
 --dont-save-answers Skip saving answers to './config/installer-
 scenarios.d/default-answers.yaml'? (default: false)
 --ignore-undocumented Ignore inconsistent parameter documentation
 (default: false)
 -i, --interactive Run in interactive mode
 --log-level LEVEL Log level for log file output (default: "info")
 -n, --noop Run puppet in noop mode? (default: false)
 -p, --profile Run puppet in profile mode? (default: false)
 -s, --skip-checks-i-know-better Skip all system checks (default:
 false)
 -v, --verbose Display log on STDOUT instead of progressbar
 -l, --verbose-log-level LEVEL Log level for verbose mode output
 (default: "info")
 -S, --scenario SCENARIO Use installation scenario
 --disable-scenario SCENARIO Disable installation scenario
 --enable-scenario SCENARIO Enable installation scenario
 --list-scenarios List available installation scenarios
 --force Force change of installation scenario
 --compare-scenarios Show changes between last used scenario and the
 scenario specified with -S or --scenario argument
 --migrations-only Apply migrations to a selected scenario and exit
 --[no-]parser-cache Force use or bypass of Puppet module parser
 cache
 -h, --help print help
 --full-help print complete help
 --[no-]enable-puppetmaster Enable 'puppetmaster' puppet module (default: true)
 
 
 = Module puppetmaster:
 --puppetmaster-puppetserver Setup puppetserver (current: true)
 
 Only commonly used options have been displayed.
 Use --full-help to view the complete list.
Suurin osa parametreista on Kafon luomia geneerisiä parametreja. Rajapintaluokan parametri "puppetserver" on muuntunut asentimen komentoriviparametriksi --puppetmaster-puppetserver, joka voi saada arvokseen true tai false.

Kafo-asennin ei toimi sellaisenaan millä tahansa koneella, vaan se vaatii toimivan Puppet-asennuksen. Tämä ongelma voidaan kiertää käärimällä Kafo-asennin esimerkiksi .deb tai .rpm -pakettiin. Esimerkiksi foreman-installer RPM-paketti paitsi Kafo-installerin, myös sen ajonaikaiset vaatimukset (rubygem-kafo, puppet, rubygem-highline, ruby). Vaihtoehtoisesti asentimen kaveriksi voidaan luoda yksinkertainen skripti, jolla voidaan asentaa tarvittavat paketit.
Samuli Seppänen
Samuli Seppänen
Author archive
menucross-circle