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 donde se ejecuta el script de forma remota debe ser un recurso de Oracle Cloud Infrastructure con una de las siguientes configuraciones.
- Un punto final privado. Para obtener más información, consulte Private Remote Exec.
- Una dirección IP pública que admite inicios de sesión remotos.
- 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 Managing Keys y Using Master Encryption Keys.
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.
- Genere un par de claves mediante un recurso de Seguridad de Capa de Transporte.
- Al iniciar la instancia informática, utilice la clave pública del recurso de TLS.
- Al establecer la conexión SSH, proporcione la clave privada.
No debe guardar su clave privada en el archivo de configuración de Terraform porque no es una ubicación segura.
En el siguiente ejemplo, se 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 esa 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 Provisioner Connection Settings.