1

我有一个要求,只有当某个文件存在于某个位置时,我才必须部署资源,否则它将跳过该资源。

就像这里是在某些 AWS 账户中部署某个身份提供商的代码。除了这个身份提供者(比如 abc),许多其他身份提供者也从同一个 main.tf 文件部署,所以所有的都必须在这里。abc-${var.aws_account}.xml唯一的挑战是,在为任何帐户部署 IAM 层时,我们仅在文件部分存在于文件路径中时才会部署此特定资源
saml_metadata_document。如果它不存在于路径中,它将简单地忽略资源创建并继续执行其余代码。

resource "aws_iam_saml_provider" "xyz" {
    name                   = "abc-${var.aws_account}"
    saml_metadata_document =  "${file("${path.module}/metadata/abc-${var.aws_account}.xml")}"
}

文件夹结构

IAM-Module
  |
  main.tf
  variables.tf
  metadata
     |
     abc-127367223.xml
     abc-983297832.xml
     abc-342374384.xml

如何在 Terraform 0.11 中进行条件检查以检查文件是否存在?

4

2 回答 2

1

count可用于创建资源数组而不仅仅是单个资源,因此设置 count = 0 将创建长度为 0 的资源数组,有效地禁用资源。

resource "aws_iam_saml_provider" "xyz" { 
   name = "abc-${var.aws_account}" 
   saml_metadata_document = "${file("${path.module}/metadata/abc-${var.aws_account}.xml")}" 
   count = fileexists("${path.module}/metadata/abc-${var.aws_account}.xml") ? 1 : 0
}

注意您将需要访问fileexists仅存在于 0.12 中的

于 2020-03-19T12:17:43.013 回答
1

如果允许的话。使用文件大小代替文件的存在。如果文件大小为零,则不创建资源,否则创建。

data "local_file" "hoge" {
  filename = "${path.module}/hoge"
}

resource "null_resource" "hoge" {
  count = length(data.local_file.hoge.content) > 0 ? 1 : 0

  provisioner "local-exec" {
    command = <<EOF
cat "${path.module}/${data.local_file.hoge.filename}"
EOF
  }
}
于 2020-03-19T23:37:57.417 回答