Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zum Anmelden für einen kostenlosen Account finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Wenn Sie Ihre Übung abgeschlossen haben, ersetzen Sie diese Werte durch die Werte, die für Ihre Cloud-Umgebung spezifisch sind.
Reservierte IP mit Terraform und cloud-init-Skript an eine Oracle Cloud Infrastructure Compute-Instanz anhängen
Einführung
In der Welt von Infrastructure-as-Code (IaC) ist die Automatisierung von Provisioning und Konfiguration von Compute-Instanzen für effiziente und skalierbare Cloud-Deployments unerlässlich. Beim Anhängen reservierter IP-Adressen an Oracle Cloud Infrastructure-(OCI-)Compute-Instanzen bieten Terraform und cloud-init eine leistungsstarke Kombination.
Im OCI Compute-Terraform-Modul können Sie beim Erstellen der Instanz keine reservierte IP an eine Compute-Instanz anhängen. Reservierte IP kann nur nach dem Erstellen der Instanz angehängt werden. In diesem Blogpost erfahren Sie, wie Sie mit Terraform- und cloud-init-Skript nahtlos eine reservierte IP an eine OCI Compute-Instanz anhängen.
Zielsetzung
Hängen Sie eine reservierte IP nahtlos mit Terraform und dem cloud-init-Skript an eine OCI Compute-Instanz an.
Was ist eine reservierte IP?
Eine reservierte IP-Adresse ist eine statische IP-Adresse, die einer Compute-Instanz in einem virtuellen Netzwerk zugewiesen wird. Sie stellt konsistente Konnektivität für Anwendungen sicher, die eine feste IP erfordern, und vereinfacht die Netzwerkadministration. Reservierte IPs werden häufig in Szenarios wie Load Balancing, Firewallregeln und sicherer Netzwerkkommunikation verwendet.
Voraussetzungen
Zunächst benötigen Sie Zugriff auf eine OCI-Umgebung. Wenn Sie noch keine Instanz haben, können Sie ganz einfach Ihre Instanz vom Typ "Immer kostenlos" erstellen. Die Instanz verfügt über zahlreiche freie Kapazitäten und einen Testguthaben von 300 US-Dollar.
Stellen Sie bei einer Umgebung sicher, dass der Benutzer einer Gruppe mit Berechtigungen zum Verwalten der Instanzfamilienressourcen und der Speicherfamilie zugewiesen wurde. In einer Best Practice zur Sicherheit können Sie einen Benutzer erstellen, anstatt einen Konsolenbenutzer zu verwenden, dem bereits Berechtigungen zugewiesen sind. Wenn Sie Hilfe benötigen, lesen Sie die Dokumente, um eine Gruppe zu erstellen und Benutzern die entsprechenden Berechtigungen zu erteilen.
- OCI-Account
- Terraform-Zugriff. Weitere Informationen erhalten Sie unter diesem Link.
- Öffentliches Subnetz, in dem die Instanz gestartet wird. Dies muss mit einem Internetgateway verknüpft werden.
- Privates Subnetz, in dem die sekundäre VNIC erstellt wird und die reservierte IP zuweist. Diese muss an ein Servicegateway angehängt werden.
- Dynamische Gruppe, bei der die Ressourcen in der Gruppe die Berechtigungen zur Verwaltung der Netzwerkfamilie benötigen.
- Policys müssen für die Authentifizierung des Instanz-Principals konfiguriert werden.
Aufgabe 1: Terraform-Skript einrichten
Hier wird ein cloud-init-Skript als Metadaten zu einem OCI Terraform-Modul "Compute-Instanz erstellen" hinzugefügt. Außerdem übergeben wir die OCID der reservierten IP- und des privaten Subnetzes als Freiformtags an die Compute-VM.
resource "oci_core_public_ip" "pubip" {
# In case of Multiple Instances has to be created, Provide the count in the vars file.
# This block creates a Reserved Public IP from Oracle IP Pool
count = var.instance_count
compartment_id = var.compartment_id
display_name = var.res_ip_display_name
lifetime = "RESERVED"
private_ip_id = ""
}
resource "oci_core_instance" "pubiptest" {
count = var.instance_count
compartment_id = var.compartment_id
availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
display_name = var.display_name
shape = var.shape
# We will pass Reserved Public IP OCID and Private Subnet OCID as a freeform tags to the instance
freeform_tags = {
"publicIP" = resource.oci_core_public_ip.pubip[count.index].id
"SubnetId" = var.private_subnet_id
}
create_vnic_details {
display_name = var.vnic_display_name
assign_public_ip = true
subnet_id = var.public_subnet_id
}
source_details {
source_type = var.source_type
source_id = var.source_id
}
metadata = {
ssh_authorized_keys = var.pub_key
user_data = "${base64encode(file("./cloud-init.sh"))}"
}
}
Das obige Skript erstellt eine reservierte IP (über den Wert der Zählvariable) und startet eine Compute-Instanz mit ephemerer IP, die an die primäre VNIC angehängt wird.
In den Compute-Metadaten übergeben wir das cloud-init-Skript, mit dem die reservierte IP durch Ersetzen der vorhandenen ephemeren IP zugewiesen wird.
Aufgabe 2: cloud-init
-Skript verstehen
Aufgabe 2.1: OCI CLI und andere erforderliche Tools installieren
Verwenden Sie den folgenden Befehl, um OCI CLI und jq zu installieren (JSON wird geparst).
`sudo yum install -y python36-oci-cli jq`
Aufgabe 2.2: Instanzmetadaten abrufen
-
Verwenden Sie den Instanzmetadatenservice, der Informationen zu einer ausgeführten Instanz über Networking, Volumes usw. bereitstellt. Dadurch werden Instanz-OCID, Compartment-ID, subnetID (Private Subnetz-OCID, die als Freiformtag übergeben wurde) und publicIP (Reservierte IPOCID, die als Freiformtag übergeben wurde) mit dem Instanzmetadatenservice abgerufen, der auch Freiformtagswerte enthält.
metadata=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v2/instance) instanceid=$(echo $metadata | jq -r '.id') compartmentid=$(echo $metadata | jq -r '.compartmentId') subnetid=$(echo $metadata | jq -r '.freeformTags.SubnetId') publicIp=$(echo $metadata | jq -r '.freeformTags.publicIP')
-
Rufen Sie die OCID der primären VNIC, die private IP-ID (OCID der privaten IP, die der primären VNIC zugewiesen ist), die ephemere öffentliche IP und die ephemere öffentliche IP-OCID mit
oci-cli
abprimaryvnicid=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v1/vnics/ | jq -r '.[].vnicId') privateIpId=$(oci network private-ip list --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data[].id') ephpublicIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') ephpublicIpId=$( oci network public-ip get --auth instance_principal --public-ip-address $ephpublicIp | jq -r '.data.id')
Aufgabe 2.3: Sekundäre VNIC anhängen
Hängen Sie die sekundäre VNIC an die Compute-VM an, die das private Subnetz verwendet, indem Sie den folgenden Befehl ausführen.
oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait
Aufgabe 2.4: Routen konfigurieren
-
Nachdem die sekundäre VNIC erstellt und an die VM angehängt wurde, konfigurieren wir die sekundäre VNIC und fügen sie den Routen hinzu. Zur Konfiguration der Routen verwenden wir das von Oracle bereitgestellte Skript.
wget https://docs.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh sudo chmod u+x ./secondary_vnic_all_configure.sh sudo ./secondary_vnic_all_configure.sh -c
-
Nachdem die Konfiguration abgeschlossen ist, wird die neue Route angezeigt, die den VM-Routen hinzugefügt wurde. Sie können diese mit dem Befehl
sudo route -n
prüfen.
Aufgabe 2.5: Sekundäre VNIC-Route als Standardroute festlegen
-
Rufen Sie die Gateway-IP für die sekundäre VNIC mit IDMS ab. Diese wird der Instanzroutentabelle hinzugefügt.
gatewayIP=$(curl http://169.254.169.254/opc/v1/vnics/ | jq -c '.[] | ( select(.vnicId=="'$secondaryvnicid'" ))' | jq -r '.virtualRouterIp')
-
Rufen Sie die Standardnetzwerkschnittstelle mit dem folgenden Befehl ab.
iname=$(sudo ./secondary_vnic_all_configure.sh | awk '{print $8}' | awk 'END{print}')
-
Führen Sie den folgenden Befehl aus, um die Standardroute als sekundäre VNIC hinzuzufügen.
sudo route add default gw $gatewayIP dev $iname
-
Bestätigen Sie den Vorgang mit dem Befehl
sudo route -n
erneut.
Aufgabe 2.6: Ephemere öffentliche IP löschen
-
Löschen Sie die ephemere öffentliche IP, die an die VM angehängt ist. Da die sekundäre VNIC als Standardroute und das Subnetz mit sekundärer VNIC festgelegt wurde, ist ihr ein Servicegateway zugeordnet, damit sie mit anderen OCI-Services (in diesem Fall VCN) kommunizieren kann.
delpubIp=$(oci network public-ip delete --force --auth instance_principal --public-ip-id $ephpublicIpId --wait-for-state TERMINATED)
-
Mit dem folgenden Befehl können Sie prüfen, ob die ephemere IP erfolgreich gelöscht wurde.
checkIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"')
Aufgabe 2.7: Reservierte IP anhängen
Die öffentliche IP-OCID stammt aus Freiformtags, und die ephermere IP wurde gelöscht. Daher können Sie die reservierte IP an die primäre VNIC anhängen. Der folgende Befehl hängt die reservierte IP an die primäre VNIC der Instanz an.
assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED)
Aufgabe 2.8: Sekundäre VNIC trennen
-
Wir haben die reservierte öffentliche VNIC angehängt. Die sekundäre VNIC kann jetzt getrennt werden. Mit dem folgenden Befehl können Sie die sekundäre VNIC trennen und die Routingregeln entsprechend aktualisieren.
detach=$(oci compute instance detach-vnic --compartment-id $compartmentid --vnic-id $secondaryvnicid --force --auth instance_principal) sudo ./secondary_vnic_all_configure.sh -d
-
Das folgende Skript zeigt alle Schritte zusammen. Dieses Skript hat einen erneuten Versuch bis zu 3 Mal bei einem Fehler und wir können eine Benachrichtigung über einen Fehler mit dem OCI Events-Service einrichten.
#!/bin/bash # coding: utf-8 sudo yum install -y python36-oci-cli function getdetails() { # Fetch data using instance principal authentication metadata=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v2/instance) instanceid=$(echo $metadata | jq -r '.id') compartmentid=$(echo $metadata | jq -r '.compartmentId') subnetid=$(echo $metadata | jq -r '.freeformTags.SubnetId') publicIp=$(echo $metadata | jq -r '.freeformTags.publicIP') primaryvnicid=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v1/vnics/ | jq -r '.[].vnicId') privateIpId=$(oci network private-ip list --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data[].id') ephpublicIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') ephpublicIpId=$( oci network public-ip get --auth instance_principal --public-ip-address $ephpublicIp | jq -r '.data.id') if [[ -z "$subnetid" || "$subnetid" == "" || ${#subnetid} == 0 || -z "$publicIp" || ${#publicIp} == 0 || -z "$instanceid" || -z "$compartmentid" || -z "$publicIpData" || -z "$privateIpId" || -z "$primaryvnicid" || -z "$ephpublicIp" || -z "$ephpublicIpId" ]]; then echo "Missing some details, retrying..." return 1 fi return 0 } # Retry the `getdetails` function thrice attachVNIC() { attachvnic=$(oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait) } for i in {1..3}; do getdetails if [[ $? -eq 0 ]]; then attachVNIC if [[ -n "$attachvnic" ]]; then secondaryvnicid=$(echo $attachvnic | jq -r '.data.id') echo $secondaryvnicid check2VNICs=$(oci compute instance list-vnics --instance-id $instanceid --auth instance_principal | jq -r '.data[].id') echo $check2VNICs gatewayIP=$(curl http://169.254.169.254/opc/v1/vnics/ | jq -c '.[] | ( select(.vnicId=="'$secondaryvnicid'" ))' | jq -r '.virtualRouterIp') if [[ (-n "$gatewayIP") ]]; then echo $gatewayIP wget https://docs.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh sudo chmod u+x ./secondary_vnic_all_configure.sh sudo ./secondary_vnic_all_configure.sh -c iname=$(sudo ./secondary_vnic_all_configure.sh | awk '{print $8}' | awk 'END{print}') echo $iname sudo route add default gw $gatewayIP dev $iname route oci os ns get --auth instance_principal delpubIp=$(oci network public-ip delete --force --auth instance_principal --public-ip-id $ephpublicIpId --wait-for-state TERMINATED) checkIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') if [[ -z "$checkIp" || "$checkIp" == "null" ]]; then echo "Assigning Reserved IP" assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED) detach=$(oci compute instance detach-vnic --compartment-id $compartmentid --vnic-id $secondaryvnicid --force --auth instance_principal) sudo ./secondary_vnic_all_configure.sh -d checkIp2=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') echo "Reserved IP $checkIp2" if [[ -z "$checkIp2" ]]; then oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Reserved IP Not Assigned","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi else oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Ephemeral IP Not Deleted","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi break; else oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Gateway IP not fetched","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi else break; fi fi done if [[ -z "$attachvnic" ]]; then echo "Failed" oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Secondary VNIC not attached","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit fi checkVNICs2=$(oci compute instance list-vnics --instance-id $instanceid --auth instance_principal | jq -r '.data | length') if [[ "$checkVNICs2" > 1 ]]; then echo "Detaching Secondary VNIC Failed" oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Detaching Secondary VNIC Failed","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit fi oci compute instance update --instance-id $instanceid --freeform-tags '{"SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal
Nächste Schritte
Hierbei handelt es sich um eine Beispielimplementierung, in der die entsprechenden Änderungen vorgenommen werden, bevor Sie diese als cloud-init-Skript verwenden. Dieser Test wurde mit Oracle Linux 8 durchgeführt.
Wenn Sie einen anderen Linux-Geschmack wählen, ändert sich die Installationsprozedur oci-cli
. Weitere Details finden Sie unter CLI installieren.
Verwandte Links
Danksagungen
Autor - Rithesh Subramanian (OCI Cloud Architect)
Weitere Lernressourcen
Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube-Kanal zu. Besuchen Sie außerdem die Website education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Produktdokumentation finden Sie im Oracle Help Center.
Attach a Reserved IP to an Oracle Cloud Infrastructure Compute Instance using Terraform and cloud-init Script
F82850-01
June 2023
Copyright © 2023, Oracle and/or its affiliates.