2017-10-03 8 views
1

J'essaie d'énumérer la variable de la carte en utilisant null_resource avec triggers et d'utiliser le résultat de cette énumération dans une autre ressource.Énumérer la variable de la carte en utilisant null_resource et les déclencheurs

Cela fonctionne:

resource "null_resource" "dummy" { 
    count = "${length(var.file_map)}" 

    triggers { 
    filename = "${element(keys(var.file_map), count.index)}" 
    content = "${var.file_map[element(keys(var.file_map), count.index)]}" 
    } 
} 

variable "file_map" { 
    type = "map" 

    default = { 
    "foo.txt" = "foo" 
    "bar.txt" = "bar" 
    } 
} 

Sortie:

An execution plan has been generated and is shown below. 
Resource actions are indicated with the following symbols: 
    + create 

Terraform will perform the following actions: 

    + null_resource.dummy[0] 
     id:    <computed> 
     triggers.%:  "2" 
     triggers.content: "bar" 
     triggers.filename: "bar.txt" 

    + null_resource.dummy[1] 
     id:    <computed> 
     triggers.%:  "2" 
     triggers.content: "foo" 
     triggers.filename: "foo.txt" 


Plan: 2 to add, 0 to change, 0 to destroy. 

Mais lorsque je tente d'utiliser le résultat de l'énumération dans l'autre ressource échoue:

resource "local_file" "some_files" { 
    content = "${null_resource.dummy.triggers.content}" 
    filename = "${null_resource.dummy.triggers.filename}" 
} 

resource "null_resource" "dummy" { 
    count = "${length(var.file_map)}" 

    triggers { 
    filename = "${element(keys(var.file_map), count.index)}" 
    content = "${var.file_map[element(keys(var.file_map), count.index)]}" 
    } 
} 

variable "file_map" { 
    type = "map" 

    default = { 
    "foo.txt" = "foo" 
    "bar.txt" = "bar" 
    } 
} 

Sortie:

Error running plan: 1 error(s) occurred: 

* local_file.some_files: 1 error(s) occurred: 

* local_file.some_files: Resource 'null_resource.dummy' not found for variable 
         'null_resource.dummy.triggers.content' 

Y a-t-il un moyen de le faire fonctionner?

Répondre

1

Utilisation similaire de element dans la ressource null_resource, vous devez faire la même chose dans local_file.

resource "local_file" "some_files" { 
    count = "${length(var.file_map)}" 

    content = "${element(null_resource.dummy.*.triggers.content, count.index)}" 
    filename = "${element(null_resource.dummy.*.triggers.filename, count.index)}" 
} 

resource "null_resource" "dummy" { 
    count = "${length(var.file_map)}" 

    triggers { 
    filename = "${element(keys(var.file_map), count.index)}" 
    content = "${var.file_map[element(keys(var.file_map), count.index)]}" 
    } 
} 

variable "file_map" { 
    type = "map" 

    default = { 
    "foo.txt" = "foo" 
    "bar.txt" = "bar" 
    } 
} 

Après l'exécution terraform apply, il génère deux fichiers

$ cat bar.txt 
bar 
$ cat foo.txt 
foo 

Si vous voulez en savoir plus, cat terraform.tfstate vous donnera des détails sur la façon dont cela fonctionne.

+0

Wow, juste wow. Merci beaucoup. J'ai essayé d'utiliser [splat hack] (https://github.com/hashicorp/terraform/issues/11566#issuecomment-289417805) mais j'ai échoué. Maintenant tout a un sens. – beatcracker