Проблема с подключением с использованием закрытого ключа SSH

#ssh #terraform

#ssh #terraform

Вопрос:

Я очень новичок в terraform и пытаюсь исследовать. Я использую digitalocean в качестве ресурса. Я могу создать droplet и теперь хочу снабдить его некоторым программным обеспечением. Но не удается установить с ним соединение.

Я использую виртуальную машину на своем ноутбуке, поэтому хочу использовать свой закрытый ключ SSH для доступа к droplet. Поэтому я копирую свой SSH-ключ в файл через terraform machine и указываю его путь. Ниже приведена моя конфигурация:

 provider "digitalocean" {
  token = "${var.do_token}"
}

resource "digitalocean_droplet" "web" {
  name = "web"
  size = "${var.size}"
  image = "${var.image}"
  region = "${var.region}"
  ssh_keys = [23625200]
  private_networking = "true"
}
connection {
  user = "root"
  type = "ssh"
  private_key = "${file("/root/id_rsa")}"
  timeout = "2m"
 }
 

Закрытый ключ моего ноутбука доступен через компьютер terraform в /root/id_rsa файле.

При попытке проверки или планирования я получаю сообщение об ошибке ниже:

 Error: Unknown root level key: connection
 

Не могли бы вы помочь мне, что я здесь делаю не так?

Заранее спасибо.

Комментарии:

1. Вы пытаетесь сделать что-то автоматически через SSH, например, установить какое-то программное обеспечение при создании капли? Или вам просто нужен доступ к нему для последующих одноранговых подключений? Если это первое, то вам нужно определить это соединение как часть поставщика. Если последнее, то вам это вообще не нужно.

2. @ydaetskcoR, да .. как только SSH-соединение станет успешным, я также установлю некоторое программное обеспечение, потому что мы также будем выполнять подготовку через terraform.

3. @ydaetskcoR, я прочитал какую-то статью, и все они показывают, что мы можем определить соединение внутри `поставщика ресурсов . I will define the connection inside «, но у меня есть еще один вопрос, который нам нужно определить для каждого соединения provisioner , если мы используем несколько поставщиков внутри одного .tf файла?

Ответ №1:

Ваш connection блок должен быть частью поставщика, который, в свою очередь, является частью ресурса (потенциально null_resource ресурса, если никакой другой ресурс не имеет смысла).

Итак, в вашем случае у вас должно быть что-то вроде этого:

 resource "digitalocean_droplet" "web" {
  name               = "web"
  size               = "${var.size}"
  image              = "${var.image}"
  region             = "${var.region}"
  ssh_keys           = [23625200]
  private_networking = "true"

  provisioner "remote-exec" {
    connection {
      host        = "${self.ipv4_address}"
      user        = "root"
      type        = "ssh"
      private_key = "${file("/root/id_rsa")}"
      timeout     = "2m"
    }

    inline = [
      "yum -y install httpd",
    ]
  }
}
 

Комментарии:

1. Спасибо, что указали мне правильное направление. Теперь я могу использовать SSH и устанавливать программное обеспечение на свой droplet.