Uso di Remote Exec
Resource Manager consente di utilizzare la funzionalità di esecuzione remota di Terraform per eseguire script o comandi su un computer remoto. È inoltre possibile utilizzare questa tecnica per altri provider che richiedono l'accesso alla risorsa remota.
Per ulteriori informazioni, vedere Provisioning di esecuzione remota (terraform.io).
Informazioni preliminari
- La posizione in cui lo script viene eseguito in remoto deve essere una risorsa Oracle Cloud Infrastructure con una delle seguenti configurazioni.
- Un endpoint privato. Per ulteriori informazioni, vedere Esecutore remoto privato.
- Un indirizzo IP pubblico con il supporto dei login remoti.
- In Windows, è necessario abilitare WinRM. Su Linux o Unix, SSH deve essere abilitato.
- Coppia di chiavi utilizzata per firmare le richieste API, con la chiave pubblica caricata in Oracle. Per ulteriori informazioni sulla generazione e il caricamento delle chiavi, vedere Chiavi e OCID obbligatori.
Autenticazione in corso
Si consiglia di utilizzare uno dei seguenti approcci, a seconda che si disponga dell'accesso al servizio Vault. Per ulteriori informazioni, vedere Panoramica del vault.
Con vault
In primo luogo, utilizzare Vault per cifrare la chiave privata. Per ulteriori informazioni, vedere Gestione delle chiavi e Utilizzo delle chiavi di cifratura master.
Successivamente, fornire la chiave privata cifrata a Resource Manager. È possibile utilizzare l'origine dati di decifrazione per decifrarla.
Il seguente esempio di codice illustra questo processo.
data "oci_kms_decrypted_data" "private_key_decrypted" {
#Required
ciphertext = "${file(var.encrypted_private_key_path)}"
crypto_endpoint = "${var.decrypted_data_crypto_endpoint}"
key_id = "${var.kms_encryption_key_id}"
}
resource "oci_core_instance" "TFInstance1" {
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[var.availability_domain - 1],"name")}"
compartment_id = "${var.compartment_ocid}"
display_name = "TFInstance"
hostname_label = "instance3"
shape = "${var.instance_shape}"
subnet_id = "${oci_core_subnet.ExampleSubnet.id}"
source_details {
source_type = "image"
source_id = "${var.instance_image_ocid[var.region]}"
}
extended_metadata {
ssh_authorized_keys = "${var.ssh_public_key}"
}
}
resource "null_resource" "remote-exec" {
depends_on = ["oci_core_instance.TFInstance1"]
provisioner "remote-exec" {
connection {
agent = false
timeout = "30m"
host = "${oci_core_instance.TFInstance1.public_ip}"
user = "${var.opc_user_name}"
private_key = "${data.oci_kms_decrypted_data.test_decrypted_data.plaintext}"
}
inline = [
"touch ~/IMadeAFile.Right.Here"
]
}
}
Senza vault
Se non si dispone dell'accesso al servizio Vault, è possibile generare dinamicamente una coppia di chiavi e memorizzarle nel file di stato.
- Generare una coppia di chiavi utilizzando una risorsa TLS.
- Quando avvii l'istanza di computazione, usa la chiave pubblica della risorsa TLS.
- Quando si stabilisce la connessione SSH, fornire la chiave privata.
Non è consigliabile salvare la chiave privata nel file di configurazione Terraform perché non si tratta di una posizione sicura.
L'esempio seguente illustra come utilizzare la risorsa chiave privata TLS per eseguire il provisioning di un'istanza di computazione, quindi eseguire un'esecuzione remota su tale istanza.
resource "tls_private_key" "public_private_key_pair" {
algorithm = "RSA"
}
resource "oci_core_instance" "TFInstance1" {
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[var.availability_domain - 1],"name")}"
compartment_id = "${var.compartment_ocid}"
display_name = "TFInstance"
hostname_label = "instance3"
shape = "${var.instance_shape}"
subnet_id = "${oci_core_subnet.ExampleSubnet.id}"
source_details {
source_type = "image"
source_id = "${var.instance_image_ocid[var.region]}"
}
extended_metadata {
ssh_authorized_keys = "${tls_private_key.public_private_key_pair.public_key_openssh}"
}
}
resource "null_resource" "remote-exec" {
depends_on = ["oci_core_instance.TFInstance1"]
provisioner "remote-exec" {
connection {
agent = false
timeout = "30m"
host = "${oci_core_instance.TFInstance1.public_ip}"
user = "${var.opc_user_name}"
private_key = "${tls_private_key.public_private_key_pair.private_key_pem}"
}
inline = [
"touch ~/IMadeAFile.Right.Here"
]
}
}
Costruzione connessione
In questo esempio viene illustrato come utilizzare un costrutto connection
per l'esecuzione remota. Terraform utilizza una serie di impostazioni predefinite durante la connessione a una risorsa, ma tali impostazioni possono essere sostituite utilizzando un blocco connection
in un resource
o provisioner
. Per ulteriori informazioni, vedere Impostazioni connessione provisioninger.