Utilisation de l'exécution distante

Avec Resource Manager, vous pouvez utiliser la fonctionnalité d'exécution distante de Terraform pour exécuter des scripts ou des commandes sur un ordinateur distant. Vous pouvez également utiliser cette technique pour d'autres fournisseurs de provisionnement qui exigent un accès à la ressource distante.

Pour plus d'informations, reportez-vous à la section remote-exec Provisioner (terraform.io).

Avant le début

  • L'emplacement où le script est exécuté à distance doit être une ressource Oracle Cloud Infrastructure avec l'une des configurations suivantes.
  • Sous Windows, WinRM doit être activé. Sous Linux ou Unix, SSH doit être activé.
  • Une paire de clés doit être utilisée pour la signature des demandes d'API, et la clé publique doit être téléchargée vers Oracle. Pour plus d'informations sur la génération et le téléchargement de clés, reportez-vous à Clés et OCID requis.

Authentification

Nous vous recommandons d'utiliser l'une des approches suivantes, selon que vous avez accès ou non au service Vault. Pour plus d'informations, reportez-vous à Présentation de Vault.

Avec Vault

Tout d'abord, utilisez Vault pour crypter votre clé privée. Pour plus d'informations, reportez-vous à Gestion des clés et à Utilisation des clés de cryptage maître.

Ensuite, fournissez la clé privée cryptée à Resource Manager. Vous pouvez utiliser la source de données de décryptage pour la décrypter.

L'exemple de code suivant illustre ce processus.

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"
    ]
  } 
}

Sans Vault

Si vous n'avez pas accès au service Vault, vous pouvez générer une paire de clés de façon dynamique et la stocker dans le fichier d'état.

  1. Générez une paire de clés à l'aide d'une ressource TLS.
  2. Lorsque vous lancez l'instance de calcul, utilisez la clé publique à partir de la ressource TLS.
  3. Lorsque vous établissez la connexion SSH, indiquez la clé privée.
Attention

Vous ne devez pas enregistrer votre clé privée dans votre fichier de configuration Terraform car il ne s'agit pas d'un emplacement sécurisé.

L'exemple suivant montre comment affecter une instance de calcul à l'aide de la ressource de clé privée TLS, puis exécuter une exécution distante sur cette instance.

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"
    ]
  } 
}

Construction connection

Cet exemple montre comment utiliser une construction connection pour une exécution distante. Terraform utilise un certain nombre de valeurs par défaut lors de la connexion à une ressource, mais ces valeurs peuvent être remplacées à l'aide d'un bloc connection dans un bloc resource ou provisioner. Pour plus d'informations, reportez-vous à la page relative aux connexions d'un fournisseur de provisionnement.