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.
- Um ponto final privado. Para obter mais informações, consulte Private Remote Exec.
- Um endereço IP público com suporte a logins remotos.
- 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.
- Gere um par de chaves usando um recurso TLS.
- Quando você iniciar a instância de computação, use a chave pública do recurso TLS.
- Ao estabelecer a conexão SSH, forneça a chave privada.
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.