Einrichten eines modernen Puppet-Servers von Grund auf

Ursprünglicher Autor: Runar Balstad Jensen
  • Übersetzung
Ich habe kürzlich den Prozess der Installation eines neuen Puppet-Servers unter Ubuntu 12.04 von Grund auf überarbeitet, einschließlich aller modernen Pfeifen und Fälschungen. Als Ergebnis habe ich diesen Leitfaden erhalten.

Zunächst benötigen wir ein sauberes Ubuntu mit einem funktionierenden Netzwerk und konfiguriertem DNS.

Als Ergebnis sollten wir bekommen:
  • Überall installiert Puppet 3. Version
  • Konfiguriert in gemeinsam genutzten Git-Repositories
  • Dynamische Umgebungen, die von r10k gesteuert werden
  • PuppetDB-Unterstützung
  • Hiera-Unterstützung


Dieser Leitfaden ist ziemlich lang Alle Einstellungen werden manuell vorgenommen, so dass Sie das Ergebnis später problemlos verwenden und selbst anpassen können. Die einzige Ausnahme ist PuppetDB, das über das eigene Modul von Puppet Labs einfacher zu installieren ist als manuell.

Sofern nicht anders angegeben, wird davon ausgegangen, dass alle Befehle als root auf dem Puppet-Server ausgeführt werden.


Installieren Sie Puppet


Fügen Sie das Puppet Labs-Repository hinzu, indem Sie das Paket installieren:
source /etc/lsb-release
wget https://apt.puppetlabs.com/puppetlabs-release-$DISTRIB_CODENAME.deb
dpkg -i puppetlabs-release-$DISTRIB_CODENAME.deb
rm puppetlabs-release-$DISTRIB_CODENAME.deb

Installieren Sie Puppet und Puppet Master:
apt-get update
apt-get install puppet puppetmaster

Anmerkung des Übersetzers: Die Dokumentation von Puppet Labs empfiehlt die Installation von puppetmaster-passenger.

Marionetten-Setup


Erstellen Sie ein Verzeichnis, in dem sich die Einstellungen Ihrer Umgebungen befinden, und erteilen Sie der Gruppe puppetSchreibberechtigungen:
mkdir /etc/puppet/environments
chgrp puppet /etc/puppet/environments
chmod 2775 /etc/puppet/environment

Wir werden den Inhalt dieses Verzeichnisses niemals direkt bearbeiten, sondern r10küber den Git-Hook, den wir etwas später konfigurieren werden.

Nun müssen Sie einige Einstellungen in der Datei vornehmen /etc/puppet/puppet.conf. Hier ist ein gutes Beispiel, mit dem Sie beginnen können:
[main]
  environment   = production
  confdir       = /etc/puppet
  logdir        = /var/log/puppet
  vardir        = /var/lib/puppet
  ssldir        = $vardir/ssl
  rundir        = /var/run/puppet
  factpath      = $vardir/lib/facter
  templatedir   = $confdir/templates
  pluginsync    = true
[agent]
  environment   = production
  report        = true
  show_diff     = true
[master]
  environment   = production
  manifest      = $confdir/environments/$environment/manifests/site.pp
  modulepath    = $confdir/environments/$environment/modules:$confdir/environments/$environment/site
  # Passenger
  ssl_client_header        = SSL_CLIENT_S_DN
  ssl_client_verify_header = SSL_CLIENT_VERIFY

Anmerkung der Übersetzer: seit Version 3.6, die Variablen manifest/ modulepath/ config_versionveraltet zugunsten von Umgebungen .

Wenn Sie die Definition des Namens " puppet" in DNS noch nicht konfiguriert haben , können Sie diesen server = your.server.comAbschnitt hinzufügen [main].

Hiera Setup


Hiera erfordert auch einige Konfiguration. Erstellen Sie eine Datei /etc/puppet/hiera.yaml:
---
:hierarchy:
  - "nodes/%{::fqdn}"
  - "manufacturers/%{::manufacturer}"
  - "virtual/%{::virtual}"
  - common
:backends:
  - yaml
:yaml:
  :datadir: "/etc/puppet/environments/%{::environment}/hieradata"

Um das Hiera-Debugging ein wenig zu vereinfachen und später Verwirrung zu vermeiden, ersetze ich lieber die Datei /etc/hiera.yaml(von der Puppet nicht einmal vermutet) durch einen Symlink /etc/puppet/hiera.yaml:
ln -sf /etc/puppet/hiera.yaml /etc/hiera.yaml


Puppen-Gesundheitscheck


Jetzt ist es an der Zeit, den Puppet Master-Dienst neu zu starten:
/etc/init.d/puppetmaster restart

Überprüfen Sie die Funktionalität des Puppet-Agenten:
puppet agent --test

Als Ergebnis sollten Sie etwas Ähnliches erhalten:
Info: Retrieving plugin
Error: /File[/var/lib/puppet/lib]: Could not evaluate: Could not retrieve information from environment production source(s) puppet://testpm.qix.no/plugins
Info: Caching catalog for testpm.qix.no
Info: Applying configuration version '1384949455'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 0.03 seconds

Der einzige Fehler kann als ignoriert werden Wir haben noch keine Configs oder Plugins.
Stellen Sie vor dem Fortfahren sicher, dass dieser Befehl funktioniert. Die Probleme in dieser Phase hängen höchstwahrscheinlich mit DNS zusammen.

R10k-Installation


Fantastische Adrien Thebo erstellt das gleiche unerreichte Dienstprogramm für die Verwaltung von dynamischen Umgebungen Puppet und effektive Nutzung von externen Modulen - egal ob Sie sie auf dem finden Puppet Forge oder speichern sie in einem eigenen Repository.
Weitere Informationen finden Sie auf der GitHub- Seite . Führen Sie zum Installieren die folgenden Befehle aus:
apt-get install rubygems
gem install r10k


R10k Setup


Es ist notwendig, ein Verzeichnis mit Caches zu erstellen, in dem r10kKopien von Modulen gespeichert werden:
mkdir /var/cache/r10k
chgrp puppet /var/cache/r10k
chmod 2775 /var/cache/r10k

Und natürlich hat es r10keine eigene Einstellungsdatei. Erstellen Sie /etc/r10k.yamlmit folgenden Inhalten:
# location for cached repos
:cachedir: '/var/cache/r10k'
# git repositories containing environments
:sources:
  :base:
    remote: '/srv/puppet.git'
    basedir: '/etc/puppet/environments'
# purge non-existing environments found here
:purgedirs:
  - '/etc/puppet/environments'


Git-Installation


Leider ist die mit Ubuntu 12.04 gelieferte Git-Version von diesem Fehler betroffen , der die falschen Berechtigungen (0755) für alle neuen Puppet-Umgebungen festlegt. Dies erlaubt es nicht, Repositorys für mehrere Benutzer freizugeben.

Füge PPA vom Git Support Team hinzu:
apt-get install python-software-properties
add-apt-repository ppa:git-core/ppa

Installieren Sie die neueste stabile Version von git:
apt-get update
apt-get install git


Erstellen eines Git-Repository


Erstellen Sie nun ein neues Git-Repository, das als Hauptquelle für die Puppet-Konfiguration für Ihren Server dient.
Alle Ihre Administratoren arbeiten mit diesem Repository und r10kwerden von dort aus aktualisiert, um Puppet-Umgebungen automatisch zu erstellen (oder zu löschen).
Erstellen Sie ein neues Repository in /srv/puppet.git:
git init --bare --shared=group /srv/puppet.git
chgrp -R puppet /srv/puppet.git
cd /srv/puppet.git
git symbolic-ref HEAD refs/heads/production

Bitte beachten Sie, dass dieses Repository drei Unterscheidungsmerkmale aufweist:
  1. er ist kahl;
  2. er wird geteilt;
  3. Zweig Master umbenannt in Produktion.


Festlegen von Berechtigungen


Es ist Zeit, Puppet im Git-Repository zu konfigurieren.
Sie sollten nicht mit dem Git-Repository als Root arbeiten, also fügen Sie Ihren Benutzer der Gruppe hinzu puppet, die verwendet wird, um den Zugriff auf das Repository einzuschränken:
adduser  puppet

Melden Sie sich an, damit die Änderungen wirksam werden.
Überprüfen Sie die Gruppenmitgliedschaft erneut, indem Sie diesen Befehl von einem normalen Benutzer ausführen:
id | grep puppet


Git Hook erstellen


Arbeiten Sie als normaler Benutzer weiter.
Erstellen Sie eine Datei /srv/puppet.git/hooks/post-receive, die r10kbei jedem Push an das Repository ausgeführt wird:
#!/bin/bash
umask 0002
while read oldrev newrev ref
do
    branch=$(echo $ref | cut -d/ -f3)
    echo
    echo "--> Deploying ${branch}..."
    echo
    r10k deploy environment $branch -p
    # sometimes r10k gets permissions wrong too
    find /etc/puppet/environments/$branch/modules -type d -exec chmod 2775 {} \; 2> /dev/null
    find /etc/puppet/environments/$branch/modules -type f -exec chmod 664 {} \; 2> /dev/null
done

Denken Sie daran, das Skript ausführbar zu machen:
chmod 0775 /srv/puppet.git/hooks/post-receive


Die erste Umgebung erstellen


Wechseln Sie als normaler Benutzer in das Ausgangsverzeichnis und klonen Sie das leere Repository:
cd
git clone /srv/puppet.git
cd puppet

Erstellen Sie einige notwendige Verzeichnisse:
mkdir -p hieradata/nodes manifests site

modulesWir erstellen keinen Ordner , weil Sie wird durchgebracht r10k. Lokale Module (d. H. Module, die ausschließlich für diesen Puppet-Master-Server bestimmt sind) befinden sich im Verzeichnis site.
Jetzt fangen wir mit dem Setup an r10k. Erstellen Sie Puppetfileim Stammverzeichnis des Repository eine Datei mit folgendem Inhalt:
# Puppet Forge
mod 'puppetlabs/ntp', '3.0.0-rc1'
mod 'puppetlabs/puppetdb', '3.0.0'
mod 'puppetlabs/stdlib', '4.1.0'
mod 'puppetlabs/concat', '1.0.0'
mod 'puppetlabs/inifile', '1.0.0'
mod 'puppetlabs/postgresql', '3.2.0'
mod 'puppetlabs/firewall', '0.4.2'
# A module from your own git server
#mod 'custom',
#  :git => 'git://git.mydomain.com/custom.git',
#  :ref => '1.0'

Das Dateiformat Puppetfilewurde zuerst von Tim Sharpe für die Verwendung in Librarian-Puppet vorgeschlagen . Verwenden Sie es daher als Dokumentationsquelle.
Zwei wichtige Punkte zu Puppetfile:
  • Anders als der Befehl puppet moduleunterstützt er r10kkeine automatische Abhängigkeitsverarbeitung (für Version 1.1.0). Sie müssen alle Abhängigkeiten manuell aktivieren.
  • Sie können auf Git-Commits verweisen, indem Sie Tags durch Git-Hashes ersetzen. Zum Testen können Sie den Zweig sogar wechseln, indem refSie ihn auf so etwas wie einstellen. In einer Kampfumgebung masterist dies jedoch wahrscheinlich keine gute Idee.


Jetzt konfigurieren wir die beiden Module, indem wir sie miteinander verbinden Hiera.
Alle Hosts müssen über ein ntpModul verfügen. Erstellen Sie daher eine Datei hieradata/common.yamlmit folgendem Inhalt:
---
classes:
  - ntp
ntp::servers:
  - 0.pool.ntp.org
  - 1.pool.ntp.org
  - 2.pool.ntp.org
  - 3.pool.ntp.org


Unser Puppet-Master-Server benötigt das Puppetdb-Modul. Erstellen Sie daher eine Datei hieradata/nodes/$(hostname -f).yamlund fügen Sie die erforderliche Klasse mit den Standardeinstellungen hinzu:
---
classes:
  - puppetdb
  - puppetdb::master::config

Erstellen Sie schließlich ein sehr einfaches Manifest manifests/site.pp, das alle Klassen enthält, in denen wir Folgendes definiert haben Hiera:
hiera_include('classes')


Festschreiben und pushen


Bleiben Sie im Git-Repository - es ist Zeit, die erste Version der Produktionsumgebung zu übernehmen und zu pushen .
Da Sie mit git keine leeren Verzeichnisse speichern können und wir noch keine lokalen Module haben, fügen Sie dem Verzeichnis eine Dummy-Datei hinzu site:
touch site/.keep

Stellen Sie sicher, dass Sie den richtigen Zweig haben, fügen Sie alle Dateien hinzu und führen Sie ein Commit und einen Push durch:
git checkout -b production
git add *
git commit -a -m "initital commit"
git push -u origin production


Als Ergebnis sollten Sie ungefähr Folgendes erhalten:
Counting objects: 11, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 867 bytes | 0 bytes/s, done.
Total 11 (delta 0), reused 0 (delta 0)
remote: 
remote: --> Deploying production...
remote: 
To /srv/puppet.git
 * [new branch]      production -> production
Branch production set up to track remote branch production from origin.

Achten Sie auf die Nachricht --> Deploying production..., was bedeutet, dass unser Git Hook funktioniert hat.
Sie können auch überprüfen, ob das Verzeichnis /etc/puppet/environments/productionerstellt wurde und der Inhalt des Ordners modulesdie Puppet Forge-Module enthält, in denen wir aufgeführt sind Puppetfile.

Starten Sie Puppet


Wechseln Sie zurück zum Benutzer rootund führen Sie den Marionettenagenten aus:
puppet agent --test

Sie sollten einige schwarz-grüne Textausgabebildschirme erhalten, die den Installations- und Konfigurationsfortschritt der NTP- und PuppetDB-Dienste beschreiben, einschließlich der PostgreSQL-Datenbank, die für PuppetDB benötigt wird.
Stellen Sie sicher, dass die Dienste ausgeführt werden:
/etc/init.d/ntp status
/etc/init.d/puppetdb status


Überprüfen Sie PuppetDB


Führen Sie puppet erneut aus, um postgresql mit Daten zu füllen:
puppet agent --test

Führen Sie danach diesen Befehl aus:
puppet node status $(hostname -f)

Sie sollten so etwas bekommen:
testpm.qix.no
Currently active
Last catalog: 2013-11-20T13:22:05.036Z
Last facts: 2013-11-20T13:22:00.437Z

Hilfreicher Tipp: Versuchen Sie, mit dem folgenden Befehl alle Informationen zu Ihrem Host abzurufen, die puppetdb in formatiertem JSON speichert:
puppet node find $(hostname -f) | python -mjson.tool

Jetzt ist puppetdb vollständig konfiguriert und Sie können den Ressourcenexport zum Verteilen von ssh-Schlüsseln auf alle Hosts verwenden.

Hiera Check


Wenn Sie diesen Schritt erreicht haben, funktioniert Hiera bereits. Möglicherweise müssen Sie Hiera jedoch während der Entwicklung über die Befehlszeile testen.
Ich hoffe, Sie sind meinem Rat gefolgt und haben die Datei /etc/hiera.yaml zu einem symbolischen Link zu /etc/puppet/hiera.yaml gemacht. Der folgende Befehl listet dann alle Klassen auf, die auf den aktuellen Host in der Produktionsumgebung angewendet werden:
hiera -a classes ::environment=production ::fqdn=$(hostname -f)

Als Ergebnis sollten Sie erhalten:
["puppetdb", "puppetdb::master::config", "ntp"]


Puppet Master-Prozess


Das Erstellen von Verzweigungen in Git erfordert keinen großen Aufwand. Der Entwicklungsprozess sieht also folgendermaßen aus:
# создайте новую ветку и сделайте требуемые изменения
git checkout -b new_feature
vim somefile
git add somefile
git commit -m "best feature ever"
# новая ветка == новое окружение
git push --set-upstream origin new_feature
# проведите тесты (ведь вы это будете делать на тестовом сервере, не так ли?)
puppet agent --test --noop --environment new_feature
puppet agent --test --environment new_feature
# diff and merge
git checkout production
git diff ..new_feature
git diff --name-only new_feature
git merge new_feature
# выложите новую фичу в production
git push
# удалите локальную ветку
git branch -d new_feature
# удалите ветку с сервера == удалить окружение
git push origin :new_feature


Der Prozess der Arbeit mit Modulen


Wenn Sie an einem Modul arbeiten, das Sie auf mehreren Puppet Master-Servern verwenden möchten (aber nicht weitergeben), können Sie es auf den internen Git-Server hochladen und den Zweig konfigurieren, an dem Sie arbeiten Puppetfile:
mod 'my_app',
  :git => 'git://git.mydomain.com/my_app.git',
  :ref => 'master'

Dieses Modul wird masterjedes Mal, wenn Sie ein Push-Repository erstellen, unter dem letzten Festschreiben im Zweig aktualisiert /srv/puppet.git. Aber was ist, wenn Sie keine Änderungen an diesem Repository vorgenommen haben? In diesem Fall machen Sie es einfach r10kexplizit. Dieser Befehl aktualisiert alle Module in allen Umgebungen:
r10k deploy environment -p

So aktualisieren Sie nur die Umwelt Test :
r10k deploy environment testing -p

Das einzige Problem beim Starten r10kauf diese Weise ist, dass Rechte eingehen können /etc/puppet/environments, was zu Problemen im freigegebenen Repository führt. Um dies zu vermeiden, erstellen Sie ein Skript /usr/local/bin/deployund erteilen Sie ihm das Recht zur Ausführung:
#!/bin/sh
umask 0002
r10k deploy environment $1 -p
find /etc/puppet/environments -mindepth 1 -type d -exec chmod 2775 {} \;
find /etc/puppet/environments -type f -exec chmod 0664 {} \;

Wenn Sie jetzt Module aktualisieren, die in einem bestimmten Zweig konfiguriert sind, können Sie die folgenden Befehle ausführen:
# обновить все модули во всех окружениях
deploy
# обновить все модули в тестовом окружении
deploy testing

Vergessen Sie nach Abschluss der Arbeiten an Ihrem Modul nicht, ein Tag dafür zu erstellen:
git tag -a 1.0 -m "finally no error messages"
git push --tags

... und aktualisiere deine Puppendatei so, dass sie nach dem Tagnamen und nicht nach dem Filialnamen verweist. Wenig später werden Sie sich dafür dankbar sein.

Fazit


Sie sollten nun eine solide und moderne Puppenbasiskonfiguration haben. Viel glück

Ich empfehle zu lesen




Übersetzerzusätze


Ich habe auf meinem Puppet Master einen Haufen Gitolite + Gitlist angelegt . Alle Repositories sind in Gitolite, die Änderungen können bequem im Browser eingesehen werden ( Gitlab erschien mir zu monströs mit vielen Abhängigkeiten und unnötigen Funktionen in meinem Fall). Das Verzeichnis / etc / puppet befindet sich auch in einem separaten Git-Repository ( environmentshinzugefügt .gitignore).
Zum Überwachen von Berichten verwende ich puppetexplorer - eine sehr praktische clientseitige Schnittstelle für PuppetDB (geschrieben in AngularJSund CoffeeScript).

Referenzen:

Jetzt auch beliebt: