In meinem letzten Beitrag haben wir RabbitMQ mit Puppet auf unserer CentOS 6.2 Box installiert. Heute machen wir weiter mit der Installation von Sensu, einem ziemlich coolen Monitoring-Framework, das heutzutage viele Leute verwenden.

Dieser Beitrag folgt dem Sensu-Installationsguide und verweist auf mein GitHub-Repository, wo ich meine Puppet-Konfiguration committe. Zum ersten Mal wiederhole ich nicht, wie man seine Box mit Vagrant aufbaut und so weiter - schau dir einfach meine vorherigen Beiträge an.

Zur Abwechslung werde ich die Kommandozeile nicht über das Anpassen und Erweitern meiner Puppet-Konfiguration hinaus verwenden.

Also, du bist als root in deine Box eingeloggt? Prima. Los geht’s!

Bevor wir anfangen

Es gibt ein Überbleibsel von unserer RabbitMQ-Installation. Wir müssen ein Verzeichnis entfernen und einige symbolische Links erstellen.

cd /etc/puppet
rm -rf manifests
ln -s /vagrant/manifests
ln -s /vagrant/modules

Das brauchst du, falls du deinen Bereitstellungslauf von innerhalb der virtuellen Maschine mit puppet apply aufrufen möchtest. Wenn nicht, kannst du immer vagrant provision von außerhalb deiner Box auf deinem Host-System ausführen.

Wenn du mit meiner Vagrant-Box startest, musst du auch git installieren:

yum -y install git

SSL-Zertifikate generieren und installieren

Es gibt noch ein weiteres Überbleibsel. Ich habe die SSL-Zertifikate nicht zur Puppet-Konfiguration hinzugefügt. Da ich die manuelle Prozedur bereits hier durchgeführt habe, ist der Rest unkompliziert.

Zuerst generiere die Zertifikate mit

git clone git://github.com/joemiller/joemiller.me-intro-to-sensu.git
cd joemiller.me-intro-to-sensu/
./ssl_certs.sh clean
./ssl_certs.sh generate

Dann habe ich das folgende Verzeichnis erstellt

/vagrant/modules/rabbitmq/files/etc/rabbitmq/ssl/

und die folgenden Dateien hineinkopiert

cp server_key.pem /vagrant/modules/rabbitmq/files/etc/rabbitmq/ssl/
cp server_cert.pem /vagrant/modules/rabbitmq/files/etc/rabbitmq/ssl/
cp testca/cacert.pem /vagrant/modules/rabbitmq/files/etc/rabbitmq/ssl/

Jetzt müssen wir unsere Puppet-Konfiguration in der Datei erweitern

/vagrant/modules/rabbitmq/manifests/init.pp

Für einen Test habe ich nur eine Datei gemacht.

file { '/etc/rabbitmq/server_key.pem':
 source => '/etc/puppet/modules/rabbitmq/files/etc/rabbitmq/ssl/server_key.pem',
 owner => 'root',
 group => 'root',
 mode => '644',
 notify => Service['rabbitmq-server'],
 require => Package['rabbitmq-server'],
}

Wir müssen Puppet auch mitteilen, dass wir das Verzeichnis /etc/rabbitmq/ssl brauchen, da es noch nicht existiert.

file { '/etc/rabbitmq/ssl/':
 source => '/etc/puppet/modules/rabbitmq/files/etc/rabbitmq/ssl/',
 owner => 'root',
 group => 'root',
 mode => '644',
}

Füge diese Datei-Ressource auch im require-Abschnitt der Service-Ressource hinzu.

Lass uns unsere neue Konfiguration testen, ohne etwas zu ändern, indem wir den --noop Parameter angeben.

cd /etc/puppet
puppet apply --verbose manifests/site.pp --noop

Dann habe ich auch die anderen Dateien hinzugefügt und einen weiteren Testlauf gemacht. Alles lief gut, also habe ich einen echten Bereitstellungslauf gemacht.

Eine weitere Sache, die wir für RabbitMQ tun müssen, ist eine Konfigurationsdatei bereitzustellen, die RabbitMQ mitteilt, SSL zu verwenden und wo diese Zertifikate zu finden sind.

vim /etc/puppet/modules/rabbitmq/files/etc/rabbitmq/rabbitmq.conf

und füge folgendes ein

[
 {rabbit, [
 {ssl_listeners, [5671]},
 {ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/cacert.pem"},
  {certfile,"/etc/rabbitmq/ssl/server_cert.pem"},
  {keyfile,"/etc/rabbitmq/ssl/server_key.pem"},
  {verify,verify_peer},
  {fail_if_no_peer_cert,true}]}
 ]}
].

Füge jetzt einen weiteren Datei-Ressourcen-Eintrag für diese Konfigurationsdatei zu deiner init.pp deines Puppet-RabbitMQ-Moduls hinzu und stelle sie bereit.

Zur Sicherheit überprüfe unser Zielverzeichnis.

Weißt du was? Das Ding funktioniert wirklich! Wir haben das mit einem Server gemacht, aber wir könnten es genauso einfach mit vielen mehr machen. Das wäre überhaupt kein Problem.

Nach all dem habe ich alles committe und auf meinem Host-System auf GitHub gepusht.

git add.
git commit -m "Added the use of SSL to RabbitMQ"
git push origin master

Sensu Puppet-Konfiguration

Schließlich habe ich ein neues Modul für Sensu zu meiner Puppet-Konfiguration hinzugefügt und es in meine nodes.pp eingebunden, die jetzt so aussieht

node dev_ops_central {
 include cron
 include apache
 include rabbitmq
 include redis
 include sensu
}

Dann habe ich mich durch den Installationsguide gearbeitet, einschließlich der Anleitung zum Hinzufügen eines Checks und Hinzufügen eines Handlers, und das in Puppet-Konfiguration übersetzt. Ich werde hier nicht alles wiederholen, denn jetzt bist du dran, dich durch den Puppet-Code zu arbeiten.

Schließlich konnte ich alles starten, aber es funktionierte zunächst nicht. Beim Stoppen von cron bekam ich keine Benachrichtigung in meinem Sensu-Frontend. Wie sich herausstellte, hatte ich einige Probleme mit meiner bestehenden RabbitMQ-Installation. Sie verwendete kein SSL, weil die Konfigurationsdatei den falschen Namen hatte. Es ist nicht rabbitmq.conf sondern rabbitmq.config. Es dauerte eine Weile, das herauszufinden, wobei rabbitmqctl status zeigte, dass es meine rabbitmq.conf ignorierte und seine eigene Konfiguration verwendete.

In der Zwischenzeit, während ich diesen Beitrag schrieb und polierte, wurde mein Sensu-Code von @linuxaddicted refactored. Außerdem hat er einige RSpec-Tests hinzugefügt! Perfekt! Vielen Dank. Mehr zu diesem RSpec-Ding bald.

Hüte dich vor dem Brownfield

Für die Installation des sensu-plugin mit

gem install sensu-plugin

musste ich zuerst die Ruby-Entwicklungsbibliotheken installieren mit

yum install ruby-devel

Ich werde das zu einem Teil meiner Box machen und es nicht separat deployen.

Zusätzlich musste ich gcc installieren. Keine Option auf potenziellen Produktionsboxen.

Feature-Branching mit Git

Zum ersten Mal habe ich einen Feature-Branch namens sensu verwendet, da ich keinen halbfertigen Code in meinen Master-Branch committen wollte. Ich mag die Idee von Continuous Delivery, wo Feature-Branches so verwaltet werden, dass sie inkrementelle, releasefähige Updates unterstützen.

Hier ist der “Prozess”, wie man einen Branch mit git erstellt, seinen Code hinzufügt, committe und auf GitHub pusht.

git checkout -b sensu
git branch
git commit -am "my message"
git push origin sensu

Als ich sicher war, dass alles gut funktionierte, habe ich alles zurück in den Master-Branch gemergt und den Branch sensu lokal und remote auf GitHub entfernt.

git checkout master
git merge sensu

Jetzt besteht keine Notwendigkeit mehr, den sensu-Branch zu behalten, also habe ich ihn lokal und remote entfernt mit

git branch -d sensu
git push origin:sensu

Nachdem ich diese Arbeit erledigt hatte, war es ein guter Zeitpunkt, unseren Master-Branch zu taggen.

git tag provisioning_sensu_with_puppet
git push --tags

Zusammenfassung

Wir haben fast eine vollständige Automatisierung von der Box-Erstellung bis zur Bereitstellung von RabbitMQ und Sensu mit Puppet. Wir können jetzt Sensu mit mehr Checks und Handlern erweitern, um unsere Monitoring- und Alerting-Mechanismen zu verbessern. Aber das ist erst der Anfang der Geschichte. Es gibt viel zu erforschen und zu lernen. Bleib dran. Fürs Erste…

Fertig für heute!