Terraform 地形资源使用模块生成多个密钥对

Terraform 地形资源使用模块生成多个密钥对,terraform,Terraform,我正在尝试使用terraform模块,但在密钥创建方面遇到了问题。我想为模块的每次运行生成一个新的aws_密钥对。我收到 aws_key_pair.default:错误导入密钥对:InvalidKeyPair。重复:密钥对“keyname”已存在 我想为模块的每次运行生成一个新的密钥(使用不同的名称),但我不知道如何实现这一点 我有一个变量 variable "key_pair_name" { description = "EC2 Key pair name" default = ""

我正在尝试使用terraform模块,但在密钥创建方面遇到了问题。我想为模块的每次运行生成一个新的aws_密钥对。我收到

aws_key_pair.default:错误导入密钥对:InvalidKeyPair。重复:密钥对“keyname”已存在

我想为模块的每次运行生成一个新的密钥(使用不同的名称),但我不知道如何实现这一点

我有一个变量

variable "key_pair_name" {
  description = "EC2 Key pair name"
  default = ""
}
在resources.tf中

resource "key_pair" "default"
  key_name = "keyname"
  public_key = "${file("${var.key_path}")}"
这将生成第一个关键帧。当模块运行时,它将再次尝试重新创建已存在的相同密钥。我想让它创建第二个、第三个等分别命名的键,即:keyname1、keyname2、keyname3或一个随机字符串

我正在努力

resource "random_id" "key_pair_name" {
  name = {
    key_name = "${random_id.key_name}"
  }

  byte_length = 8
}
我从一个简单的main.tf开始

module "one" {
  source = "/modules/test-example"
写入模块 在
变量.tf中:

variable "key_pair_names" {
    description = "EC2 Key pair names"
    default = [
        "keyname1",
        "keyname2"
    ]
}
resource "key_pair" "default" {
    count = "${length(var.key_pair_names)}"
    key_name = "${element(var.key_pair_names, count.index)}"
    public_key = "${file("${element(var.key_pair_names, count.index)}")}"
}
在您的
参考资料中.tf

variable "key_pair_names" {
    description = "EC2 Key pair names"
    default = [
        "keyname1",
        "keyname2"
    ]
}
resource "key_pair" "default" {
    count = "${length(var.key_pair_names)}"
    key_name = "${element(var.key_pair_names, count.index)}"
    public_key = "${file("${element(var.key_pair_names, count.index)}")}"
}
NB:本地文件的名称需要与创建的远程密钥对相同

重写变量
  • 如果您直接在该目录中运行terraform,请运行:

    terraform apply -var-file=terraform.tfvars
    
    使用“terraform.tfvars”:

    key_pair_names = [
        "keyname1",
        "keyname2",
        "keyname3"
    ]   
    
  • 如果您正在使用其他
    main.tf
    文件中的模块:

    module "key_pair" {
        path = "path/to/module"
    
        key_pair_names = [
            "keyname1",
            "keyname2",
            "keyname3"
        ]
    }
    

如果其他人有这个问题,我可以使用terraform random\u id解决这个问题

resource "random_id" "keypair" {
  byte_length = 8
}

resource "keypair" "default" {
  name = "${random_id.keypair.hex}"

要在每次运行时实现唯一的keyname,可以在terraform()中使用
uuid
函数

您可以将代码块定义为

resource "key_pair" "default"
  key_name = "keyname-${uuid()}"
  public_key = "${file("${var.key_path}")}"

但是,对于公钥,使用不同的密钥对,您想要实现什么呢?

您是否有其他tf文件调用您的模块?是的,只是一个简单的“main.tf”您想要实现什么?为什么你要一遍又一遍地上传同一个公钥,却给它起了不同的名字?如果它有一个随机名称,您打算稍后如何引用它?从variables.tf line“keyname1”中获取“分析列表时意外标记:IDENT”,我可能错过了引号。我编辑了答案以添加它们。谢谢,我发现…获取“key\u pair.default:资源计数不能引用变量:key\u pair\u名称“如果您还没有完成,我就用变量的var前缀更新了答案,现在已经添加了,init通过了,但是计划失败了,因为${file(${element(var.key\u pair\u names,count.index)}”)中没有这样的文件或目录。”