Utilisation de la fonctionnalité remote-exec
Avec le gestionnaire de ressources, vous pouvez utiliser la fonctionnalité remote-exec 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 données qui nécessitent l'accès à la ressource distante.
Pour plus d'informations, voir Provisionnement d'exécution à distance (terraform.io).
Avant de commencer
- L'emplacement où le script est exécuté à distance doit être une ressource Oracle Cloud Infrastructure avec l'une des configurations suivantes.
- Un point d'extrémité privé. Pour plus d'informations, voir Exécution distante privée.
- Une adresse IP publique avec prise en charge des connexions distantes.
- Sous Windows, WinRM doit être activé. Sous Linux ou Unix, SSH doit être activé.
- Une paire de clés utilisée pour signer des demandes d'API, avec la clé publique chargée dans Oracle. Pour plus d'informations sur la génération et le chargement de clés, voir Clés et OCID requis.
Authentification
Nous recommandons d'utiliser l'une des approches suivantes, selon que vous avez accès ou non au service de chambre forte. Pour plus d'informations, voir Aperçu du service de chambre forte.
Avec le service de chambre forte
Vous devez d'abord utiliser le service de chambre forte pour chiffrer votre clé privée. Pour plus d'informations, voir Gestion des clés et Utilisation des clés de chiffrement principales.
Ensuite, fournissez la clé privée chiffrée au gestionnaire de ressources. Vous pouvez utiliser la source de données de déchiffrement pour la déchiffrer.
L'exemple de code suivant montre 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 le service de chambre forte
Si vous n'avez pas accès au service de chambre forte, vous pouvez générer dynamiquement une paire de clés et la stocker dans le fichier d'état.
- Générez une paire de clés à l'aide d'une ressource TLS.
- Lorsque vous lancez l'instance de calcul, utilisez la clé publique de la ressource TLS.
- Lorsque vous établissez la connexion SSH, fournissez la clé privée.
Vous ne devez pas enregistrer votre clé privée dans le fichier de configuration Terraform, car cet emplacement n'est pas sécurisé.
L'exemple suivant montre comment utiliser la ressource de clé privée TLS pour provisionner une instance de calcul, puis comment effectuer 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"
]
}
}
Utilisation d'un bloc de connexion
Cet exemple montre comment utiliser unebloc connection
pour créer une exécution distante. Terraform utilise plusieurs 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 élément resource
ou provisioner
. Pour plus d'informations, voir Paramètres de connexion au fournisseur.