Nota:
- Questa esercitazione richiede l'accesso a Oracle Cloud. Per iscriversi a un account gratuito, consulta Inizia a utilizzare Oracle Cloud Infrastructure Free Tier.
- Utilizza valori di esempio per le credenziali, la tenancy e i compartimenti di Oracle Cloud Infrastructure. Al termine del laboratorio, sostituisci questi valori con quelli specifici del tuo ambiente cloud.
Collega un IP riservato a un'istanza di computazione Oracle Cloud Infrastructure utilizzando Terraform e uno script di inizializzazione cloud
Introduzione
Nel mondo dell'infrastruttura sotto forma di codice (IaC), l'automazione del provisioning e della configurazione delle istanze di computazione è essenziale per distribuzioni cloud efficienti e scalabili. Quando si tratta di collegare gli indirizzi IP riservati alle istanze di computazione Oracle Cloud Infrastructure (OCI), Terraform e cloud-init forniscono una potente combinazione.
Nel modulo Terraform di OCI Compute non è disponibile alcuna opzione per collegare un IP riservato a un'istanza di computazione durante la creazione dell'istanza. È possibile collegare l'IP riservato solo dopo la creazione dell'istanza. In questo post del blog esploreremo come utilizzare lo script Terraform e cloud-init per collegare senza problemi un IP riservato a un'istanza di computazione OCI.
Obiettivo
Collega un IP riservato a un'istanza di computazione OCI in modo trasparente utilizzando Terraform e uno script cloud-init.
Descrizione di un IP riservato
Un indirizzo IP riservato è un IP statico assegnato a un'istanza di computazione all'interno di una rete virtuale. Garantisce la connettività coerente per le applicazioni che richiedono un IP fisso e semplifica l'amministrazione della rete. Gli IP riservati vengono comunemente utilizzati in scenari come il bilanciamento del carico, le regole firewall e la comunicazione di rete sicura.
Prerequisiti
In primo luogo, è necessario accedere a un ambiente OCI. Se non disponi di un'istanza, puoi creare facilmente l'istanza Sempre gratis, dotata di tanta capacità gratuita e 300 dollari di crediti di prova.
Quando si dispone di un ambiente, assicurarsi che l'utente sia stato assegnato a un gruppo con le autorizzazioni per gestire le risorse della famiglia di istanze e la famiglia di storage. Una procedura ottimale di sicurezza prevede la creazione di un utente anziché l'utilizzo di un utente della console a cui sono già assegnate autorizzazioni. Se hai bisogno di aiuto, consulta la documentazione per creare un gruppo e concedere le autorizzazioni appropriate agli utenti.
- Account OCI
- Accesso a Terraform. Vedere questo collegamento per ulteriori dettagli.
- Subnet pubblica, in cui verrà avviata l'istanza. Deve essere collegato a un gateway Internet.
- Subnet privata, in cui la VNIC secondaria viene creata e assegna l'IP riservato. Deve essere collegato a un gateway di servizi.
- Gruppo dinamico in cui le risorse del gruppo richiedono le autorizzazioni per gestire la famiglia di rete.
- È necessario configurare i criteri per l'autenticazione del principal istanza.
Task 1: Impostazione di uno script Terraform
In quest'area verrà aggiunto uno script di inizializzazione cloud come metadati a un modulo di istanza di computazione Terraform OCI. Inoltre, passeremo l'OCID IP riservato e l'OCID subnet privata alla VM di computazione come tag in formato libero.
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"))}"
}
}
Lo script precedente creerà un IP riservato (considerando il valore della variabile di conteggio) e attiverà un'istanza di computazione con un IP effimero, collegato alla VNIC primaria.
Nei metadati di computazione passeremo lo script cloud-init, che assegnerà l'IP riservato sostituendo l'IP effimero esistente.
Task 2: Comprendere lo script cloud-init
Task 2.1: installare l'interfaccia CLI OCI e altri strumenti necessari
Utilizzare il comando riportato di seguito per installare CLI e jq OCI (analisi JSON).
`sudo yum install -y python36-oci-cli jq`
Task 2.2: Recupera metadati istanza
-
Usa il servizio di metadati dell'istanza che fornisce informazioni su un'istanza in esecuzione da networking, volumi e così via. In questo modo viene recuperato l'OCID dell'istanza, l'ID del compartimento, subnetID (OCID della subnet privata passato come tag in formato libero) e publicIP (IPOCID riservato passato come tag in formato libero) utilizzando il servizio di metadati dell'istanza che include anche i valori delle tag in formato libero.
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') -
Recupera l'OCID VNIC primaria, l'ID IP privato (OCID dell'IP privato assegnato alla VNIC primaria), l'IP pubblico effimero e l'OCID IP pubblico effimero utilizzando
oci-cliprimaryvnicid=$(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')
Task 2.3: Collega VNIC secondaria
Collega la VNIC secondaria alla VM di computazione che utilizzerà la subnet privata eseguendo il comando seguente.
oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait
Task 2.4: Configura instradamenti
-
Una volta creata e collegata la VNIC secondaria alla VM, ne verrà configurata la VNIC secondaria e le verrà aggiunta agli instradamenti. Per configurare gli instradamenti, verrà utilizzato lo script fornito da Oracle.
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 -
Una volta completata la configurazione, verrà visualizzato il nuovo instradamento aggiunto agli instradamenti VM. È possibile controllare lo stesso funzionamento utilizzando il comando
sudo route -n.
Task 2.5: Imposta instradamento VNIC secondario come instradamento predefinito
-
Ottenere l'IP del gateway per la VNIC secondaria utilizzando IDMS. Questa operazione verrà aggiunta alla tabella di instradamento istanza.
gatewayIP=$(curl http://169.254.169.254/opc/v1/vnics/ | jq -c '.[] | ( select(.vnicId=="'$secondaryvnicid'" ))' | jq -r '.virtualRouterIp') -
Recuperare l'interfaccia di rete predefinita utilizzando il comando riportato di seguito.
iname=$(sudo ./secondary_vnic_all_configure.sh | awk '{print $8}' | awk 'END{print}') -
Eseguire il comando riportato di seguito per aggiungere l'instradamento predefinito alla VNIC secondaria.
sudo route add default gw $gatewayIP dev $iname -
Confermare di nuovo utilizzando il comando
sudo route -n.
Task 2.6: Elimina IP pubblico effimero
-
Elimina l'IP pubblico effimero collegato alla VM. Poiché la VNIC secondaria era l'instradamento predefinito e la subnet che dispone di VNIC secondarie esiste, dispone di un gateway di servizi collegato, in modo che possa parlare con altri servizi OCI (VCN in questo caso).
delpubIp=$(oci network public-ip delete --force --auth instance_principal --public-ip-id $ephpublicIpId --wait-for-state TERMINATED) -
Usare il comando riportato di seguito per verificare se l'eliminazione dell'IP effimero è riuscita.
checkIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"')
Task 2.7: Allega IP riservato
Abbiamo l'OCID IP pubblico dalle tag in formato libero e abbiamo eliminato l'IP effimero in modo da poter collegare l'IP riservato alla VNIC primaria. Il comando riportato di seguito consente di collegare l'IP riservato alla VNIC primaria dell'istanza.
assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED)
Task 2.8: Scollegare la VNIC secondaria
-
Abbiamo collegato la scheda Pubblico riservato alla VNIC primaria e ora siamo in grado di scollegare la VNIC secondaria. Utilizza il comando riportato di seguito per scollegare la VNIC secondaria e aggiornare di conseguenza le regole di instradamento.
detach=$(oci compute instance detach-vnic --compartment-id $compartmentid --vnic-id $secondaryvnicid --force --auth instance_principal) sudo ./secondary_vnic_all_configure.sh -d -
Lo script seguente mostra tutti i passi insieme. Questo script ha eseguito un nuovo tentativo fino a 3 volte in caso di errore ed è possibile impostare la notifica dell'errore utilizzando il servizio Eventi OCI.
#!/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
Passi successivi
Questo è un'implementazione di esempio e apporta le modifiche corrispondenti prima di utilizzare questo script come script cloud-init. Questo è stato testato con Oracle Linux 8.
Se si sceglie un valore qualsiasi per Linux Flavor, la procedura di installazione oci-cli verrà modificata. Per ulteriori dettagli, vedere Installazione dell'interfaccia CLI.
Collegamenti correlati
Approvazioni
Autore - Rithesh Subramanian (Architetto cloud OCI)
Altre risorse di apprendimento
Esplora altri laboratori su docs.oracle.com/learn o accedi a contenuti di formazione gratuiti sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Explorer di Oracle Learning.
Per la documentazione sul prodotto, visitare il sito 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.