Il s'agit d'un module Terraform uniquement en calcul (c'est-à-dire un module qui ne passe aucun appel API distant) qui rassemble tous les fichiers dans un répertoire de base particulier et rend ceux qui ont un suffixe particulier comme fichiers de modèle Terraform.
module "template_files" {
source = " hashicorp/dir/template "
base_dir = " ${ path . module } /src "
template_vars = {
# Pass in any values that you wish to use in your templates.
vpc_id = " vpc-abc123 "
}
} La sortie files est une carte des chemins de fichier par rapport au répertoire de base aux objets avec les attributs suivants:
content_type : un type mime à utiliser pour le fichier.content : contenu littéral du fichier, après avoir rendu un modèle.source_path : Emplacement du système de fichiers local d'un fichier non modèle.digests : une carte contenant les résultats de l'application de divers algorithmes digest / hachage au contenu du fichier. content et source_path s'excluent mutuellement. content est défini pour les fichiers de modèle et contient le résultat du rendu du modèle. Pour les fichiers non-modèles, source_path est défini sur l'emplacement du fichier sur le disque local, qui évite d'essayer de charger des fichiers non UTF-8 tels que des images en mémoire.
La carte digests pour chaque fichier contient les clés suivantes, dont les valeurs sont le résultat de l'application de la fonction de hachage nommée au contenu du fichier:
md5sha1sha256base64sha256base512base64sha512 Par défaut, tout fichier du répertoire de base dont le nom de fichier se termine par .tmpl est interprété comme un modèle. Vous pouvez remplacer ce suffixe en définissant la variable template_file_suffix sur n'importe quelle chaîne qui commence par une période et est suivie par un ou plusieurs caractères non-période.
Les modèles sont interprétés comme la syntaxe du modèle de chaîne de Terraform. Les modèles peuvent utiliser l'une des fonctions intégrées de Terraform, à l'exception de la fonction templatefile , ce que ce module utilise pour le rendu de modèle en interne.
Tout fichier qui n'a pas le suffixe de fichier de modèle sera traité comme un fichier statique, renvoyant le chemin local vers le fichier source.
Les valeurs de type contenu ( content_type dans les objets résultants) sont sélectionnés en fonction des suffixes de tous les fichiers découverts.
La variable file_types est un mappage des suffixes de nom de fichier (un point suivi par au moins un caractère non-point) aux valeurs d'en-tête Content-Type . Le mappage par défaut comprend un certain nombre de filetypes couramment utilisés sur les sites Web statiques.
Si le module rencontre un fichier qui n'a aucun suffixe ou dont le suffixe n'est pas dans file_types , il utilisera la valeur de la variable default_file_type en tant que report, qui lui-même par défaut est par défaut en application/octet-stream .
Un cas d'utilisation clé pour ce module consiste à produire du contenu à télécharger dans un seau Amazon S3, par exemple à utiliser comme site Web statique.
Dans votre module d'appel, utilisez aws_s3_bucket_object du fournisseur AWS avec for_each pour créer un objet S3 pour chaque fichier:
resource "aws_s3_bucket_object" "static_files" {
for_each = module . template_files . files
bucket = " example "
key = each . key
content_type = each . value . content_type
# The template_files module guarantees that only one of these two attributes
# will be set for each file, depending on whether it is an in-memory template
# rendering result or a static file on disk.
source = each . value . source_path
content = each . value . content
# Unless the bucket has encryption enabled, the ETag of each object is an
# MD5 hash of that object.
etag = each . value . digests . md5
}Le modèle de téléchargement de fichiers sur GCS est très similaire à celui pour Amazon S3 ci-dessus:
resource "google_storage_bucket_object" "picture" {
for_each = module . template_files . files
bucket = " example "
name = each . key
content_type = each . value . content_type
# The template_files module guarantees that only one of these two attributes
# will be set for each file, depending on whether it is an in-memory template
# rendering result or a static file on disk.
source = each . value . source_path
content = each . value . content
}Ce module nécessite Terraform V0.12.8 ou version ultérieure. Il n'utilise aucun fournisseur Terraform et ne déclare aucune ressource Terraform.
template_dir ? Le type de ressource template_dir a été mis en œuvre comme une solution pragmatique pour diverses limites dans les versions antérieures de Terraform, mais elle est problématique car elle viole qu'une hypothèse terraform fait sur les ressources: elle modifie l'état local sur le système où TerraForm est en cours d'exécution, et donc le résultat de la La ressource n'est pas visible lors de l'exécution de Terraform sur d'autres hôtes.
Le type de ressource template_dir n'est plus nécessaire à partir de Terraform 0.12.8 pour la plupart des cas d'utilisation, car il y a suffisamment de fonctionnalités intégrées pour obtenir des résultats similaires sans ressources du tout.
En plus que ce module étant un meilleur citoyen dans le flux de travail de Terraform qu'une ressource template_file , il permet également un mélange de fichiers de modèle et de non-modèle dans le même répertoire, et ne se chargera que dans la mémoire et rendra les fichiers de modèle. Pour les fichiers non modèles, il les laissera simplement sur le disque où ils se trouvent et renvoient un chemin de système de fichiers local vers l'emplacement d'origine.
D'un autre côté, ce module suppose que son résultat sera utilisé avec un autre type de ressource qui est capable de gérer certains fichiers en cours de rendus en mémoire et d'autres fichiers en cours de lecture directement à partir du disque. Cela est vrai pour aws_s3_bucket_object , mais pas vrai pour tous les types de ressources qui pourraient fonctionner avec des fichiers arbitraires.