1

我想用 local-exec 生成 ssh 密钥,然后读取文件的内容。

resource "null_resource" "generate-ssh-keys-pair" {
  provisioner "local-exec" {
    command = <<EOT
      ssh-keygen -t rsa -b 4096 -C "test" -P "" -f "testkey"
    EOT
  }
}

data "local_file" "public-key" {
  depends_on = [null_resource.generate-ssh-keys-pair]
  filename = "testkey.pub"
}

data "local_file" "private-key" {
  depends_on = [null_resource.generate-ssh-keys-pair]
  filename = "testkey"
}

terraform 计划有效,但是当我运行应用程序时,我在 testkey 上遇到错误,并且 testkey.pub 不存在。

谢谢

4

3 回答 3

2

我建议不要使用外部命令生成文件然后将其读入,而是使用 Terraformtls提供程序在 Terraform 本身内生成密钥,使用tls_private_key

terraform {
  required_providers {
    tls = {
      source = "hashicorp/tls"
    }
  }
}

resource "tls_private_key" "example" {
  algorithm = "RSA"
  rsa_bits  = 4096
}

tls_private_key资源类型导出两个属性,它们与您打算在示例中读取的两个文件等效:

  • tls_private_key.example.private_key_pem: PEM 格式的私钥
  • tls_private_key.example.public_key_openssh:OpenSSH 期望在.ssh/authorized_keys.

请注意tls_private_key文档中的警告,即使用此资源将导致私钥数据保存在您的 Terraform 状态中,因此您应该相应地保护该状态数据。对于您使用数据资源从磁盘读取文件的方法也是如此,因为 Terraform 可用于表达式的任何值都必须始终存储在状态中。

于 2020-11-06T01:42:51.560 回答
0

运行你的代码,没有任何问题。它正确地生成testkeytestkey.pub

因此,无论导致它失败的原因是什么,都不是您在问题中提供的代码片段。故障必须在被剪断的代码之外。

于 2020-11-03T03:19:28.463 回答
0

在 Terraform 中生成 SSH 密钥本质上是不安全的,因为它存储在 tfstate 文件中,但是我有一个类似的问题要解决,并认为最安全/可用的是使用秘密管理服务 + 使用云存储桶作为后端:

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
      version = "4.3.0"
    }
  }

  backend "gcs" {
    bucket  = "tfstatebucket"
    prefix  = "terraform/production"
  }
}

//Import Ansible private key from Google Secrets Manager
resource "google_secret_manager_secret" "ansible_private_key" {
  secret_id = var.ansible_private_key_secret_id
  replication {
    automatic = true
  }
}

data "google_secret_manager_secret_version" "ansible_private_key"{
  secret  = google_secret_manager_secret.ansible_private_key.secret_id
  version = var.ansible_private_key_secret_id_version_number
}


resource "local_file" "ansible_imported_local_private_key" {
    sensitive_content   = data.google_secret_manager_secret_version.ansible_private_key.secret_data
    filename            = var.ansible_imported_local_private_key_filename
    file_permission     = "0600"
}

在 GCP 的情况下,我会在 Google Secrets Manager 中添加密钥,然后terraform import在密钥上使用,然后将其写入后端存储桶。这样它就不会以纯文本形式存储在 Git 中,您可以将密钥文件保存在项目本地(.terraform 不应受版本控制),并且可以说它在存储桶中更安全。

所以工作流程本质上是:

Human --> Secret Manager

Secret Manager --> Terraform Import --> GCS Bucket Backend
                                    |--> Create .terraform/ssh_key 

.terraform/ssh_key --> Terraform/Ansible/Whatever

Hashicorp Vault 将是解决此问题的另一种方法

于 2022-01-14T20:08:30.053 回答