使用Terraform的外部数据源获取SSH公钥

80次阅读
没有评论

问题描述

在使用Terraform时,尝试使用外部数据源获取SSH公钥,以生成一个Openssh公钥。然而,他遇到了一些问题,并想了解解决方案。

解决方案

在处理这个问题之前,让我们首先理解一下你尝试的方法以及为什么会出现问题。然后,我们将介绍一种更可靠的方法来实现你的目标。

尝试1:直接调用ssh-keygen命令

你在尝试使用Terraform的外部数据源来调用ssh-keygen命令来生成SSH公钥,如下所示:

data "external" "local_key" {
  program = [
    "ssh-keygen", "-y", "-f ~/.ssh/id_rsa"
  ]
}

然而,这里存在一个问题。Terraform在调用外部程序时并不会通过shell执行,因此~(波浪线)无法被扩展为用户的家目录。因此,~/.ssh/id_rsa 会被字面量解释,而不会扩展到正确的路径。因此,你遇到了文件路径错误的问题。

尝试2:调用bash来运行命令

你尝试了通过调用bash来运行命令的方法,但同样遇到了问题:

data "external" "local_key" {
  program = [
    "bash"
  ]
  query = {
    "-c" = "ssh-keygen -y -f ~/.ssh/id_rsa"
  }
}

在这种情况下,你的问题是 -c 不是有效的命令,因此bash会认为你要执行的是一个错误的命令。此外,Terraform会将query块中的内容作为JSON文件传递给bash,这不会达到你的预期效果。

更好的解决方案:使用tls_public_key数据源

对于你的需求,更好的解决方案是使用Terraform内置的tls_public_key数据源,而不是依赖外部数据源。这样可以避免操作系统的依赖性,并且更加可靠。

data "tls_public_key" "example" {
  private_key_pem = file("~/.ssh/id_rsa")
}

上述配置将会从私钥文件 ~/.ssh/id_rsa 中获取公钥,并将其储存在 data.tls_public_key.example.public_key_openssh 变量中。

总结

使用Terraform的外部数据源虽然可以在一些场景下解决问题,但对于生成SSH公钥这样的需求,最好的方法是使用Terraform内置的 tls_public_key 数据源。这样能够确保可移植性和可靠性,避免了外部依赖的问题。

注意:请根据你的实际需求和环境进行相应调整。最好的解决方案是根据Terraform和相关工具的文档进行操作。

正文完