2017-09-12 23 views
3

不确定这是一个错误还是我做错了什么。当我在两个模块之间引入依赖关系时,依赖模块的template_file数据中的变量会起作用,terraform会抱怨找不到它。Terraform模块依赖中断template_file

我有两个模块,saltmaster和cassandra。目标是让saltmaster通过输出变量公开其IP地址,并使用cassandra来使用它。

如果我切断模块之间的依赖关系,通过将IP地址硬编码为cassandra模块的输入,则所有资源都会正确创建。

  • module.cassandra.aws_instance.momentum_cassandra [2]:资源 'data.template_file.momentum_cassandra' 不具有属性 'vars.hostname' 的变量“,但是当我介绍的依赖性,terraform与抱怨data.template_file.momentum_cassandra。*。vars.hostname”,我确定在template_file的瓦尔部分卡桑德拉实例的主机名,然后在aws_instance的标签块用它

注意。并且它可以独立运行,但是当cassandra模块依赖于saltmaster模块时会中断。

cassandra.tf

data "template_file" "momentum_cassandra" { 
    count = "${var.instance_count}" 
    template = "${file("${path.module}/userdata.sh")}" 

    vars { 
    hostname = "${format("%s%02d", var.name, count.index + 1)}" 
    saltmaster = "${var.saltmaster}" 
    salt_installtype = "${var.salt_installtype}" 
    seed  = "${count.index == 0 ? "true" : "false"}" 
    datacenter = "${var.datacenter}" 
    rack  = "${var.rack}" 
    } 
} 

resource "aws_instance" "momentum_cassandra" { 
    count     = 3 
    provider    = "aws.us_dev" 
    ami     = "${var.ami}" 
    instance_type   = "${var.instance_type}" 
    key_name    = "${var.instance_key_name}" 
    subnet_id    = "${element(var.vpc_subnet_ids, count.index)}" 
    iam_instance_profile = "${var.iam_instance_profile}" 

    vpc_security_group_ids = ["${aws_security_group.momentum_cassandra.id}"] 
    user_data    = "${data.template_file.momentum_cassandra.*.rendered[count.index]}" 

    lifecycle { 
    ignore_changes = ["ami", "user_data"] 
    } 
    tags { 
    Name  = "${data.template_file.momentum_cassandra.*.vars.hostname[count.index]}" 

main.tf

module "cassandra" { 
    source = "./tf-aws-momentum-cassandra" 
    saltmaster = "${module.saltmaster.private_ip}" 
} 

saltmaster.tf

# create the userdata for bootstrapping 
data "template_file" "saltmaster_userdata" { 
    count = "${var.instance_count}" 
    template = "${file("${path.module}/userdata.sh")}" 

    vars { 
    hostname = "${format("%s%02d", var.name, count.index + 1)}" 
    saltmaster = "localhost" 
    environment = "${var.environment}" 
    installtype = "${var.installtype}" 
    } 
} 
# create the salt master 
resource "aws_instance" "momentum_salt_master" { 
    provider    = "aws.us_dev" 
    ami     = "${var.ami}" 
    instance_type   = "${var.instance_type}" 
    key_name    = "${var.instance_key_name}" 
    vpc_security_group_ids = ["${aws_security_group.momentum_salt_master.id}"] 
    subnet_id    = "${element(var.vpc_subnet_ids, count.index)}" 
    iam_instance_profile = "${var.iam_instance_profile}" 
    user_data    = "${element(data.template_file.saltmaster_userdata.*.rendered, count.index)}" 


    tags { 
    Name  = "${element(data.template_file.saltmaster_userdata.*.vars.hostname, count.index)}" 
    Environment = "${var.environment}" 
    Application = "${var.application}" 
    Role  = "SaltMaster" 
    } 

    root_block_device { 
    volume_type   = "gp2" 
    volume_size   = 40 
    delete_on_termination = true 
    } 
} 

output "private_ip" { 
    value = "${aws_instance.momentum_salt_master.private_ip}" 
} 
+1

使用你能告诉你'saltmaster'模块呢? – ydaetskcoR

+1

你以前读过这个吗? https://github.com/hashicorp/terraform/issues/1178#issuecomment-207369534 – BMW

+0

@ydaetskcoR我已经用我的saltmaster模块的内容更新了我的问题。 –

回答

0

根据terraform版本使用的是这可能是固定的here,但是,尝试更换

"${data.template_file.momentum_cassandra.*.rendered[count.index]}" 
"${data.template_file.momentum_cassandra.*.vars.hostname[count.index]}" 
cassandra.tf

element查找

"${element(data.template_file.momentum_cassandra.*.rendered, count.index)}" 
"${element(data.template_file.momentum_cassandra.*.vars.hostname, count.index)}" 

,你实际上是在saltmaster.tf