Usando a Execução Remota

Com o serviço Resource Manager, é possível usar a funcionalidade de execução remota do Terraform para executar scripts ou comandos em um computador remoto. Você também pode usar essa técnica para outros provisionadores que requerem acesso ao recurso remoto.

Para obter mais informações, consulte remote-exec Provisioner (terraform.io).

Antes de Começar

  • O local em que o script é executado remotamente deve ser um recurso do Oracle Cloud Infrastructure com uma das configurações a seguir.
  • No Windows, o WinRM deve ser ativado. No Linux ou Unix, o SSH deve ser ativado.
  • Um par de chaves usado para assinar solicitações de API, com a chave pública transferida por upload para a Oracle. Para obter mais informações sobre a geração e o upload de chaves, consulte Chaves Obrigatórias e OCIDs.

Autenticando

Recomendamos o uso de um dos métodos a seguir, dependendo de se você tem acesso ao serviço Vault. Para obter mais informações, consulte Visão Geral do Serviço Vault.

Com o Serviço Vault

Primeiro, use o serviço Vault para criptografar sua chave privada. Para obter mais informações, consulte Managing Keys e Using Master Encryption Keys.

Em seguida, forneça a chave privada criptografada ao serviço Resource Manager. Você pode usar a origem de dados de decriptografia para decriptografá-la.

A amostra de código a seguir demonstra esse processo.

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

Sem o Serviço Vault

Se você não tiver acesso ao serviço Vault, poderá gerar dinamicamente um par de chaves e armazená-lo no arquivo de estado.

  1. Gere um par de chaves usando um recurso TLS.
  2. Quando você iniciar a instância de computação, use a chave pública do recurso TLS.
  3. Ao estabelecer a conexão SSH, forneça a chave privada.
Cuidado

Você não deve salvar sua chave privada no seu arquivo de configuração Terraform porque esse não é um local seguro.

A amostra a seguir demonstra como usar o recurso de chave privada TLS para provisionar uma instância de computação e, em seguida, fazer uma execução remota nessa instância.

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

Construção de Conexão

Este exemplo demonstra como usar uma construção connection para execução remota. O Terraform usa vários padrões ao se conectar com um recurso, mas eles podem ser substituídos usando um bloco connection em um resource ou provisioner. Para obter mais informações, consulte Definições de Conexão do Provisioner.