Uso de la ejecución remota

Con el gestor de recursos, puede utilizar la funcionalidad de ejecución remota de Terraform para ejecutar scripts o comandos en un equipo remoto. También puede utilizar esta técnica para otros aprovisionadores que necesitan acceso al recurso remoto.

Para obtener más información, consulte Provisionador de ejecución remota (terraform.io).

Antes de empezar

  • La ubicación en la que se ejecuta el script de forma remota debe ser un recurso de Oracle Cloud Infrastructure con una de las siguientes configuraciones.
  • En Windows, WinRM debe estar activado. En Linux o Unix, SSH debe estar activado.
  • Par de claves utilizado para firmar solicitudes de API con la clave pública cargada en Oracle. Para obtener más información sobre la generación y carga de claves, consulte OCID y claves necesarios.

Autenticación

Se recomienda utilizar uno de los siguientes enfoques, en función de si tiene acceso al servicio de almacén. Para obtener más información, consulte Visión general de almacén .

Con almacén

En primer lugar, utilice el almacén para cifrar su clave privada. Para obtener más información, consulte Gestión de claves y Uso de claves de cifrado maestras.

A continuación, proporcione la clave privada cifrada al gestor de recursos. Puede utilizar el origen de datos de descifrado para descifrarlo.

El siguiente ejemplo de código muestra este proceso.

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

Sin almacén

Si no tiene acceso al servicio de almacén, puede generar dinámicamente un par de claves y almacenarlas en el archivo de estado.

  1. Genere un par de claves mediante un recurso de Seguridad de Capa de Transporte.
  2. Al iniciar la instancia informática, utilice la clave pública del recurso de TLS.
  3. Al establecer la conexión SSH, proporcione la clave privada.
Atención

No debe guardar la clave privada en el archivo de configuración de Terraform porque no es una ubicación segura.

El siguiente ejemplo muestra cómo utilizar el recurso de clave privada de TLS para aprovisionar una instancia informática y, a continuación, realizar una ejecución remota en dicha instancia.

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

Construcción de conexión

En este ejemplo, se muestra cómo utilizar una construcción connection para la ejecución remota. Terraform utiliza un número de valores por defecto al conectarse a un recurso, pero estos se pueden sustituir mediante un bloque connection en resource o provisioner. Para obtener más información, consulte Conexiones del proveedor.