Erstellen einer VM in Azure mit Terraform und for-Schleifen
by Rackspace Technology Staff
Einführung
Sie können ganz einfach mehrere virtuelle Maschinen (VMs) auf Azure® erstellen, indem Sie Hashicorp® Terraform® mit Hilfe von Visual Studio® Code (VS Code) verwenden.
In diesem Blogbeitrag geht es um die Massenerstellung von VMs in Azure. Ich betone auch den Ansatz Infrastructure-as-Code (IaC). Ich verwende VS Code in diesem Blog, aber Sie können Ihre bevorzugte IDE verwenden.
ERSTE SCHRITTE
Ich bin die allgemeinen Anforderungen für die Erstellung mehrerer VMs in Azure mit einigen spezifischen Standard- oder typischen Nomenklaturen durchgegangen. Selbst wenn wir etwas im Handumdrehen bauen, müssen wir alles mit Argusaugen überwachen, um unsere Standards aufrechtzuerhalten. Und es ist gar nicht so einfach, den Standard beizubehalten, vor allem, weil wir für den VM-Namen, die Betriebssystemfestplatte, die Datenfestplatte, den Namen des Netzwerkkarten-Controllers (NIC) usw. denselben Namenskanon einhalten müssen.
Mit IaC können wir jeden Aspekt der Einhaltung von Standards verwalten, einschließlich der Dinge, die wir im Backend auf der realen Oberfläche erstellen.
Ich habe einen einfachen Terraform-Code geschrieben, um zwei VMs in Azure mit ähnlichen Namen für jede Ressource zu erstellen. Ich verwende auch Tags, die eine neue Art der Trennung von Dingen sind. Legen wir also gleich los und machen uns die Hände mit Terraform schmutzig.
Die Erstellung einer Azure-VM erfordert eine Ressourcengruppe (RG), ein virtuelles Netzwerk (VNet), ein Subnetz, eine Netzwerkkarte und eine VM-Konfiguration. Aus diesem Grund sollten wir alle Dateien getrennt aufführen, damit sie leicht zu verstehen sind.
Erstellen Sie die Ressourcengruppendatei
Zunächst müssen wir einen RG-Codeblock in der Hashicorp-Konfigurationssprache (HCL) erstellen. Legen wir zwei RGs an (eine für die VM und die Netzwerkkarte und eine weitere für die Netzwerkfunktionen). Als beste Praxis empfehle ich nicht, alles zusammen aufzubewahren. Bevor Sie die RGs erstellen, definieren Sie einen Provider-Block für Terraform, damit es versteht, dass wir Azure-Ressourcen bereitstellen. Speichern Sie diese Informationen für Terraform in einer separaten Datei namens providers.tf:
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Der RG-Code, rg.tf:
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Erstellen Sie die VNET- und Subnetzdateien
Die zweite Aufgabe besteht nun darin, ein VNet und ein Subnetz für unsere VM zu erstellen. Der VNet-Block,vnet.tf:
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Und der Teilnetzcode, subnet.tf
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Erstellen Sie die NIC-Datei
Wir sind fast fertig mit dem Netzwerkzeug, außer der NIC unserer VM. Legen wir den NIC-Code in die RG der VM. Beachten Sie, dass ich die App RG in resource\_group\_name referenziert habe, da mir die Aufbewahrung von NIC-Details in der Network RG nicht zusagt.
Der NIC-Code: Nic.tf:
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Erstellen Sie die Speicherdatei
Jetzt sind wir mit dem ganzen Netzwerkkram fertig, aber die meisten Leute halten eine VM ohne aktivierte Diagnoseeinstellungen für einen schlechten Build. Und ich möchte nicht, dass man mich einen "neuen Erbauer" nennt! Der Code des Speicherkontos ist einfach, und wenn wir ihn verwenden, können wir uns als gute Azure-Implementierer bezeichnen.
Die Datei für das Speicherkonto, storage_account.tf:
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Erstellen Sie die VM-Datei
Wir sind nun bereit für den VM-Code, aber denken Sie daran, dass wir dieselben Standards wie zuvor verwenden müssen, z. B. VM-Name, NIC-Name, Festplattenname und so weiter.
Endgültiger Code für unsere VM, vm.tf:
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Erstellen Sie die Variablendatei
Schließlich habe ich einige Dinge in Variablen gespeichert, z. B. die Namen aller VMs. Sie können andere Elemente in Variablen einfügen, z. B. RG-, VNet- und Subnetznamen. Die Verwendung von Variablen hilft, wenn man riesige Builds macht.
Die Variablendatei, Variable.tf:
< Drupal-Entität data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>
Erstellen der VMs
Mein Ziel ist es, zwei VMs mit Hilfe einer for-Schleife zu erstellen. So enthält die Variable vm_name zwei VM-Namen (Sie können mehrere hinzufügen), und die zweite Variable ist der Ort, an dem ich die Azure-Ressourcen bereitstellen möchte.
Ich möchte Ihnen mitteilen, wie ich meine Standards beibehalten habe: Ich habe VMName-nic für jede NIC, VMName-Osdiskund -data1verwendet. Alle Ressourcen wie VM, NIC und DISK erscheinen mit der gleichen Nomenklatur, so dass wir leicht verstehen können, welche Ressourcen zu welcher VM gehören.
Bereitstellung von
Kommen wir zur Sache und lernen, wie man die VMs in Azure bereitstellt. Es ist Zeit, die Eier zu kochen. Der Einfachheit halber verwende ich für diese Aufgabe die Azure-Befehlszeilenschnittstelle (CLI), anstatt einen richtigen DevOps-Ansatz zu verwenden und dies über eine Pipeline laufen zu lassen und die Site-Dateien an einem anderen Ort als unserem Verzeichnis zu speichern.
Wenn Sie das `az` CLI nicht auf Ihrem Rechner haben, können Sie es unter [installieren] (https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest).
1. Anmeldung bei Azure: az login
2. Prüfen Sie, wie viele Abonnements wir für diesen Mieter haben: az account list --output table
3. Legen Sie das richtige Abonnement für unseren Einsatz fest:
az account set --subscription "XXXXXX-XXXXXXXXX-XXXX-XXX"
4. Navigieren Sie zu dem Verzeichnis, in dem wir alle Terraform-Codedateien abgelegt haben (ich habe für dieses Beispiel temp verwendet, aber ich empfehle diesen Ort nicht):
cd C:\temp
5. Initialisieren Sie Terraform in diesem Verzeichnis:
terraform-Init
6. Führen Sie den Terraform-Plan aus, um zu prüfen, was wir bauen werden, und speichern Sie die Planausgabe für die spätere Verwendung, indem Sie das Flag "-out" in den Befehl einfügen:
terraformplan
oder
terraformplan
7. Führen Sie den Terraform-Code für die Bereitstellung aus und geben Sie bei der Bestätigungsprüfung "yes" ein oder verwenden Sie -auto-approve , um die manuelle Bestätigung zu überspringen:
terraform anwenden
oder
terraform anwenden
8. Überprüfen Sie die von Ihnen erstellte VM:
az vm list -o table
Einige geheime Hacks für Schleifen
Sie können mehrere VMs erstellen, indem Sie eine Terraform for-Schleife ausführen, wie im folgenden Code gezeigt. Die Schleife wird so oft ausgeführt, wie Sie die Variable definiert haben (in unserem Fall zweimal, weil ich zwei VM-Namen in der Variable definiert habe):
for_each = toset(var.vm_name)
Das `jedes` Objekt:
Die for-Schleife in Terraform hat ein Schlüsselpaar, Schlüssel und Wert, aber beide sind im Allgemeinen ähnlich.In Ressourcenblöcken, in denen Sie for_eacheinstellen, können Sie zusätzliche reach Objekte in Ihren Ausdrücken verwenden, um die Konfiguration der einzelnen Instanzen zu ändern.
Und jedes Objekt hat zwei Attribute:
- each.key: Der Map-Schlüssel (oder das Set-Mitglied), der dieser Instanz entspricht.
- each.value: Der Kartenwert, der dieser Instanz entspricht. Wenn Sie einen Satz zur Verfügung gestellt haben, ist dies dasselbe wie each.key.
Sie können den Terraform fmt Befehl verwenden, um den Code zu formatieren, wie z.B. das Umschreiben von Terraform-Konfigurationsdateien, um einem kanonischen Format und Stil zu entsprechen. Dieser Befehl wendet eine Teilmenge der Terraform Sprachstilkonventionen an, zusammen mit anderen kleineren Anpassungen für die Lesbarkeit.
Fazit
Viel Spaß mit Terraform für Azure und Einhaltung von Standards mit einfachem Code
Recent Posts
Der Bericht über den Zustand der Cloud 2025
Januar 10th, 2025
Google Cloud Hybrid Networking-Muster - Teil 2
Oktober 16th, 2024
Google Cloud Hybrid Networking-Muster - Teil 2
Oktober 15th, 2024
How Rackspace Leverages AWS Systems Manager
Oktober 9th, 2024
Windows Server verhindert Zeitsynchronisation mit Rackspace NTP
Oktober 3rd, 2024