Puppet

Programm zum Hostmanagement von Linuxclients, egal ob Debian,Ubuntu oder SUSE.
Es besteht aus einer Serverkomponente und einem Client.
Auf dem Server werden die Konfigurationen vorgegeben, die der Client in bestimmten Zeitabständen abruft und ausführt.
Ein bisschen wie die GPOs auf Windowsseite.

Server-Installation

der dedizierte Server muss wegen verschiedener Zertifikate im DNS-System auflösbar sein.
als root:

apt-get install puppetmaster

in der Datei /etc/default/puppetmaster muss START=yes gesetzt sein.
um verschiedene getrennte Umgebungen für z.B. mehrere Abteilungen verwalten zu können muss mit Environments gearbeitet werden.
Beispielkonfigurationsverzeichnis /etc/puppet/ für eine IT-Abteilung und eine Entwicklungsabteilung: IT, Entw :

puppet.tar.gz

durch sie werden alle Clients die in der Datei /etc/puppet/environments/it/manifests/site.pp verzeichnet sind, mit dem ntp-Dienst installiert und
als ntp-server werden die Server mytimesrv1 und mytimesrv2 in die Datei /etc/ntp.conf geschrieben.
Bei Änderungen werden diese nach ca 30 Minuten auf die Clients verteilt.

weitere [main]-Einstellungen:
alle alternativen DNS-Namen unter dem der Server im Zertifikat erreichbar ist:

dns_alt_names = puppet, mypuppetsrv, mypuppetsrv.my.dom.ain

eigenes IT-Serverenvironment:

environment = it

weitere [master]-Einstellungen:
alle Clients die kommen, sollen automatisch signiert werden.

autosign = true

Client-Installation

z.B. auf einem Debian als root:

apt-get install puppet

in der Datei /etc/default/puppet muss START=yes gesetzt sein und der Dienst gestartet sein.
in der Datei /etc/puppet/puppet.conf müssen die zwei Einträge gemacht werden:

[main]
...
environment = it
server = mypuppetsrv.my.dom.ain
...

Installation auf einem Windowsclient:

msiexec /qn /norestart /i puppet-x64-latest.msi PUPPET_MASTER_SERVER=mypuppetsrv.my.dom.ain PUPPET_AGENT_ENVIRONMENT=it

manuell kann man die Synchronisation erzwingen durch:

puppet agent config -t

Datei pushen

Beispiel für zwei Dateien (testdatei2.txt+testdatei3.txt)

Um eine Datei auf die Clients zu verteilen muss folgendes durchgeführt werden:
Ein Verzeichnis muss einmalig erstellt und berechtigt werden:

mkdir -p /etc/puppet/environments/it/files
chown -R puppet:puppet /etc/puppet/environments/it/files
chmod g+w puppet:puppet /etc/puppet/environments/it/files

die auf die Clients zu replizierende Datei muss dann in diesem Verzeichnis erstellt (oder kopiert) werden:

echo "dies ist ein Test" >> /etc/puppet/environments/it/files/testdatei.txt

diese Datei muss einmalig editiert werden: /etc/puppet/fileserver.conf:

...
[files_it]
path /etc/puppet/environments/it/files
allow *
...

diese Datei muss editiert werden: /etc/puppet/environment/it/manifests/site.pp: …

node 'clientsuse67' {  class { '::ntp':	servers => ['myntpsrv'],}  
	    file {'/tmp/testdatei2.txt': source => 'puppet:///files_it/testdatei.txt', }
	    file {'/tmp/testdatei3.txt': content => 'blabla', }
	}

jetzt kann man den Client clientsuse67 manuell veranlassen, sich zu synchronisieren:

puppet agent config -t

Auf Diesem sollten jetzt im Verzeichnis /tmp zwei Dateien auftauchen: testdatei2.txt und testdatei3.txt.

SSH-Dienst starten

auf allen Clients soll der SSH-Dienst gestartet werden:
Datei mit erforderlichen Verzeichnissen /etc/puppet/environment/it/modules/ssh/init.pp erstellen.

init.pp
class sshd {
 
	package {"openssh-server":
                 ensure => latest,
                }	
	service { "ssh":
		ensure => running,
                enable => true,
                require => Package['openssh-server'],
	        }
    }

diese Datei muss editiert werden: /etc/puppet/environment/it/manifests/site.pp:

site.pp
node 'clientsuse67' {  class { '::ntp':	servers => ['myntpsrv'],}  
	               class {sshd:}
                       ...
	}

Cron-Dienst starten

auf allen Clients soll der cron-Dienst gestartet werden:
Der Dienst ssh soll auf allen Clients jeden abend 20 Uhr gestoppt und morgens 6 Uhr wieder hochgefahren werden.
Datei mit erforderlichen Verzeichnissen /etc/puppet/environment/it/modules/cron/init.pp erstellen.

init.pp
class cron {
		package { "cron": ensure => installed, }
 
		file { "/etc/cron.d/cron-ssh":
			source => "puppet:///files_it/cron/cron-ssh",
			owner => "root",
			group => "root",
			mode => 644,
		    }
}

Datei /etc/puppet/environment/it/files/cron/cron-ssh :

cron-ssh
# cron jobs zum stoppen von ssh in der Nacht / rb / 2014 #
0 20	* * *	root	/etc/init.d/ssh stop
0 6	* * *	root	/etc/init.d/ssh start


diese Datei muss editiert werden: /etc/puppet/environment/it/manifests/site.pp:

site.pp
node 'clientsuse67' {  class { '::ntp':	servers => ['myntpsrv'],}  
	               class {cron:}
                       ...
	}

einen Benutzer verteilen

auf allen Clients soll der Benutzer root_xy erstellt werden:
Datei mit Verzeichnissen /etc/puppet/environment/it/modules/user/init.pp erstellen.

init.pp
class user {
 
	user { "root_xy":
		ensure => present,
		password => '$6$WKS6A1MBUq9$RgSPsC2GyEKnEPrvllVAQaBhTwIpVburs8Q64rR4.xMiWmYn.ZE8OjnLPihOb7O.vHIozHFFxBiAHBYA2z.lP1',
		home => '/home/root_xy' ,
		gid => '0',
		#uid => '0',
        # wenn der Benutzer die selbe UID erhalten soll dann dass hier noch:  
        exec { "usermod -u 0 -o root_xy": 
		path    => "/usr/local/bin/:/bin:/usr/sbin",
		logoutput => "on_failure",
			}
		}
    }


diese Datei muss editiert werden: /etc/puppet/environment/it/manifests/site.pp:

site.pp
node 'clientsuse67' {  class { '::ntp':	servers => ['myntpsrv'],}  
	               class {user:}
                       ...
	}

sonstiges

auf dem Server: alles als root:

puppet cert list --all
puppet cert sign --all
puppet cert clean --all
puppet config print
puppet config print manifest --section server --environment myenv
puppet parser validate
puppet module list
puppet module generate meinTest/meinBenutzername
puppet master --configprint basemodulepath
puppet master --configprint environmentpath

auf dem Client:

puppet config print
puppet agent config -t
#puppet alle Stunde laufen lassen:
puppet agent --configprint all
puppet agent --configprint runinterval 
#/etc/puppetlabs/puppet/puppet.conf:
 [agent]
 runinterval = 3600
 #runinterval = 7h


Fehler

Fehler:
Warning: Deprecation notice: Node inheritance is not supported in Puppet >= 4.0.0. See http://links.puppetlabs.com/puppet-node-inheritance-deprecation
Behebung:


Module