Puppet Project MusicPlayers

Ter ‘lering ende vermaeck‘ hieronder een uiteenzetting van mijn Puppet-project voor de Musicplayers die ik gebruik. De MusicPlayers zijn gebaseerd op Raspberry PI’s en werken onder Debian Linux. De software die ik gebruik is in eerste instantie een kant-en-klare image van Volumio, een distri speciaal voor muziek-doeleinden gemaakt. Standaard ziet dat er zo uit (m.b.v. een web-browser):

Nu wil ik dat wijzigen in andere kleuren en mijn eigen logo. Ook een andere motd en de mogelijkheid om berichten via de mail te kunnen versturen. Het lijstje ziet er alsvolgt uit:

default:

  • NTP service installeren
  • Juiste tijdzone instellen voor NL
  • SSH login beperken tot authenticated key-pair
  • Crontab jobs kunnen maken
  • ssmtp/mailutils installeren
  • ssmtp configureren voor mijn mail-provider
  • IP adres laten mailen na opstarten
  • player instellen als Roon-device
  • player instellen als SqueezeBox (LMS) device

volumio:

  • kleuren van de stylesheet aanpassen
  • logo wijzigen in Digital Hifi logo
  • NL webradio stations toevoegen
  • wachtwoord instellen op Airplay

PuppetMaster

Voor Puppet is een PuppetMaster noodzakelijk, de server van waaruit de manifests geregeld worden. Het inrichten van een PuppetMaster heb ik hier beschreven.

Puppet Agent

Vervolgens dient de Puppet-Agent op de MusicPlayer(s) geïnstalleerd te worden. Aangezien het registreren van de nodes binnen Puppet geschiedt middels een key-pair, is het tevens noodzakelijk dat de datum en tijd van zowel de PuppetMaster als de nodes gelijk zijn en hiervoor is uiteraard de ntp-service die we dus eerst installeren. Hoe dit allemaal ingesteld moet worden, staat hier te lezen.

GitLab

Aangezien versie-control essentieel is gebruiken wij dat ook, in de vorm van GitLab Community Edition een open source project waarmee je zelf repositories kunt opzetten. De structuur voor Puppet wordt ge-managed middels een ‘control_repo’. r10k is dan de tool om de puppet-environments up-to-date te houden. Hoe je dit allemaal inricht, kun je hier lezen.

We maken nu eerst een ‘environment’ aan, genaamd ‘musicplayer’. Voor een uitleg over ‘environments’, zie deze pagina.

We maken hiervoor eerst de branch ‘musicplayer’:

cd ~/puppet/
git init control_repo
cd ~/puppet/control_repo
touch README.md
git add *
git commit -m "Initial commit"
git branch -m master musicplayer

In deze directory komt later ook een bestand genaamd ‘Puppetfile‘ waarin we de modules definiëren, een directory manifests, een directory modules voor extra modules en de hierdata.

Nadat dit allemaal ingesteld is, gaan we eerst de logins op de musicplayer(s) beperken tot geautoriseerde key-pairs en het inloggen met plain-text-passwords zetten we uit op de sshd daemon.

Puppet Forge

Het is beter om reeds geteste en bestaande modules te gebruiken die te vinden zijn op de Puppet Forge, zo ook voor ssh. We gebruiken die van ghoneycutt:

Om deze module te kunnen gebruiken plaatsen we de volgende regel in ~/puppet/control_repo/Puppetfile

forge "http://forge.puppetlabs.com"

# Additional modules from the Puppet Forge
mod 'ghoneycutt-ssh', '3.56.0'

Belangrijk is om te controleren welke ‘dependencies‘ er voor deze modules nodig zijn. Deze moeten dan ook in deze Puppetfile opgenomen worden:

forge "http://forge.puppetlabs.com"

# Additional modules from the Puppet Forge
mod 'puppetlabs-stdlib', '4.17.1'
mod 'puppetlabs-concat', '4.1.1'
mod 'ghoneycutt-common', '1.7.0' 
mod 'ghoneycutt-ssh', '3.56.0'

ssh keys

Hierna kan de manifests file aangemaakt worden. Dit wordt het bestand ~/puppet/control_repo/manifests/setup_musicplayers.pp

## setup-musicplayers.pp ##

# Disable filebucket by default for all File resources:
File { backup => false }

############################################################
###### node default is all other nodes not defined!! #######
############################################################
node default {
   class { 'nopwlogon': }
}

De control_repo is bedoeld om de modules op te pakken die we in GitLab aanmaken. r10k zal deze oppakken en er modules in de environments van maken. In de control_repo geven we aan welke repositories in de GitLab gebruikt worden voor puppet. Hiervoor is ook weer het bestand ~/puppet/control_repo/Puppetfile waar we het volgende bij zetten:

# Modules from the GitLab 
mod 'nopwlogon',
   :git => 'git@git.digitalinfo.local:puppet/puppet-nopwlogon.git',
   :branch => 'musicplayer'

We pushen de nieuwe bestanden met:

git add *
git commit -m "Added Puppetfile and manifests"
git push origin musicplayer

We gaan dan de repository ‘puppet-nopwlogon‘ maken met:

cd ~/puppet
git init puppet-nopwlogon
git remote add origin git@git.digitalinfo.local:puppet/puppet_nopwlogon.git
cd puppet-nopwlogon
touch README.md 
git add * 
git commit -m "Initial commit" 
git branch -m master musicplayer

Het manifests bestand:

mkdir manifests
cd manifests
vi init.pp

In het manifest-bestand init.pp zetten we de class. We gebruiken de module ssh::keys om de keys toe te voegen aan de authorized_keys van gebruiker volumio en file_line om plaint-text-passwords te disablen.

# define the auth keys file for volumio #
class nopwlogon {
  ssh::keys:
  volumio_for_nico:
    ensure: present
    user: volumio
    type: dsa
    key: AAAA...==

  file_line { 'noPasswordLogon':
     path   => '/etc/ssh/sshd_config',
     after  => 'UsePAM yes',
     line   => 'PasswordAuthentication no',
  }
}

Hierna committen en pushen we de manifest naar de GitHub.

cd ..
git add *
git commit -m "Added manifests file nopwlogon"
git push origin musicplayer

Nadat r10k z’n werk gedaan heeft, staat de module op de puppetmaster in de musicplayer environment. De puppet agent zal deze periodiek ophalen of we forceren dit op de node met:

puppet agent -t

.