(请注意:收到初步答案后,这个问题似乎不仅仅是传递变量的问题,但是通过模块化我的配置,请注意底部我对值进行硬编码,但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
,以查看是否存在任何模仿它们的奇怪行为,具有相同的行为。
我还尝试将值硬编码到提供程序声明中,并且遇到了相同的行为。
答案 0 :(得分:3)
您的variables.tfvars
文件应命名为terraform.tfvars
。
每the docs:
如果当前目录中存在terraform.tfvars文件,Terraform会自动加载它以填充变量。如果文件名为其他名称,则可以直接使用-var-file标志指定文件。这些文件与Terraform配置文件的语法相同。和Terraform配置文件一样,这些文件也可以是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}"
答案 1 :(得分:0)
在“Digital_ocean模块”和“cloudflare提供程序”下,您声明了两个额外的变量(“令牌”和“电子邮件”)但您没有在变量中捕获相应的值.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"
我希望有帮助
答案 2 :(得分:-2)
这是错误的 terraform apply -var-file="variables.tfvars"
terraform apply 没有这个选项 var-file ,只有 plan 有。