Die nächste Iteration der VM ist die Konfiguration eines Webservers auf der VM sowie das Hinzufügen einer Auto-Scaling-Funktion und eines Load Balancers. Da ich mich mit Linux nicht so gut auskenne, habe ich einen etwas anderen Ansatz gewählt. Yevgeniy verwendet in seinem Buch die folgende “user_data”-Option, um eine Website über die VM bereitzustellen.
user_date = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
Ich habe versucht, dies als Skript in der gerade bereitgestellten VM zum Laufen zu bringen, aber ich habe nicht herausgefunden, wie das am besten geht. Vielleicht eine Herausforderung für später. Andersherum betrachtet: Was ist der normale Weg in Azure, um etwas in einer gerade bereitgestellten VM auszuführen? Normalerweise verwende ich die Custom Script Extensions, um einen Befehl in einer Maschine auszuführen. Besonders bei Windows-VMs würde ich hier eine Desired State Configuration nutzen. Mehr über Custom Script Extensions für Linux-VMs findet ihr in diesem Docs-Artikel.
Mit diesem Wissen können wir nun einen Abschnitt in unserem Skript hinzufügen, um eine Custom Script Extension bereitzustellen:
resource "azurerm_virtual_machine_extension" "myFirstTerraform" {
name = "myFirstTerraform-Script"
virtual_machine_id = azurerm_linux_virtual_machine.myFirstTerraform.id
publisher = "Microsoft.Azure.Extensions"
type = "CustomScript"
type_handler_version ="2.0"
settings = <<SETTINGS
{
"commandToExecute" : "apt-get -y update && apt-get install -y apache2"
}
SETTINGS
}
Die wichtige Konfiguration befindet sich im settings-Abschnitt. Ich habe den Befehl zur Installation eines Apache-Webservers auf der Maschine hinzugefügt, damit die Standard-Website über Port 80 ausgeliefert wird. Das einzige Problem ist, dass unsere Netzwerksicherheitsgruppe (NSG) nur den SSH-Port geöffnet hat. Wir müssen also eine zusätzliche Regel in der NSG hinzufügen:
resource "azurerm_network_security_group" "myFirstTerraform" {
name = "myFirstTerraform"
location = azurerm_resource_group.myFirstTerraform.location
resource_group_name = azurerm_resource_group.myFirstTerraform.name
security_rule {
name = "SSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
security_rule {
name = "WebServer"
priority = 1002
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "80"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
Wenn wir jetzt unser Skript ausführen, können wir die Standard-Apache-Website auf unserer Linux-VM in Azure sehen:

Um sich mit dieser Website zu verbinden, wäre es gut zu wissen, welche öffentliche IP unserer Linux-VM zugewiesen wurde. Wie wir im Buch gelernt haben, können wir dafür Output-Variablen nutzen. Aber es gibt einen wichtigen Unterschied: In Azure ist eine öffentliche IP eine eigene Ressource und wird einem Netzwerkinterface zugewiesen, das dann einer VM zugeordnet wird. Wir müssen also die IP in unserem Output referenzieren und nicht die VM.
Was bedeutet das für unser Skript:
output "public_ip" {
value = azurerm_public_ip.myFirstTerraform.ip_address
description = "Das ist die zugewiesene öffentliche IP unserer VM"
}
Nachdem wir diesen Output zu unserem Skript hinzugefügt haben, können wir die IP nach dem Anwenden abrufen:
$ terraform apply
Outputs:
public_ip = 51.136.162.193
Wenn wir den Output der letzten Terraform-Bereitstellung erneut benötigen:
$ terraform output public_ip
51.136.162.193
Jetzt kennt ihr die IP, um die Apache-2-Standard-Website aufzurufen.
