如何通过 CLI 或 tfvars 文件将变量传递给 Terraform 模块?
How to pass Variables to Terraform modules via CLI or tfvars file?
(请注意:在收到初步答复后,这个问题似乎不仅仅是传递变量的问题,而是模块化我的配置的问题,请注意底部我对值进行硬编码的地方 UI提示我提供值)
我有一个项目我已经分解成以下目录结构
master.tf
variables.tfvars
- providers/
-- digital_ocean/
--- digital_ocean.tf
--- variables.tf
-- cloud_flare/
--- cloud_flare.tf
--- variables.tf
- management/
-- jenkins/
--- jenkins-master.tf
我正在尝试将我的 Digital Ocean 和 Cloudflare 令牌作为变量传递给它们各自的模块。根目录下的所有内容都作为模块加载到 master.tf
。
我的 varaibles.tfvars 文件中有以下内容:
cloudflare_email ="service@email.com"
cloudflare_token ="TOKEN_STRING"
do_token ="${DO_PAT}"
以下几行出现在我的 master.tf
variable "do_token" {}
module "digital_ocean" {
source = "./providers/digital_ocean"
token = "${var.do_token}"
}
variable "cloudflare_email" {}
variable "cloudflare_token" {}
module "cloud_flare" {
source = "./providers/cloud_flare"
email = "${var.cloudflare_email}"
token = "${var.cloudflare_token}"
}
我的 digital_ocean 模块看起来像
variable "token" {}
provider "digitalocean" {
token = "${var.token}"
}
cloudflare 提供商看起来像
variable "email" {}
variable "token" {}
provider "CloudFlare" {
email = "${var.email}"
token = "${var.token}"
}
在 DO 上设置我的 jenkins 主服务器
resource "digitalocean_droplet" "jenkins-master" {
...
}
从命令行我是 运行 terraform apply -var-file="variables.tfvars"
或者我也试过像这样通过 CLI 传递它们..
terraform apply \
-var "cloudflare_email=service@email.com" \
-var "cloudflare_token=TOKEN_STRING" \
-var "do_token=${DO_PAT}"
有了上面的声明,它会让我进入 UI 模式并提示我输入这些变量,而不是自动读取它们。我已经在 Terraform v0.9.8 和 v0.9.10 上复制了这种行为。
在我开始将所有内容分解成单独的模块之前,传入变量没有任何问题。
我已经尝试将提供者声明拉入 master.tf
以查看是否有任何奇怪的行为与模块化它们,具有相同的行为。
我还尝试将这些值硬编码到提供者声明中,并且遇到了相同的行为。
在你的 "Digital_ocean module" 和 "cloudflare provider" 下,你声明了两个额外的变量(即 "token" 和 "email")但是你没有在你的variables.tfvars
您的 vairables.tfvars 应捕获令牌和电子邮件的值,如下所示。这样你就可以使用 terraform apply -var-file="variables.tfvars"
而不会出现问题
cloudflare_email ="service@email.com"
cloudflare_token ="TOKEN_STRING"
do_token ="${DO_PAT}"
token ="token_string"
email ="another@email.com"
或如下用 var 明确提及
terraform apply -var "cloudflare_email=service@email.com" -var "cloudflare_token=TOKEN_STRING" -var "do_token=${DO_PAT}" -var "token=TOKEN_string -var "email=another@email.com"
希望对您有所帮助
您的 variables.tfvars
文件应命名为 terraform.tfvars
.
根据 the docs:
If a terraform.tfvars file is present in the current directory, Terraform automatically loads it to populate variables. If the file is named something else, you can use the -var-file flag directly to specify a file. These files are the same syntax as Terraform configuration files. And like Terraform configuration files, these files can also be JSON.
如果您想使用自己的文件命名约定,您可以设置一个带有 -var-file
标志的替代 tfvars 文件,如下所示(根据 linked docs):
$ terraform plan \
-var-file="secret.tfvars" \
-var-file="production.tfvars"
对于 CLI,您应该只引用变量的值,如下所示:
terraform apply \
-var cloudflare_email="service@email.com" \
-var cloudflare_token="TOKEN_STRING" \
-var do_token="${DO_PAT}"
这是错误的 terraform apply -var-file="variables.tfvars"
terraform apply 没有这个选项 var-file ,只有 plan 有。
(请注意:在收到初步答复后,这个问题似乎不仅仅是传递变量的问题,而是模块化我的配置的问题,请注意底部我对值进行硬编码的地方 UI提示我提供值)
我有一个项目我已经分解成以下目录结构
master.tf
variables.tfvars
- providers/
-- digital_ocean/
--- digital_ocean.tf
--- variables.tf
-- cloud_flare/
--- cloud_flare.tf
--- variables.tf
- management/
-- jenkins/
--- jenkins-master.tf
我正在尝试将我的 Digital Ocean 和 Cloudflare 令牌作为变量传递给它们各自的模块。根目录下的所有内容都作为模块加载到 master.tf
。
我的 varaibles.tfvars 文件中有以下内容:
cloudflare_email ="service@email.com"
cloudflare_token ="TOKEN_STRING"
do_token ="${DO_PAT}"
以下几行出现在我的 master.tf
variable "do_token" {}
module "digital_ocean" {
source = "./providers/digital_ocean"
token = "${var.do_token}"
}
variable "cloudflare_email" {}
variable "cloudflare_token" {}
module "cloud_flare" {
source = "./providers/cloud_flare"
email = "${var.cloudflare_email}"
token = "${var.cloudflare_token}"
}
我的 digital_ocean 模块看起来像
variable "token" {}
provider "digitalocean" {
token = "${var.token}"
}
cloudflare 提供商看起来像
variable "email" {}
variable "token" {}
provider "CloudFlare" {
email = "${var.email}"
token = "${var.token}"
}
在 DO 上设置我的 jenkins 主服务器
resource "digitalocean_droplet" "jenkins-master" {
...
}
从命令行我是 运行 terraform apply -var-file="variables.tfvars"
或者我也试过像这样通过 CLI 传递它们..
terraform apply \
-var "cloudflare_email=service@email.com" \
-var "cloudflare_token=TOKEN_STRING" \
-var "do_token=${DO_PAT}"
有了上面的声明,它会让我进入 UI 模式并提示我输入这些变量,而不是自动读取它们。我已经在 Terraform v0.9.8 和 v0.9.10 上复制了这种行为。
在我开始将所有内容分解成单独的模块之前,传入变量没有任何问题。
我已经尝试将提供者声明拉入 master.tf
以查看是否有任何奇怪的行为与模块化它们,具有相同的行为。
我还尝试将这些值硬编码到提供者声明中,并且遇到了相同的行为。
在你的 "Digital_ocean module" 和 "cloudflare provider" 下,你声明了两个额外的变量(即 "token" 和 "email")但是你没有在你的variables.tfvars
您的 vairables.tfvars 应捕获令牌和电子邮件的值,如下所示。这样你就可以使用 terraform apply -var-file="variables.tfvars"
而不会出现问题
cloudflare_email ="service@email.com"
cloudflare_token ="TOKEN_STRING"
do_token ="${DO_PAT}"
token ="token_string"
email ="another@email.com"
或如下用 var 明确提及
terraform apply -var "cloudflare_email=service@email.com" -var "cloudflare_token=TOKEN_STRING" -var "do_token=${DO_PAT}" -var "token=TOKEN_string -var "email=another@email.com"
希望对您有所帮助
您的 variables.tfvars
文件应命名为 terraform.tfvars
.
根据 the docs:
If a terraform.tfvars file is present in the current directory, Terraform automatically loads it to populate variables. If the file is named something else, you can use the -var-file flag directly to specify a file. These files are the same syntax as Terraform configuration files. And like Terraform configuration files, these files can also be JSON.
如果您想使用自己的文件命名约定,您可以设置一个带有 -var-file
标志的替代 tfvars 文件,如下所示(根据 linked docs):
$ terraform plan \
-var-file="secret.tfvars" \
-var-file="production.tfvars"
对于 CLI,您应该只引用变量的值,如下所示:
terraform apply \
-var cloudflare_email="service@email.com" \
-var cloudflare_token="TOKEN_STRING" \
-var do_token="${DO_PAT}"
这是错误的 terraform apply -var-file="variables.tfvars"
terraform apply 没有这个选项 var-file ,只有 plan 有。