2017-07-25 1 views
1

Ich bin relativ neu in Terraform und ich versuche über alle aws_instances zu iterieren, um eine null_resource anzuwenden. Können Sie mehrere Instanzen verwenden, um auf alle Instanzen zuzugreifen, unabhängig von ihren Namen?Wie man über alle aws_instances in Terraform iteriert?

Die EC2-Instanzen werden durch drei Arten unterteilt:

aws_instance.web.* (3 instances) 
aws_instance.app.* (3 instances) 
aws_instance.db.* (2 instances) 

mein Versuch, hier eine null_resource auf alle acht aws_instances anzuwenden:

resource "null_resource" "install_security_package" { 

    #count = "${length(aws_instance)}" #terraform error: resource count can't reference variable: aws_instance 
    #count = "${length(aws_instance.*)}" #terraform error: resource variables must be three parts: TYPE.NAME.ATTR 
    count = "${length(aws_instance.*.*)}" #terraform error: unknown resource 'aws_instance.*' 

    connection { 
    type  = "ssh" 
    host  = "${element(aws_instance.*.private_ip, count.index)}" 
    user  = "${lookup(var.user, var.platform)}" 
    private_key = "${file("${var.private_key_path}")}" 
    timeout  = "2m" 
    } 

    provisioner "remote-exec" { 
    inline = [ 
     "sudo rpm -Uvh http://www.example.com/security/repo/security_baseline.rpm", 
    ] 
    } 
} 

Antwort

2

Es ist derzeit nicht möglich, alle Ressourcen entsprechen ein bestimmter Typ. Die "splat" -Syntax erlaubt, wie Sie gesehen haben, nur die Auswahl aller Instanzen, die aus einem bestimmten Ressourcenblock erstellt wurden.

Die nächstgelegene Sie heute diese mit Terraforming bekommen kann, ist, die verschiedenen Ressourcen zu verketten:

concat(aws_instance.web.*.private_ip, aws_instance.app.*.private_ip, aws_instance.db.*.private_ip) 

In der aktuellen Version von Terraforming als dieser Antwort ist es notwendig, einige der Abhilfen in geteilt zu verwenden github issue #4084, um das Duplizieren dieses komplexen Ausdrucks an mehreren Stellen zu vermeiden. Eine in Kürze erscheinende Funktion namens Local Values wird dies in naher Zukunft einfacher machen, so dass die Liste einen Namen erhalten kann, der an mehreren Stellen wiederverwendet werden kann:

# Won't work until Terraform PR#15449 is merged and released 
locals { 
    aws_instance_addrs = "${concat(aws_instance.web.*.private_ip, aws_instance.app.*.private_ip, aws_instance.db.*.private_ip)}" 
} 

resource "null_resource" "install_security_package" { 

    count = "${length(local.aws_instance_addrs)}" 

    connection { 
    type  = "ssh" 
    host  = "${local.aws_instance_addrs[count.index]}" 
    user  = "${lookup(var.user, var.platform)}" 
    private_key = "${file("${var.private_key_path}")}" 
    timeout  = "2m" 
    } 

    provisioner "remote-exec" { 
    inline = [ 
     "sudo rpm -Uvh http://www.example.com/security/repo/security_baseline.rpm", 
    ] 
    } 
} 
Verwandte Themen