Cloudera Cluster Automation mit Ansible (Teil 1)

joshua-sortino-LqKhnDzSF-8-unsplash

Zielsetzung 

Ziel diese Blog-Beitrags ist es, einen Überblick über die Möglichkeiten für den automatisierten Aufbau eines Cloudera Clusters (CDH 6.X) mit Hilfe von Ansible zu geben. Zunächst werden die allgemeine Vorgehensweise und die notwendigen Voraussetzungen betrachtet und anschließend konkrete Lösungen für den Aufbau eines Cloudera Clusters aufgezeigt. Die in diesem Artikel beschriebene Vorgehensweise kann sowohl in der täglichen Administration von Cloudera Clustern als auch für die schnelle Realisierung von Proof of Concepts verwendet werden. Dieser Beitrag bildet damit die Grundlage für weitere Blog-Beiträge zu Lösungen für den automatisierten Aufbau und die Administration von Cloudera Clustern.

Vorgehensweise 

 Für die Erreichung der beschriebenen Zielsetzung werden im Wesentlichen die folgenden Komponenten genutzt.

Cloudera Manager API:

Die Cloudera Manager API bildet die Grundlage für die Interaktion mit dem Cloudera Manager und erlaubt darüber die vollständige Administration und Konfiguration eines Clusters. Die Kommunikation mit der API erfolgt dabei ausschließlich im JSON-Format.

Ansible

Ansible dient zur Automatisierung und ermöglicht die Verwaltung der Konfiguration in Form von Infrastructure as Code (IaC). Im Zentrum steht dabei das uri-Modul, welches für die Interaktion mit der Cloudera Manager API genutzt wird. Darüber hinaus werden mit Ansible JSON-Templates verwaltet, welche von der Cloudera Manager API bei Konfigurationsänderungen verarbeitet werden. Die JSON-Templates können in Ansible mit Variablen versehen werden und mit Hilfe des template-Moduls angepasst werden.

Voraussetzungen 

Es wird davon ausgegangen, dass die Installationsanleitung für die Installation eines Cloudera Clusters bis inklusive  Schritt 6: "Install CDH and Other Software" durchgeführt wurde. Auch dafür kann Ansible oder ein anderes IaC-Tool eingesetzt werden, das soll jedoch nicht Thema dieses Blog-Beitrags sein. Wichtig ist, dass der Service cloudera-scm-server gestartet ist. Der Status des Services kann über folgendes Kommando geprüft werden:

 Läuft der Service, ist der Cloudera Manager auf diesem Host und dem Port 7180 verfügbar. Die Cloudera Manager API ist ebenfalls auf dem gleichen Host und Port verfügbar.

Aufbau eines Clusters 

Im Folgenden wird der Aufbau des Clusters über die Cloudera Manager API näher betrachtet. Die Cloudera Manager API stellt über den Endpunkt  /api/v32/cm/importClusterTemplate die Möglichkeit bereit, ein Cluster-Template in Form von JSON zu importieren. Ein solches Template kann bspw. erstellt werden, indem das Cluster-Template eines bestehenden Clusters über den /api/v32/cluster/{clusterName}/export Endpunkt exportiert wird. Dabei entspricht {clusterName} dem Namen des bestehenden Clusters. Für das Beispiel wurde ein Cloudera Cluster mit 'essential'-Konfiguration erstellt und anschließend das Cluster-Template exportiert. Nach dem Export des Cluster-Templates beinhaltet die JSON Datei <change-me>-Tags, an denen das Cluster-Template an die Zielkonfiguration angepasst werden muss. An dieser Stelle und um weitere Konfigurationen anzupassen, hilft Ansible mit dem template-Modul. Darüber können flexibel Variablen in das Cluster-Template eingebunden werden, um bspw. die Hosts basierend auf dem Ansible Inventory im Cluster-Template abzubilden.

Für den Import eines solchen Cluster-Templates wird der Endpunkt /api/v32/cm/importClusterTemplate des Cloudera Managers angesprochen. Das kann in Ansible sehr einfach über das 'uri'-Modul realisiert werden und wie folgt aussehen:

Dabei wird über das Attribut "url" der Endpunkt angesprochen und mit "body" das Cluster Template selbst an den Endpunkt übergeben. Über das "register"-Attribut wird der Response-Body der Cloudera Manager API abgefangen und in einer Variable gespeichert. Damit kann diese in einem nächsten Schritt für das Debugging und die Überwachung des Import-Status genutzt werden kann.

Die Ausgabe der Cloudera Manager API Response in Form einer Ansible Task kann so aussehen: 

Über eine weitere Ansible Task lässt sich der Status des Import-Prozesses überwachen. Zu diesem Zweck wird wieder das uri -Modul und der api/v32/commands/{commandID} Endpunkt angesprochen. Die {commandID} lässt sich dabei über die Variable, die bei dem Import des Cluster Templates in Ansible registriert wurde, setzen. Die Ansible Task zur Überwachung des Import Prozesses kann wie folgt aussehen:

Im konkreten Beispiel wird hier alle 20 Sekunden überprüft, ob der Prozess beendet wurde, und das Playbook wird erst fortgeführt, wenn der "active"-Status des Import-Prozesses auf "false" gesetzt ist. Parallel zu Ansible kann der Import-Prozess im Cloudera Manager unter "All Recent Commands" überwacht werden.

Screenshot: Cloudera Manager "All Recent Commands"
Screenshot: Cloudera Manager "Import Cluster Template Command"

Fazit 

In diesem Beitrag wurde gezeigt, wie mit geringem Aufwand und wenigen Ansible Tasks ein komplettes Cloudera Cluster aufgebaut werden kann. Nach Abschluss des Import-Prozesses ist das Cluster im Cloudera Manager verfügbar und alle Dienste sind entsprechend ihrer Konfiguration über das Cluster-Template verfügbar. Ein "working Example" Ansible Playbook inklusive beispielhaftem Cluster-Template ist auf GitHub verfügbar. Um die Hosts und Dienste entsprechend überwachen zu können, wird zusätzlich der Cloudera Management Service benötigt. Das Hinzufügen und Konfigurieren des Cloudera Management Services über Ansible schauen wir uns im nächsten Blog-Beitrag an. 

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/