Alles automatisieren: Terraform + Ansible + Elastic Cloud Enterprise

In Fortführung unseres Blogposts zur Automatisierung der Installation von Elastic Cloud Enterprise mit Ansible möchten wir in diesem Blogpost zeigen, wie Sie die Automatisierung auf die Cloud-Bereitstellung mit Terraform erweitern können. Im ersten Blogpost haben wir gezeigt, wie Elastic Cloud Enterprise (ECE) mit Ansible in drei AWS-Verfügbarkeitszonen bereitgestellt und konfiguriert werden kann. Allerdings war die Bereitstellung der zugrunde liegenden EC2-Instances und die Konfiguration der Sicherheitsgruppen mit manuellem Aufwand verbunden.

In diesem Blogpost verbessern wir unsere Herangehensweise, indem wir die Bereitstellung und Konfiguration der EC2-Instances und Sicherheitsgruppen mit Terraform automatisieren. Außerdem nutzen wir Terraform, um die Installation, Konfiguration und Ausführung des Ansible-Playbooks zu automatisieren, das wir beim letzten Mal erstellt haben. Automation is good.

Übrigens: Was ist eigentlich Terraform? Zunächst einmal bleibt festzuhalten: Terraform hat nichts mit der Genesis-Technologie zu tun. Laut HashiCorp, die das Ganze entwickelt haben, handelt es sich um ein Tool für das Erstellen, Ändern und Versionieren von Infrastruktur mittels High-Level-Konfiguration: Infrastruktur als Code. Das ist aus vielen Gründen praktisch, nicht zuletzt deshalb, weil alles, was man zum Einrichten und Konfigurieren einer Infrastruktur benötigt, in Textdateien bereitsteht, die versionsgesteuert und per Programmcode „geCRUDet“ werden können.

Wir konzentrieren uns in diesem Blogpost auf AWS als Cloudanbieter, aber mit Terraform lassen sich Ressourcen auf jedem beliebigen Cloudanbieter bereitstellen und verwalten. Wir verweisen zu diesem Zweck auf deren Liste großer Cloudanbieter und deren Liste nicht so großer Cloudanbieter. Ein Beispiel für GCP ist in unserem Beispiel-Repo bei GitHub zu finden.

Außerdem sei darauf hingewiesen, dass auch in diesem Blogpost nur ein einfacher Fall demonstriert wird, mit dem eine ECE-Umgebung geschaffen wird, die sich für eine kleine Proof-of-Concept- oder Entwicklungsumgebung eignet. In einem kompletten Produktions-Deployment sollte auch mit Instance-Gruppen, Lastausgleichsmechanismen und anderen High-Availability-Konstrukten gearbeitet werden, die in diesem Setup außen vor gelassen wurden. Zusätzliche Angaben zur Produktionsplanung und Bereitstellung können der Elastic Cloud Enterprise-Planungsdokumentation entnommen werden.

Jetzt gehts endgültig los.

Aufgaben

Wir folgen wieder dem Beispiel für eine einfache kleine Installation in der ECE-Dokumentation, aber diesmal mit ganz anderen Aufgaben:

  1. Terraform installieren
  2. Infrastruktur definieren
  3. Starten
  4. Happy sein

Terraform installieren

Informationen dazu gibts in der HashiCorp-Dokumentation. Sie brauchen auch Ansible, was wir ja im vorherigen Blogpost installiert haben. Wenn Sie Ansible noch nicht installiert haben, befolgen Sie die entsprechenden Schritte in der Ansible-Dokumentation. Ich habe also über die klapprige Tastatur meines MacBook Pro Folgendes eingegeben:

> brew install terraform
> brew install ansible

Beachten Sie, dass die von mir verwendete Konfiguration mit Terraform 0.12 kompatibel ist. Ich persönlich habe die Version 0.12.19 verwendet.

Infrastruktur definieren

Diese Aufgabe besteht aus den folgenden Schritten:

  1. Richten Sie Ihre Terraform-Konfiguration so ein, wie ich es auch getan habe.
  2. Werfen Sie einen Blick auf die Dateien, um sich mit ihnen vertraut zu machen
  3. Legen Sie ein paar Variablen fest, die hoffentlich eindeutig genug sind.

Terraform-Konfiguration laden

Wie bereits erwähnt, dient Terraform zur Bereitstellung von Infrastruktur in Form von Konfigurationsdateien. Das bedeutet, dass es sehr viele von diesen Dateien gibt. Um die ganze Sache etwas zu beschleunigen, empfiehlt es sich, das Repo zu klonen oder die Dateien aus unserem Beispiel-Repository bei GitHub herunterzuladen. Alles, was wir im Folgenden tun, wird mit diesen Dateien getan.

Wie schon zuvor sind die Schritte auf Leute wie mich abgestellt, die CLI den Vorzug geben, denn es ist viel komplizierter, Zeigen-und-Klicken-Anleitungen zu schreiben!

Schritte
  1. Klonen Sie das Beispiel-Repository oder laden Sie die Dateien herunter.
    > git clone https://github.com/elastic/examples.git
    	
  2. Gehen Sie zum Speicherort der Dateien.
    > cd /workspace/github/elastic/examples
    	
  3. Navigieren Sie zu den ECE-AWS-Terraform-Beispielen.
    > cd Cloud\ Enterprise/Getting\ Started\ Examples/aws/terraform
    	
  4. Machen Sie sich auf etwas Textbearbeitung gefasst.

Einen Blick auf die Dateien werfen

Sie sollten die folgenden Dateien vorliegen haben. Werfen Sie ruhig einmal einen Blick auf sie, wenn Sie möchten.

terraform.tfvars.exampleNach dem Umbenennen in terraform.tfvars ist dies der Hauptort für unsere Konfigurationseinstellungen. In variables.tf können wir die Variablen an unsere Anforderungen anpassen.
variables.tfMassenweise Variablen, aber es lohnt sich, hier einmal reinzuschauen.
provider.tfTerraform-Konfigurationsdatei zur Festlegung, wie die Verbindung zu AWS hergestellt werden soll.
servers.tfTerraform-Konfigurationsdatei, mit der wir das gewünschte AMI finden, unsere Instances bereitstellen und die Instance-Metadaten für Ansible erfassen können.
networking.tfTerraform-Konfigurationsdatei für die AWS-Netzwerkeinrichtung: VPC, Internet-Gateway, Routing-Tabelle, Subnetz und Sicherheitsgruppen.
main.tfTerraform-Konfigurationsdatei, die das Ansible-Skript startet und einige der wichtigen Informationen erfasst, die das Skript ausgibt.
ansible-install.shDas Skript, das Terraform ändert und aufruft, damit Ansible mit der ECE-Rolle konfiguriert und ausgeführt wird.

Variablen festlegen

Wir müssen noch ein paar Variablen festlegen, damit das bei Ihnen auch funktioniert (bei mir tuts das bereits, weil ich es schon für mich hingebogen habe, und es geht ja hier schließlich um Sie).

  • einen Projektnamen, der bei allen zu erstellenden AWS-Ressourcen getaggt wird
  • Ihre IP-Adresse, damit nur Sie SSH-Zugriff auf die zugrunde liegenden Instances haben; Sie können auch 0.0.0.0/0 festlegen, wenn Sie den Zugriff für die ganze Welt freigeben möchten
  • Anmeldedaten für den AWS-Zugriff, damit Terraform bereitstellen kann, was es bereitstellen soll

Wenn Sie kein AWS-Zugriffsschlüsselpaar haben, erstellen Sie eines gemäß AWS-Anleitung.

Hinweis: In variables.tf kann ein Speicherort für die private und die öffentliche Schlüsseldatei festgelegt werden, der dann beim Herstellen einer SSH-Verbindung mit den EC2-Instances genutzt wird. Wenn Sie keinen SSH-Schlüssel haben, kann eine Google-Suche Ihnen sicherlich weiterhelfen. Bei DigitalOcean gibt es eine gute, einfach gehaltene Beschreibung für Linux/OSX und Windows.

Schritte
  1. Benennen Sie terraform.tfvars.example in terraform.tfvars um.
  2. Nehmen Sie in terraform.tfvars die folgenden Änderungen vor:
    1. Legen Sie für project_name einen Projektnamen fest, der zur Identifizierung aller Ihrer AWS-Ressourcen genutzt werden kann.
    2. Geben Sie im Feld trusted_network Ihre IP-Adresse in CIDR-Notation oder dem von Ihnen bevorzugten Adressbereich ein.
    3. Geben Sie im Feld aws_access_key Ihren AWS-Zugriffsschlüssel und im Feld aws_secret_key den geheimen Schlüssel ein.
    4. Ändern Sie bei Bedarf die Werte in den Feldern aws_region, public_key und/oder private_key.

Die Einstellungen für das AMI und den EC2-Instance-Typ lassen Sie bitte unverändert. Das hat verschiedene Gründe, aber der Hauptgrund ist, dass wir das Ganze für den Anfang möglichst einfach halten möchten. Wie schon beim letzten Mal besteht der Plan darin, auf der Basis eines CentOS 7-AMI drei i3.xlarge-Instances bereitzustellen.

  • Um sicherzustellen, dass Terraform das richtige AMI finden kann, können wir ihm verschiedene Metadaten vorgeben. In diesem Fall habe ich ein Namensmuster, eine Eigentümer-ID (die von centos.org) und einen Virtualisierungstyp verwendet. Namensmuster und Eigentümer-ID sind in variables.tf konfigurierbar. Aber Achtung: Wenn Sie ein anderes AMI auswählen (z. B. eines mit Ubuntu), brauchen Sie möglicherweise einen anderen Wert für remote_user.
  • Eine Änderung des Instance-Typs zieht ebenfalls Dinge nach sich. i3-Instances nutzen lokal verbundene NVMe-Laufwerke mit einem spezifischen OS-Gerätenamen und entsprechenden Konfigurationseinstellungen in Terraform. Wenn Sie eine andere Instance verwenden und EBS-Volumes anschließen, müssen Sie die Variablen in servers.tf entsprechend ändern. Näheres dazu können Sie der Terraform-Dokumentation entnehmen.

Die Einstellungen, die ich für AMI und den EC2-Instance-Typ verwendet habe, können Sie in variables.tf sehen.

# Name des AMI im AWS Marketplace
variable "aws_ami_name" {
  default = "CentOS Linux 7 x86_64 HVM*"
}
# Eigentümer des AMI
variable "aws_ami_owner" {
  default = "679593333241" # centos.org
}
# Nutzer, der sich bei Instances anmeldet und die Installation durchführt
# Abhängig vom verwendeten AMI, daher müssen die Werte zueinander passen. So würde ein Ubuntu-AMI den Nutzer „ubuntu“ verwenden
variable "remote_user" {
  default = "centos"
}
# ECE-Instance-Typ
variable "aws_instance_type" {
  default = "i3.xlarge"
}
# Gerätename des Nicht-Stamm-Volume, das ECE nutzen wird
# Bei i3-Instances lautet er „nvme0n1“.
# Wenn Sie einen anderen Instance-Typ verwenden, ändert sich dieser Wert. Außerdem müssen eventuell auch Änderungen an der Ressourcendefinition in servers.tf vorgenommen werden.
variable "device_name" {
  default="nvme0n1"
}

Starten

Im Prinzip war das schon alles. Nicht schlecht, oder? Falls Sie einfach die Standardwerte übernommen haben, ohne sich allzu lange mit den Konfigurationsdateien zu beschäftigen, bestand der gesamte Vorgang für Sie daraus, Terraform zu installieren, ein paar Dateien zu kopieren und die eine oder andere Variable festzulegen. Und jetzt? Jetzt starten Sie das Ganze einfach!

Schritte
  1. Initialisieren Sie Terraform.
    > terraform init
    	
  2. Wenden Sie die Konfigurationen an, die wir mit harter Arbeit erstellt haben.
    > terraform apply
    	

So, das wars!

Nach ein paar Minuten sollte ungefähr Folgendes auf dem Bildschirm erscheinen. Diesem Output können Sie die URL und das Admin-Passwort für die ECE-Admin-Konsole entnehmen:

null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ********************************
null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => {
null_resource.run-ansible (local-exec):     "msg": "Adminconsole is reachable at: https://ec2-35-175-235-131.compute-1.amazonaws.com:12443"
null_resource.run-ansible (local-exec): }
null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ********************************
null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => {
null_resource.run-ansible (local-exec):     "msg": "Adminconsole password is: yI6ClXYNQ5LGiZlBuOm94s8hGV5ispQS24WVfL5fE9q"
null_resource.run-ansible (local-exec): }
null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : include_tasks] ************************
null_resource.run-ansible (local-exec): skipping: [ec2-52-70-7-3.compute-1.amazonaws.com]
null_resource.run-ansible (local-exec): PLAY RECAP *********************************************************************
null_resource.run-ansible (local-exec): ec2-34-229-205-85.compute-1.amazonaws.com : ok=68   changed=37   unreachable=0    failed=0    skipped=7    rescued=0    ignored=1
null_resource.run-ansible (local-exec): ec2-35-175-235-131.compute-1.amazonaws.com : ok=68   changed=29   unreachable=0    failed=0    skipped=8    rescued=0    ignored=1
null_resource.run-ansible (local-exec): ec2-52-70-7-3.compute-1.amazonaws.com : ok=68   changed=37   unreachable=0    failed=0    skipped=7    rescued=0    ignored=1
null_resource.run-ansible: Creation complete after 16m50s [id=7701810896203834102]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
Outputs:
ece-instances = [
  [
    "ec2-35-175-235-131.compute-1.amazonaws.com",
    "ec2-34-229-205-85.compute-1.amazonaws.com",
    "ec2-52-70-7-3.compute-1.amazonaws.com",
  ],
]
installed-ece-url = https://ec2-35-175-235-131.compute-1.amazonaws.com:12443

Öffnen Sie sie einfach und probieren Sie es aus. Keine Angst! Wenns schiefgeht, können Sie einfach alles wegwerfen und von vorn beginnen:

> terraform destroy
> terraform apply

Hinweis: Die für TLS verwendeten Zertifikate sind selbstsigniert. Das heißt, dass Sie beim Versuch, auf die Admin-Konsole zuzugreifen, eine Warnung Ihres Browsers angezeigt bekommen. Sie können ECE jederzeit so konfigurieren, dass Ihre eigenen Zertifikate verwendet werden. Mehr zu diesem Thema finden Sie in der Dokumentation.

Happy sein

Happy sein

Ich hoffe, Sie stimmen mir zu, dass der Aufwand dieses Mal deutlich geringer war als beim letzten Mal. Es ist uns gelungen, die AWS-Konsole ganz zu vermeiden und die gefühlt 38 Schritte zu umgehen, die wir gebraucht haben, um alle Ressourcen bereitgestellt, konfiguriert und gesichert zu bekommen (das neue Verfahren schafft das nach meiner Zählung in 10 Schritten).

Geh nun und erober dir die Cloud, denn sie ist klein und du bist ein Riese! Experimentieren Sie mit ECE, richten Sie Cluster ein, upgraden Sie sie und skalieren Sie sie. Enjoy the ease, enjoy the breeze.