【问题标题】:How to add an ssh key to an GCP instance using terraform?如何使用 terraform 向 GCP 实例添加 ssh 密钥?
【发布时间】:2016-12-03 08:31:58
【问题描述】:

所以我有一个在 Google Cloud Platform 中创建实例的 terraform 脚本,我希望能够让我的 terraform 脚本也将我的 ssh 密钥添加到我创建的实例中,以便我可以通过 ssh 配置它们。这是我当前的 terraform 脚本。

#PROVIDER INFO
provider "google" {
  credentials = "${file("account.json")}"
  project     = "myProject"
  region      = "us-central1"
}


#MAKING CONSUL SERVERS
resource "google_compute_instance" "default" {
  count    =  3
  name     =  "a-consul${count.index}"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  disk {
    image = "ubuntu-1404-trusty-v20160627"
  }

  # Local SSD disk
  disk {
    type    = "local-ssd"
    scratch = true
  }

  network_interface {
    network = "myNetwork"
    access_config {}
  }
}

我必须添加什么才能让我的 terraform 脚本添加我的 ssh 密钥 /Users/myUsername/.ssh/id_rsa.pub

【问题讨论】:

    标签: ssh google-cloud-platform terraform


    【解决方案1】:

    我认为这样的事情应该可行:

      metadata = {
        ssh-keys = "${var.gce_ssh_user}:${file(var.gce_ssh_pub_key_file)}"
      }
    

    https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys描述了元数据机制,我在https://github.com/hashicorp/terraform/issues/6678找到了这个例子

    【讨论】:

    • 嘿我有一个快速跟进这个问题,它与添加 ssh 密钥无关,但它可能使用 gcp terraform 实例的metadata 功能。我想让 terraform 将 --can-ip-forward 标签添加到我的实例中,我该怎么做?
    • 看起来您只是将can_ip_forward = true 添加到资源中:github.com/iostat/mesos-fun/blob/…terraform.io/docs/providers/google/r/compute_instance.html
    • 您好,请注意,sshKeys 现已弃用,当前语法为 ssh-keys
    • 使用此方法时,我可以创建实例并登录到它,但是如果我转到 GCP 控制台并尝试编辑实例,它会在 ssh-keys 中显示错误,我认为这可能是因为应该存在密钥用户名的结尾错误:SSH 密钥格式错误
    • 小心写ssh-keys 而不是ssh_keys 他们都被接受但他们做不同的事情。你最可能想要ssh-keys 而不是ssh_keysssh_keys 安装您的云帐户的密钥,ssh-keys 安装来自指定文件的密钥。
    【解决方案2】:

    仅作记录。从 0.12 开始,该块似乎应该如下所示:

    resource "google_compute_instance" "default" {
      # ...
    
      metadata = {
        ssh-keys = join("\n", [for user, key in var.ssh_keys : "${user}:${key}"])
      }
    
      # ...
    }
    

    (注意=metadata 令牌和ssh-keyssshKeys 之后签名)。

    【讨论】:

    • 当你将 "${user}:${key}" 替换为 "${var.user}:${var.key}" 时,这将起作用,尽管我认为传递一个列表密钥是多余的——我们应该尝试创建不可变的基础设施,任何人都不需要 ssh 进入。
    • 为什么我们需要为此添加username?没有username 就不能通过ssh 键本身?
    • @JananathBanuka 这是 GCP 要求的,因为默认用户名可能会因您使用的图像(ubuntu、debian、centos、rhel 等)而异
    【解决方案3】:

    这是经过测试的。

      metadata {
        sshKeys = "${var.ssh_user}:${var.ssh_key} \n${var.ssh_user1}:${var.ssh_key1}"
    }
    

    【讨论】:

    • 为什么我们需要为此添加username?没有username 就不能通过ssh 键本身?
    【解决方案4】:

    如果你想要多个键,你可以像这样使用heredoc

      metadata = {
        "ssh-keys" = <<EOT
    <user>:<key>
    <user>:<key>
    EOT
      }
    

    我在terraform fmt 提供给我的帖子中保留了奇怪的格式。

    【讨论】:

      【解决方案5】:

      你可以使用下面的

      metadata = {
        ssh-keys = "username:${file("username.pub")}"
      }
      

      我正在努力使用 terraform 使用 ssh 密钥创建一个实例,并且这个答案已经过测试并且也可以正常工作。

      【讨论】:

      • 为什么我们需要为此添加username?没有username 就不能通过ssh 键本身?
      • 没有用户名 terraform 怎么知道如何 ssh 或使用服务器登录?
      • 漂亮干净,但不能添加多个键。
      • @widmo 你必须使用多个具有不同用户名的 pub 文件并使用循环功能一次添加多个密钥。
      • @sambit 好的,谢谢。我希望我可以拥有一个包含许多 pubkey 的文件(对于一个用户)谢谢!
      【解决方案6】:

      只更新Terraform v0.15.4中的多个键:

      metadata = {
          ssh-keys = join("\n", [for key in var.ssh_keys : "${key.user}:${key.publickey}"])
      }
      

      并根据变量:

      variable "ssh_keys" {
        type = list(object({
          publickey = string
          user = string
        }))
        description = "list of public ssh keys that have access to the VM"
        default = [
            {
              user = "username"
              publickey = "ssh-rsa yourkeyabc username@PC"
            }
        ]
      }
      

      【讨论】:

      • 你能告诉我你是怎么得到私钥路径的
      • @RohanKumarJangid 哪个私钥路径?我没有处理任何私钥。
      • 为了与 gcp 机器连接,因为私钥中有一个必需的参数,所以我不明白如果我必须创建或我必须为正确的问题做什么,我该如何使用它,请参考stackoverflow.com/questions/68206325/…
      猜你喜欢
      • 2019-10-16
      • 1970-01-01
      • 2019-10-11
      • 2021-02-23
      • 2019-04-26
      • 2021-07-18
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多