Puppet Modules, manifests en classes

Modules

Puppet Modules zijn directories waarin zich bestanden kunnen bevinden die op de nodes geplaatst moeten gaan worden, er kunnen manifests in staan met code waaraan de nodes moeten voldoen, templates, etc… Modules kunnen gedownload worden vanaf de Puppet-Forge of je kunt eigen modules maken. Puppet Modules komen terecht op de puppetmaster in de directory: /etc/puppetlabs/code/environments/environmentnaam/modules

De tree van een module kan er bv. zo uit zien voor een motd bestand dat op de nodes in /etc/ moet komen te staan en authorized_keys in ~/.ssh/ van de gebruiker:

└── musicplayer
    ├── files
    │   └── motd
    │   └── authorized_keys
    └── manifests
        └── motd.pp
        └── auth_keys.pp

Manifests

In de directory files staan de bestanden die op de nodes terecht moeten komen. Dit wordt dan aangestuurd m.b.v. zogenaamde manifests. Deze manifests zijn bestanden met de extensie .pp, in dit geval motd.pp en auth_keys.pp.

Classes

In het manifest motd.pp wordt een class gedefinieerd:

class musicplayer::motd {
    file { '/etc/motd':
    owner  => 'root',
    group  => 'root',
    mode    => '0644',
    source => 'puppet:///modules/musicplayer/motd',
    }
 }

Ook een manifest voor de authorized_keys file maken we hier aan, genaamd auth_keys.pp met de volgende inhoud:

class musicplayer::auth_keys {

  file { '/home/volumio/.ssh':
    ensure => 'directory',
    owner  => 'volumio',
    group  => 'volumio',
    mode   => '0700',
  }

  file { '/home/volumio/.ssh/authorized_keys':
    owner  => 'volumio',
    group  => 'volumio',
    mode    => '0600',
    source => 'puppet:///modules/musicplayer/authorized_keys',
  }

}

Deze classes kunnen dan via de algemene manifest aangeroepen worden per node, of per groep (of via regex naar verschillende nodes) De Algemene Manifest staat in de volgende directory: /etc/puppetlabs/code/environments/production/manifests

Deze is genaamd site.pp en wordt aangeroepen door de Puppet Agents als zij een connectie maken en vragen aan de puppetmaster om een update.

site.pp kan nu bv. de volgende inhoud hebben om de bovenstaande class in te stellen voor de MusicPlayers:

node default {
  # This is where you can declare classes for all nodes.
  # Example:
  #   class { 'my_class': }
  class { 'musicplayer::motd': }
  class { 'musicplayer::auth_keys': }
}

Alle nodes zullen deze classes nu gaan gebruiken maar we willen dit beperken tot de musicplayer nodes. Het manifest ziet er dan alsvolgt uit:

node default {
  # This is where you can declare classes for all nodes.
  # Example:
  #   class { 'my_class': }
}

node 'huiskamer.digitalinfo.local' {
  class { 'musicplayer::motd': }
  class { 'musicplayer::auth_keys': }
}

Hierna kan een puppet run op de nodes uitgevoerd worden met:

sudo puppet agent -t

Een andere manier om nodes te groeperen is om gebruik te maken van zogenaamde ‘environments‘. Zie deze pagina…

Controle

Een eenvoudige controle kan uitgevoerd worden met behulp van puppet-lint
Installatie:

gem install puppet-lint