7

好的,所以我有三个.tf文件:main.tf我将 azure 声明为提供者,resources.tf我的所有资源都在其中声明,以及variables.tf.

variables.tf用来存储resources.tf.

但是,我想使用存储在我的变量文件中的变量来填写后端范围内的字段,如下所示:

main.tf

provider "azurerm" {
    version = "=1.5.0"
}

    terraform {
        backend "azurerm" {

        storage_account_name = "${var.sa_name}"
        container_name = "${var.c_name}"
        key = "${var.key}"
        access_key = "${var.access_key}"
    }
}

变量存储在variables.tf这样的:

variable "sa_name" {
    default = "myStorageAccount"
}

variable "c_name" {
    default = "tfstate"
}

variable "key" {
    default = "codelab.microsoft.tfstate"
}

variable "access_key" {
    default = "weoghwoep489ug40gu ... "
}

我在运行时得到了这个terraform init

terraform.backend:配置不能包含插值

后端配置由 Terraform 极早地加载,在 Terraform 的核心可以初始化之前。这是必要的,因为后端决定了该核心的行为。核心是处理插值处理。因此,插值不能用于后端配置。

如果您想参数化后端配置,我们建议使用带有“-backend-config”标志的部分配置来“terraform init”。

有没有办法解决这个问题?我真的希望我的所有密钥/秘密都在同一个文件中......而不是我希望推送到 git 的主要密钥。

4

2 回答 2

11

Terraform 不太关心文件名:它只是加载.tf当前目录中的所有文件并处理它们。main.tfvariables.tf和等名称outputs.tf是有用的约定,可让开发人员更轻松地浏览代码,但它们不会对 Terraform 的行为产生太大影响。

您看到错误的原因是您试图在backend配置中使用变量。不幸的是,Terraform 不允许${...}在后端进行任何插值(any)。引用文档

只能指定一个后端,并且配置可能不包含插值。Terraform 将对此进行验证。

因此,您必须硬编码 中的所有值backend,或者提供部分配置并使用外部工具(例如Terragrunt)通过 CLI 参数填写其余配置。

于 2018-09-18T20:42:43.790 回答
2

后端配置有一些重要的限制:

  1. 一个配置只能提供一个后端块。
  2. 后端块不能引用命名值(如输入变量、本地变量或数据源属性)。

Terraform 后端配置可以在以下链接中看到: https ://www.terraform.io/docs/configuration/backend.html

于 2020-12-16T04:58:48.243 回答