Terraform ist ein Infrastructure as Code-Werkzeug von der Firma HashiCorp. Ihre gewünschte IT-Infrastruktur, wie z.B. virtuelle Maschinen, Webserver oder Datenbanken, klicken Sie mit Terraform nicht mehr in mühevoller manueller Handarbeit zurecht. Stattdessen wird eine spezielle Konfigurationsdatei verwendet, mit der eine CLI (Kommandozeilen-Werkzeug) beliebige Software-Komponenten auf einer Ziel-Plattform, z.B. Microsoft Azure, AWS oder Kubernetes, bereitstellt. Mit der Konfigurations-Datei erhält ein IT-Fachmann oder eine IT-Fachfrau alles, um Infrastruktur zu versionieren, zu teilen und wiederzuverwenden – halt alle Vorzüge, die Softwareentwicklung so bietet. Aber das kann man doch auch mit Shell-Programmierung und den entsprechenden APIs der Cloud-Hersteller? Ja, das stimmt. Allerdings bildet Terraform eine herstellerunabhängige vereinheitlichte Schnittstelle, mit der unter der Haube über sogenannte Provider sowohl Cloud- als auch On-Premise-Infrastruktur aufgesetzt wird. Terraform ist also ein hilfreiches Werkzeug für alle, die ihre Infrastruktur austomatisieren wollen, denn:
Und so sieht nun eine Terraform-Konfigurationsdatei aus. Nicht schön aber zweckmäßig:
// Konfigurieren des Microsoft Azure Provider
provider "azurerm" {
subscription_id = "${var.subscription_id}"
tenant_id = "${var.tenant_id}"
client_id = "${var.client_id}"
client_secret = "${var.client_secret}"
version = "=2.3.0"
features {}
}
// Konfigurieren eines SQL-Servers
resource "azurerm_sql_server" "sql_server" {
name = "${var.machine_registry_alias}-${var.environment}-${var.service_version}-sql-server"
resource_group_name = "${var.resource_group_name}"
location = "${var.location}"
version = "12.0"
administrator_login = "${var.administrator_login}"
administrator_login_password = "${var.administrator_login_password}"
}
// Attention! Only for test purpose
resource "azurerm_sql_firewall_rule" "AllowAll" {
name = "AllowAll"
resource_group_name = "${var.resource_group_name}"
server_name = "${azurerm_sql_server.sql_server.name}"
start_ip_address = "0.0.0.0"
end_ip_address = "255.255.255.255"
}
resource "azurerm_sql_database" "sql_database" {
name = "${var.machine_registry_alias}-${var.environment}-${var.service_version}-db"
resource_group_name = "${var.resource_group_name}"
location = "${var.location}"
server_name = "${azurerm_sql_server.sql_server.name}"
edition = "Basic"
}
Terraform ist also ein Werkzeug für die automatisierte Bereitstellung von Infrastruktur-Ressourcen via Kommandozeile und einer Konfigurationsdatei. Softwareentwickler und Administratoren bekommen so alles in die Hand, um ihre Anwendungen rund um zu versorgen. Der Ablauf, um endgültig reale Infrastruktur zu erhalten sieht dann wie folgt aus:
Sollen Änderungen vorgenommen werden, kann das ganze Spiel von vorne anfangen.
Der Workflow besteht also im Kern immer aus Write, Plan und Apply. In der Praxis bestehen Plan und Apply im Wesentlichen aus Kommandozeilenbefehlen. Wie praktisch! Bei einem IaC-Tool wie Terraform ist in diesem Zusammenhang wichtig, dass die State-Datei möglichst nicht durch manuelle Nacharbeiten an der Infrastruktur, z.B. das Verändern einer Preis-Stufe, durcheinanderkommt. Werden generell keine Änderungen ins System eingepflegt, sondern alle Infrastruktur-Ressourcen durch Automatisierungs-Routinen jedes Mal komplett neu aufgesetzt, z.B. mit Terraform, spricht man auch von Immutable Infrastructure.