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.
  • 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.

  1. Generieren Sie ein Schlüsselpaar mithilfe einer TLS-Ressource.
  2. Wenn Sie die Compute-Instanz starten, verwenden Sie den Public Key aus der TLS-Ressource.
  3. Wenn Sie die SSH-Verbindung herstellen, geben Sie den Private Key an.
Achtung

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.