Remoteausführung verwenden
Mit Resource Manager können Sie die Funktionalität der Remoteausführung von Terraform verwenden, um Skripte oder Befehle auf einem Remoterechner auszuführen. Sie können diese Methode auch für andere Provisioner verwenden, die Zugriff auf die Remoteressource benötigen.
Weitere Informationen finden Sie unter remote-exec Provisioner (terraform.io).
Bevor Sie beginnen
- Der Speicherort, an dem das Skript remote ausgeführt wird, muss eine Oracle Cloud Infrastructure-Ressource mit einer der folgenden Konfigurationen sein.
- Ein privater Endpunkt. Weitere Informationen finden Sie unter Private Remoteausführung.
- Eine öffentliche IP-Adresse mit Unterstützung von Remoteanmeldungen.
- Unter Windows muss WinRM aktiviert sein. Unter Linux oder Unix muss SSH aktiviert sein.
- Ein Schlüsselpaar, das zum Signieren von API-Anforderungen verwendet wird, wobei der Public Key in Oracle hochgeladen wird. Weitere Informationen zum Generieren und Hochladen von Schlüsseln finden Sie unter Erforderliche Schlüssel und OCIDs.
Authentifizierung
Oracle empfiehlt, einen der folgenden Ansätze zu verwenden, je nachdem, ob Sie Zugriff auf den Vault-Service haben. Weitere Informationen finden Sie unter Überblick über Vault.
Mit Vault
Zuerst verwenden Sie Vault, um Ihren Private Key zu verschlüsseln. Weitere Informationen finden Sie unter Schlüssel verwalten und Masterschlüsselungsschlüssel verwenden.
Als Nächstes stellen Sie den verschlüsselten Private Key in Resource Manager bereit. Sie können ihn mithilfe der Entschlüsselungsdatenquelle entschlüsseln.
Das folgende Codebeispiel zeigt diesen Prozess.
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"
]
}
}
Ohne Vault
Wenn Sie keinen Zugriff auf den Vault-Service haben, können Sie ein Schlüsselpaar dynamisch generieren und in der Statusdatei speichern.
- Generieren Sie ein Schlüsselpaar mithilfe einer TLS-Ressource.
- Wenn Sie die Compute-Instanz starten, verwenden Sie den Public Key aus der TLS-Ressource.
- Wenn Sie die SSH-Verbindung herstellen, geben Sie den Private Key an.
Sie dürfen Ihren Private Key nicht in der Terraform-Konfigurationsdatei speichern, da es sich dabei nicht um einen sicheren Speicherort handelt.
Das folgende Beispiel zeigt, wie die TLS-Private-Key-Ressource für das Provisioning einer Compute-Instanz verwendet und dann eine Remoteausführung für diese Instanz ausgeführt wird.
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"
]
}
}
Connection-Konstrukt
Dieses Beispiel zeigt, wie ein connection
-Konstrukt für die Remoteausführung verwendet wird. Terraform verwendet beim Herstellen einer Verbindung zu einer Ressource eine Reihe von Standardwerten, die jedoch mit einem connection
-Block in resource
oder provisioner
überschrieben werden können. Weitere Informationen finden Sie unter Provisioner-Verbindungseinstellungen.