【问题标题】:Connection issue using SSH Private key使用 SSH 私钥的连接问题
【发布时间】:2019-04-18 22:13:08
【问题描述】:

我对 terraform 非常陌生,并且正在尝试探索。我正在使用 digitalocean 作为资源。我能够创建液滴,现在想用一些软件来配置它。但无法与之建立联系。

我在笔记本电脑上使用虚拟机,所以想使用我的私人 SSH 密钥来访问 Droplet。所以我将我的 SSH 密钥复制到 terraform 机器上的文件中并给出它的路径。以下是我的配置:

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

你能帮我看看我在这里做错了什么吗?

提前致谢。

【问题讨论】:

  • 您是否尝试通过 SSH 自动执行某些操作,例如在创建 droplet 时安装一些软件?或者您只是想访问它以进行临时连接?如果是前者,那么你需要定义这个connection as part of a provisioner。如果是后者,你根本不需要它。
  • @ydaetskcoR,是的..一旦 SSH 连接成功,我也会安装一些软件,因为我们也会通过 terraform 进行配置。
  • @ydaetskcoR,我阅读了一些文章,所有文章都表明我们可以在 ``resource. I will define the connection inside provisioner` 中定义连接,但我还有一个问题,我们需要在每个 provisioner 中定义连接,如果我们在单个 .tffile 中使用多个配置器?

标签: ssh terraform


【解决方案1】:

您的connection block should be part of a provisioner,它又是资源的一部分(如果没有其他资源有意义,则可能是null_resource 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",
    ]
  }
}

【讨论】:

  • 感谢您为我指明正确的方向。现在我可以 SSH 并在我的 droplet 上安装软件了。
猜你喜欢
  • 2020-10-31
  • 2020-10-28
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2023-03-24
  • 2019-05-02
相关资源
最近更新 更多