Puppet

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Puppet 3.x unter Debian

Da ich Stunden damit zugebracht habe, Puppet 3.x unter Debian zum Laufen zu bringen, notiere ich an dieser Stelle ein paar Zeilen aus dem Kopf und der Bash History. Eventuell wird ja später mal daraus eine richtige Anleitung ... Ich verwendete eine Anleitung die gleich damit begann das neuste stable Release von Puppet über Debian zu installieren, nichts ahnend, was für Probleme damit einhergehen könnten. Das größte Problem ist nämlich, dass ein nicht unerheblicher, wichtiger Teil der Syntax von den 2.x'er abweicht und man sich dusslig sucht. Da ich auch kein Fan von Ruby/Rails/Gem bin (für mich die Hölle, was Debug und Co angeht), macht die Einrichtung umsoweniger spaß.

Hier meine Notizen:

Hinweis

Ich setze voraus, dass DNS etc. funktioniert, also ein ping auf z.B. puppet.domain.local funktioniert, andernfalls muss man die /etc/hosts überall so anpassen, damit ein Ping auf den vollständigen Rechnernamen (FQDN) klappt. Die Ip Adressen und Namen vom LDAP etc. sind aus der Luft gegriffen und müssen keinen Sinn ergeben ;-)

Puppet

Was ich ja nicht komplett erwähnen muss, (sonst wärst du nicht hier), ist, dass Puppet an der Stelle weitermacht, wo Fai aufhört. Man kann zwei eine Menge mittels Fai ausrollen, doch soll es ja vorkommen, dass Konfigurationen sich ändern und an dieser Stelle setzt Puppet ein. Beliebtest Beispiel: SSHD und die Sudo Konfigurations- Dateien.

Ziel

Am Ende der Zeilen wird (hoffentlich) Puppet mittels des Apache Passenger Modul laufen, die Klassen aus dem LDAP beziehen und - als nettes Add-On - eine Übersicht mittels des Puppet-Dashboard bieten.

Installation

Als Basis dient ein Debian Squeeze, welches auch mein Fai beherbergt. Puppetlabs stellt ein Debian Paket bereit, welches den Schlüssel und die passende Apt Liste enthält:

Debian-term.png
# wget http://apt.puppetlabs.com/puppetlabs-release-squeeze.deb
# aptitude update

Nun die Installation der Pakete selbst:

Debian-term.png
# aptitude install -y puppet puppet-common puppet-el puppet-testsuite puppetmaster puppetmaster-common vim-puppet vim-nox


Konfiguration

Das Konfigurationsverzeichnis ist /etc/puppet und die später wichtig werdenden SSL Zertifikate liegen unter /var/lib/puppet. Im Grunde gibt es für die Hauptarbeit drei Dateien:

  • /etc/puppet/puppet.conf
    • Enthält die Basiskonfiguration
  • /etc/puppet/auth.conf
    • Bestimmt, der mit dem Puppet Server kommunizieren darf
  • /etc/puppet/fileserver.conf
    • Wer darf auf die Puppet Dateien zugreifen

Im Schnelldurchlauf:

  • /etc/puppet/puppet.conf
Ascii.png
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates

# Noch auskommentiert. Dient später der automatischen Versionierung der Puppet Dateien/Manifeste ...
# prerun_command=/etc/puppet/etckeeper-commit-pre
# postrun_command=/etc/puppet/etckeeper-commit-post

# wir arbeiten mit Modulen, da dies sich gut Strukturieren lässt
modulepath = $confdir/environments/$environment/modules:$confdir/modules


[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN 
ssl_client_verify_header = SSL_CLIENT_VERIFY

# Wir wollen für jeden Puppet Client einen Report hochladen
reports = store, http
# auf diesen Server
reporturl = http://puppet.domain.local:3000/reports/upload

# Die Klassen sollen aus dem LDAP bezogen werden
node_terminus = ldap
ldapserver = ldap.domain.local
ldapbase =  dc=domain,dc=local

# wir arbeiten mit Modulen, da dies sich gut Strukturieren lässt
modulepath = $confdir/environments/$environment/modules:$confdir/modules


# Damit Reports überhaupt erstellt werden, wichtig für jeden Puppet "Client"
[agent]
report=true


Man beachte den zu ändernden Teil!

  • /etc/puppet/auth.conf
Ascii.png
### Authenticated paths - these apply only when the client
### has a valid certificate and is thus authenticated

# allow nodes to retrieve their own catalog
path ~ ^/catalog/([^/]+)$
method find
allow $1

# allow nodes to retrieve their own node definition
path ~ ^/node/([^/]+)$
method find
allow $1

# allow all nodes to access the certificates services
path /certificate_revocation_list/ca
method find
allow *

# allow all nodes to store their reports
path /report
method save
allow *

# unconditionally allow access to all file services
# which means in practice that fileserver.conf will
# still be used
path /file
allow *

################## Hier ändern !!!!! #######################
##### siehe: https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/IV_Qn39jox4
path ~ ^/file_(metadata|content)/files/
auth yes
allow /^(.+\.)?domain.local$/
allow_ip 192.168.1.0/24
################## Hier ändern !!!!! #######################


### Unauthenticated ACL, for clients for which the current master doesn't
### have a valid certificate; we allow authenticated users, too, because
### there isn't a great harm in letting that request through.

# allow access to the master CA
path /certificate/ca
auth any
method find
allow *

path /certificate/
auth any
method find
allow *

path /certificate_request
auth any
method find, save
allow *

# this one is not stricly necessary, but it has the merit
# of showing the default policy, which is deny everything else
path /
auth any


  • /etc/puppet/fileserver.conf
Ascii.png
[files]
  path /etc/puppet/files
  allow *

[modules]
  allow *

[plugins]
  allow *

Hier steht zwar, dass jeder zugreifen darf, aber zuvor wird die auth.conf abgefragt. Dies hier ist eine art Workaround für Puppet 3.0.1 und soll später gefixt werden, sodass auch hier Einschränkungen auf DNS bzw. IP Ebene funktionieren.


Als nächstes müssen wir dafür sorgen, dass der Puppetmaster Daemon nicht gestartet wird, da wir das über den Apachen erledigen:

Debian-term.png
# service puppetmaster stop
# vi /etc/default/puppetmaster
Ascii.png
START=no

# Startup options
DAEMON_OPTS=""

# What port should the puppetmaster listen on (default: 8140).
PORT=8140


Kurzer Test

Um mal eben zu schauen, ob soweit die Syntax der Dateien passt, kann man Puppet Master mal von Hand starten. Nebenbei werden auch die SSL Zertifikate erzeugt:

Gnome-terminal.png
#  puppet master --no-daemonize --verbose --debug

[...]
Debug: Finishing transaction 70248629156860
Starting Puppet master version 3.0.1

Es werden eine Menge Debug Ausgaben gezeigt, doch am Ende sollte die passende Startmeldung angezeigt werden. Ein STRG+c beendet den Test wieder. Diese Zeile sollte man sich merken, da sie goldwert sein kann.

Apache Passenger

Da der eingebaute Webrick WebDaemon nicht das gelbe vom Ei sein soll (nur eine Verbindung ... kein Threading ...), richten wir den Apachen ein:

Debian-term.png
# aptitude install -y puppetmaster-passenger

Die Abhängigkeiten sorgen dafür, dass auch ein Apache2 mit dabei ist.


Konfiguration

Die Konfiguration ist nicht weiter kompliziert, es bedarf nur einer passenden Modul Unterstützung, sowie der korrekten Vhost Datei:

Debian-term.png
# a2enmode passenger
  • /etc/apache2/sites-available/puppetmaster
Ascii.png
# you probably want to tune these settings
PassengerHighPerformance on
PassengerMaxPoolSize 12
PassengerPoolIdleTime 1500
# PassengerMaxRequests 1000
PassengerStatThrottleRate 120
RackAutoDetect On
RailsAutoDetect Off

Listen 8140

<VirtualHost *:8140>
        SSLEngine on
        SSLProtocol -ALL +SSLv3 +TLSv1
        SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP

        SSLCertificateFile      /etc/puppet/ssl/certs/puppet.local.pem
        SSLCertificateKeyFile   /etc/puppet/ssl/private_keys/puppet.local.pem
        SSLCertificateChainFile /etc/puppet/ssl/ca/ca_crt.pem
        SSLCACertificateFile    /etc/puppet/ssl/ca/ca_crt.pem
        # If Apache complains about invalid signatures on the CRL, you can try disabling
        # CRL checking by commenting the next line, but this is not recommended.
        SSLCARevocationFile     /etc/puppet/ssl/ca/ca_crl.pem
        SSLVerifyClient optional
        SSLVerifyDepth  1
        SSLOptions +StdEnvVars

        # This header needs to be set if using a loadbalancer or proxy
        RequestHeader unset X-Forwarded-For

        RequestHeader set X-SSL-Subject %{SSL_CLIENT_S_DN}e
        RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
        RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

        DocumentRoot /usr/share/puppet/rack/puppetmasterd/public/
        ## RackBaseURI /
        <Directory /usr/share/puppet/rack/puppetmasterd/>
		Options None
                AllowOverride None
                Order allow,deny
                allow from all
                # We are told that this is required for correct operation
                Options -MultiViews
        </Directory>
</VirtualHost>

Einzig aufpassen muss man bei den Pfaden der Zertifikate. Beim ersten Start des Puppet Master Daemons werden diese automatisch erzeugt, sodass man sie für den Apachen 1:1 verwenden kann. Der Name wird vom Rechnernamen abgeleitet, in diesem Beispiel also puppet.local.pem.

  • Starten
Debian-term.png
# a2ensite puppetmaster
# apache2ctl -t
# service apache2 restart
  • Testen

Ein kurzer Aufruf der URL https://puppet.local:8140 sollte eine Zeile bringen, wie:

The environment must be purely alphanumeric, not ''

Dann funktioniert es.


LDAP

Da wir eh einen LDAP Server am Laufen haben, bot es sich an, einen Teil der Verwaltung in den LDAP zu verlegen. Wir verwenden dafür den OpenLDAP in der cn=config Konfiguration. Damit die Puppetklassen verwenden werden können, muss das Schema puppet.schema in den LDAP. Das Schema selbst kann hier geholt werden. Damit es aber auch in die dynamische Verwaltung passt, muss es zuvor konvertiert werden. Ich habe das hier mal getan:

Ascii.png
dn: cn=puppet,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: puppet
olcAttributeTypes: {0}( 1.3.6.1.4.1.34380.1.1.3.10 NAME 'puppetClass' DESC 'Pu
 ppet Node Class' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.
 1.26 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.34380.1.1.3.9 NAME 'parentNode' DESC 'Pupp
 et Parent Node' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1
 .26 SINGLE-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.34380.1.1.3.11 NAME 'environment' DESC 'Pu
 ppet Node Environment' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.11
 5.121.1.26 )
olcAttributeTypes: {3}( 1.3.6.1.4.1.34380.1.1.3.12 NAME 'puppetVar' DESC 'A va
 riable setting for puppet' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.146
 6.115.121.1.26 )
olcObjectClasses: {0}( 1.3.6.1.4.1.34380.1.1.1.2 NAME 'puppetClient' DESC 'Pup
 pet Client objectclass' SUP top AUXILIARY MAY ( puppetclass $ parentnode $ en
 vironment $ puppetvar ) )

Der Umbrüche sind im Ldif Format definiert, müssen also nicht herausgenommen werden. Nun kann man mittels ldapmodify / Ldap Browser das Schema hinzufügen. Siehe Google (ich verwende gern den Apache Directory Studio, da auch vorhandene Einträge aktualisiert werden können).

In meinem Fall musste ich einen der LDAP Server (die als n-way Master arbeiten) neustarten um dann die neuen Klassen und Attribute im LDAP Browser sehen zu können.

Hat das geklappt, erstellt man sich am Besten - sofern man das nicht eh schon hat - eine DN wie diese:

  • cn=host,dc=domain,dc=local

Das hat den Charme, später diese Objekte für andere dinge im Unix Umfeld verwenden zu können.

  • Hier im Detail:
Ascii.png
dn: cn=testhost.domain.local,dc=domain,dc=local
objectClass: device
objectClass: top
objectClass: puppetClient
cn: testhosts.domain.local
environment: production
puppetClass: ssh

dn: ou=hosts,dc=domain,dc=local
objectClass: organizationalUnit
objectClass: top
ou: hosts

Der erste Puppet Client heißt "testhost.domain.local", was wichtig ist zu wissen, denn auf diesen Namen wird sich der Puppet Agent beziehen. Auch zu beachten sind die jeweiligen Objektklassen. Hier lässt sich auch definieren, in welcher Puppet Klassen dieser Host sein soll, nämlich in der Klasse ssh.

  • Fehlt noch die entsprechende ACL:
Ascii.png
olcAccess to dn.subtree="ou=hosts,dc=domain,dc=local"
by * read

Natürlich kann man dies später passend eingrenzen, wenn alles funktioniert.


Man sollte auf jedenfall vom Puppetmaster Server testen, ob am Ende das passende herausfällt, z.B. via ldapsearch:

  • ldapsearch:
Gnome-terminal.png
# ldapsearch -x '(&(objectclass=puppetClient)(cn=testhost.domain.local))' -LLL
dn: cn=testhost.domain.local,ou=hosts,dc=domain,dc=local
objectClass: device
objectClass: top
objectClass: puppetClient
puppetClass: ssh
environment: production
cn: testhost.domain.local


Damit auch Puppet LDAP sprechen kann, müssen die passenden Ruby Module installiert werden:

Debian-term.png
# aptitude install libldap-ruby1.8
  • Dann gleich mal testen:
Gnome-terminal.png
# ruby -rldap -e 'puts :installed'
installed

# ruby -rpuppet -e 'p Puppet.features.ldap?'
true

passt.

Damit wäre der LDAP Teil durch.

Puppet Module

Bevor der erste Test erfolgt, brauchen wir etwas zum testen, ob denn der Workflow funktioniert. Da bietet sich der SSH Daemon an, da der zumeist angepasst wird. Des weiteren sehen wir auch gleich, ob das Kopieren der Dateien funktioniert.

Es gibt zig Organisationsstrukturen, wie das Puppet Layout aussehen kann. Ich habe mich für die Modulvariante entschieden, da wir sowohl Linux als auch (würg) Solaris einsetzen und nicht immer die Pfade gleich sind.

  • Erzeugen wir uns also das passende Layout:
Ascii.png
# mkdir -p /etc/puppet/modules/ssh/{files,manifests}
# mkdir -p /etc/puppet/templates/ssh/

Wie verwenden aus Spaß an der Freude (und für das Beispiel) auch gleich noch die Template Funktion, die aber in diesem Fall noch nicht wirklich genutzt wird. Da mir noch nicht alles aus Puppet bekannt ist, muss man sich einen Teil zu denken, was die jeweilige Zeile bedeutet ;-)

  • Die Dateien:
  • /etc/puppet/modules/ssh/manifests/init.pp
    • Wichtig: Die Datei muss wohl wirklich init.pp heißen, da sie bei mir sonst nicht ausgeführt wird (class ssh not found)
    • Von hier kopiert und leicht modifiziert.
Ascii.png
#
# SSH CONFIGURATION
#

class ssh {

    package { 'openssh-server':
        ensure => installed
    }

    exec { 'mkdir /root/.ssh':
        path => '/usr/bin:/usr/sbin:/bin',
        onlyif => 'test ! -d /root/.ssh'
    }

     ## Die source Zeile enthält kein "files", da das Puppet selbst weiß ##
     ## das hat mich Stunden gekostet, das herauszufinden ##
    file { '/etc/ssh/sshd_config':
        name => '/etc/ssh/sshd_config',
        owner => root,
        group => root,
        mode  => 644,
	source  => "puppet:///modules/ssh/sshd_config",
        require => Package['openssh-server']
    }

    ## Hier nutzen wir die Template Funktion ##
    file { 'authorized_keys':
        name => '/root/.ssh/authorized_keys',
        owner => 'root',
        group => 'root',
        mode => 600,
        content => template( 'ssh/root_key.erb' ),
        require => Package['openssh-server']
    }

    ## Hier kommmt alles zusammen ##
    service { 'ssh':
        subscribe => File[ '/etc/ssh/sshd_config' ],
        require => [ Package['openssh-server'], File['/etc/ssh/sshd_config', 'authorized_keys'] ]
    }

}
  • /etc/puppet/modules/ssh/files/sshd_config
    • Enthält die SSHD Konfiguration
Ascii.png
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin yes
PasswordAuthentication yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding no
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM no
AllowTcpForwarding no
Match Address 192.168.1.1
	PasswordAuthentication yes


  • /etc/puppet/templates/ssh/root_key.erb
    • Enthält den öffentichen SSH Schlüssel vom Benutzer Root
Ascii.png
ssh-dss AAAAB3NzaC1kc3M[...] root@puppet.domain.local
    • Wichtig ist auch an dieser Stelle, dass der Webserver (Debian www-data) alle Dateien lesen kann!**

Damit ist sozusagen die Grundkonfiguration abgeschlossen und ein erster Test kann erfolgen.

Erster Test

Als Testkandidat kommt ein Debian Squeeze zum Einsatz, welches vorher mittels Fai installiert wurde und alle notwendigen Pakete enthält. Dazu zählen eben SSH und Puppet. Die Konfiguration des Agents sieht dabei so aus:

Konfiguration

Da mein Puppet server noch nicht unter puppet.domain.local zu finden ist (wonach sie automatisch suchen), sage ich dem Agent, wo er den Server findet:

  • /etc/puppet/puppet.conf
Ascii.png
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
prerun_command=/etc/puppet/etckeeper-commit-pre
postrun_command=/etc/puppet/etckeeper-commit-post

[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN 
ssl_client_verify_header = SSL_CLIENT_VERIFY
server = puppet.domain.local

[agent]
server = puppet.domain.local
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
listen = true
runinterval = 30000
ignorecache = true
report = true

Unter Squeeze muss zusützlich die Datei /etc/puppet/auth.conf erstellt werden, sonst startet der Agent nicht (Nur auf den Puppet Clients ausführen, nicht auf dem Master)

Gnome-terminal.png
# touch /etc/puppet/auth.conf


Und auch, dass der Puppet Dienst beim Boot gestartet werden soll:

  • /etc/default/puppet
Ascii.png
# Start puppet on boot?
START=yes

# Startup options
DAEMON_OPTS=""


Das würde allerdings noch nicht funktionieren, da die Zertifikate noch nicht ausgetauscht worden sind. Das holen wir nun nach.

Test

  • Starten wir den Puppet Daemon von Hand:
Gnome-terminal.png
testhost# puppetd --server puppet.domain.local --waitforcert 60 --test

Klappt nun alles mit der Kommunikation (Stichwort Apache, Firewall, LDAP) wird nun eine Zertifizierungs- Anfrage an den Puppermaster gesendet, die wir (zügig) unterschreiben müssen (sign)


Gnome-terminal.png
puppetmaster # puppet ca sign testhost.domain.local

Hat das auch geklappt, kann man den Puppet Client starten:

Debian-term.png
testhost# service puppet start


Es sollte nun die /etc/ssh/sshd_config angepasst worden sein, der SSH Daemon neugestartet und auch die /root/.ssh/authorized_keys existiert, mit dem richtigen Inhalt. Damit steht einem generellem Verwenden nun nichts mehr im Wege (sofern ich nichts vergessen habe).

  • Kleiner Tipp:

sollte es dennoch an einer Stelle nicht funktionieren, kann es helfen, den Apachen zu stoppen und den Puppetmaster von Hand aufzurufen (siehe irgendwo oben) und dann noch einmal den Testaufruf vom Client zu starten. Zumeist kommt man dann eher darauf, was nicht funktioniert.

Puppet Dashboard

Der nächste Punkt wäre die Überwachung, welche Puppet Agents durchgelaufen sind, wie viele noch ausstehen und wo es nicht geklappt hat. Statt sich die passenden Zeilen aus den Logs zu holen, bietet das Puppet-Dashboard eine nette Übersicht, basierend auf MySQL und Rack.

Auch hier sind Stunden draufgegangen, weil immer irgendwas nicht gepasst hat und die Anleitungen im Netz meist veraltet sind oder nicht für Debian passen. Bei diesem Teil muss ich noch mehr aus dem Kopf schreiben und hoffen, noch alles zusammen zu bekommen.

Installation

MariaDB

Da ich Oracle nicht ausstehen kann, installieren wir statt MySQL das zu 100% kompatible MariaDB. Da MariaDB noch nicht in den Squeeze Repositories enthalten ist, fügen wir diese hinzu:

Debian-term.png
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

# cat > /etc/apt/sources.list.d/mariadb.list  << "EOF"
## MariaDB 5.5 repository list - created 2012-12-20 12:52 UTC
## http://downloads.mariadb.org/mariadb/repositories/
deb http://mirror2.hs-esslingen.de/mariadb/repo/5.5/debian squeeze main
deb-src http://mirror2.hs-esslingen.de/mariadb/repo/5.5/debian squeeze main
EOF

# aptitude update
# aptitude install -y mariadb-server

Der restliche Teil entspricht dem 1:1 von MySQL und auch die meisten Befehle nennen sich mysql*. Dazu gehört unter anderem das Root Kennwort der Datenbank etc. zu ändern.

Im produktiven Bereich sollte in jedem Fall ein spezieller Datenbankbenutzer für das Dashboard angelegt werden, der Schnelligkeit wegen, greifen wir auf Root zurück.

Dashboard

Nun können wir das Dashboard installieren und verhindern so, dass eine andere Datenbank vorab gewählt wird.

Debian-term.png
# aptitude -y install puppet-dashboard
Konfiguration

Nun benötigen wir nun die Konfiguration für die Datenbank. Die ist zu erstellen unter:

  • /etc/puppet-dashboard/database.yml
Ascii.png
production:
  database: dashboard_production
  username: root
  password: wirklichsehrgeheim!!!!
  encoding: utf8
  adapter: mysql

Die Datenbank heißt also dashboard_production. Da wir mit Root arbeiten, müssen wir sie nicht vorab erstellen, sondern überlassen dies dem Rake Script. Dazu müssen wir folgendes ausführen:

Gnome-terminal.png
# cd /usr/share/puppet-dashboard/
# rake RAILS_ENV=production db:create
# rake RAILS_ENV=production db:migrate

Erster rake Befehl erstellt die Datenbank, zweiter befüllt sie.

Die Dashboard Konfiguration selbst ist die /etc/puppet-dashboard/settings.yml die ich allerdings bisher noch nicht angepasst habe.


Apache

Um die Webseite darzustellen, benutzen wir den bereits vorhandenen Apachen mit einer neuen Vhost Konfiguration. Zuvor muss aber sichergestellt werden, dass das Dashboard nicht selbst einen Webserver Daemon startet:

  • /etc/default/puppet-dashboard
Ascii.png
# Uncomment the line below to start Puppet Dashboard.
START=no

# Location where puppet-dashboard is installed:
DASHBOARD_HOME=/usr/share/puppet-dashboard

# User which runs the puppet-dashboard program:
DASHBOARD_USER=www-data

# Ruby version to run the puppet-dashboard as:
DASHBOARD_RUBY=/usr/bin/ruby

# Rails environment in which puppet-dashboard runs:
DASHBOARD_ENVIRONMENT=production

# Network interface which puppet-dashboard web server is running at:
DASHBOARD_IFACE=0.0.0.0

# Port on which puppet-dashboard web server is running at, note that if the
# puppet-dashboard user is not root, it has to be a > 1024:
DASHBOARD_PORT=3000

Wichtig ist das START=no, sonst kommen wir uns mit dem Apachen ins Gehege.


  • /etc/apache2/sites-available/puppet-dashboard
Ascii.png
Listen *:3000
PassengerHighPerformance on
PassengerMaxPoolSize 12
PassengerPoolIdleTime 1500
# PassengerMaxRequests 1000
PassengerStatThrottleRate 120
RailsAutoDetect On
PassengerDefaultUser www-data
ServerSignature On

<VirtualHost *:3000>
	SetEnv RAILS_ENV production
        RackBaseURI / 
        ServerName puppet.domain.local
        DocumentRoot /usr/share/puppet-dashboard/public/
        <Directory /usr/share/puppet-dashboard/public/>
		Options None
		AllowOverride None
		Order allow,deny
		Allow from all
        </Directory>
  ErrorLog /var/log/apache2/dashboard.test_error.log
  LogLevel warn
  CustomLog /var/log/apache2/dashboard.test_access.log combined
  ServerSignature On

#   <Location "/">
#    AuthBasicProvider ldap
#    AuthType Basic
#	AuthName "Puppet Dashboard"
#	AuthLDAPUrl ldap://ldap.domain.local/cn=people,dc=domain,dc=local?uid
#	AuthLDAPGroupAttribute memberUid
#	AuthLDAPGroupAttributeIsDN off
#	Require ldap-user admin
#   </Location>
</VirtualHost>


Die Webseite ist also auf dem Port 3000 zu finden (wenn anders, dann an die puppet.conf auf dem Master denken!) und Passenger läuft ebenfalls als User www-data da es sonst Probleme gibt. Wer die LDAP Authentifizierung nutzen will, muss vorher das authnz_ldap Modul aktivieren.


Des weiteren muss ein Link zu einer Rake Datei erstellt werden, ohne die das Ganze nicht funktioniert:

Gnome-terminal.png
# cd /usr/share/puppet-dashboard
# ln -s /usr/share/puppet-dashboard/vendor/rails/railties/dispatches/config.ru .

Nun kann man die Vhost Konfiguration aktivieren und Apache sowie und die Dashboard-workers durchstarten:

Debian-term.png
# a2ensite puppet-dashboard
# service apache2 restart
# service puppet-dashboard-workers restart


Als Test kann man nun http://puppet.domain.local:3000 aufrufen und den Puppet Agent auf testhost neustarten. Nach kurzer Zeit sollte dessen (Fehl)Erfolg auf der Webseite angezeigt werden.

Quellen



--Denny 13:24, 20. Dez. 2012 (UTC)