Este es un módulo Terraform solo de cómputo (es decir, un módulo que no hace ninguna llamada de API remota) que reúna todos los archivos en un directorio base particular y representa a aquellos que tienen un sufijo particular como archivos de plantilla 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 salida files es un mapa de las rutas de archivos en relación con el directorio base a los objetos con los siguientes atributos:
content_type : un tipo mime para usar para el archivo.content : Contenido literal del archivo, después de representar una plantilla.source_path : ubicación del sistema de archivos local de un archivo que no es de plantilla.digests : un mapa que contiene los resultados de aplicar varios algoritmos de digestión/hash al contenido del archivo. content y source_path son mutuamente excluyentes. content está configurado para archivos de plantilla y contiene el resultado de representar la plantilla. Para archivos que no son de plantilla, source_path se establece en la ubicación del archivo en el disco local, que evita tratar de cargar archivos que no sean UTF-8, como las imágenes en la memoria.
El mapa digests para cada archivo contiene las siguientes claves, cuyos valores son el resultado de aplicar la función hash nombrada al contenido del archivo:
md5sha1sha256base64sha256base512base64sha512 Por defecto, cualquier archivo en el directorio base cuyo nombre de archivo termina en .tmpl se interpreta como una plantilla. Puede anular ese sufijo estableciendo la variable template_file_suffix en cualquier cadena que comience con un período y es seguido por uno o más caracteres no período.
Las plantillas se interpretan como sintaxis de plantilla de cadena de Terraform. Las plantillas pueden usar cualquiera de las funciones integradas de Terraform, excepto la función templatefile , que es lo que este módulo usa para la representación de plantillas internamente.
Cualquier archivo que no tenga el sufijo de archivo de plantilla será tratado como un archivo estático, devolviendo la ruta local al archivo de origen.
Los valores de tipo de contenido ( content_type en los objetos resultantes) se seleccionan en función de los sufijos de todos los archivos descubiertos.
La variable file_types es una asignación de sufijos de nombre de archivo (un punto seguido de al menos un carácter no dot) a los valores de encabezado Content-Type . La asignación predeterminada incluye una serie de filetipos comúnmente utilizados en sitios web estáticos.
Si el módulo encuentra un archivo que no tiene sufijo o cuyo sufijo no está en file_types , utilizará el valor de variable default_file_type como un respaldo, que en sí mismo predeterminado a application/octet-stream .
Un caso de uso clave para este módulo es producir contenido para cargar en un cubo de Amazon S3, por ejemplo, para usar como un sitio web estático.
En su módulo de llamada, use aws_s3_bucket_object desde el proveedor de AWS con for_each para crear un objeto S3 para cada archivo:
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
}El patrón para cargar archivos a GCS es muy similar al de Amazon S3 anterior:
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
}Este módulo requiere Terraform v0.12.8 o posterior. No utiliza ningún proveedor de Terraform y no declara ningún recurso de Terraform.
template_dir ? El tipo de recurso template_dir se implementó como una solución pragmática para varias limitaciones en versiones anteriores de Terraform, pero es problemático porque viola una suposición de Terraform sobre los recursos: modifica el estado local en el sistema donde se está ejecutando Terraform, y por lo tanto el resultado del resultado del resultado del resultado del resultado de El recurso no es visible al ejecutar Terraform en otros hosts.
El tipo de recurso template_dir ya no es necesario desde Terraform 0.12.8 en adelante para la mayoría de los casos de uso, porque hay suficiente funcionalidad incorporada para obtener resultados similares sin recursos en absoluto.
Además de que este módulo es un mejor ciudadano en el flujo de trabajo de Terraform que un recurso template_file , también permite una mezcla de plantillas y archivos no plantadores en el mismo directorio, y solo se cargará en la memoria y representará los archivos de plantilla. Para los archivos que no son de plantilla, solo los dejará en el disco donde están y devolverá una ruta del sistema de archivos local a la ubicación original.
Por otro lado, este módulo supone que su resultado se utilizará con algún otro tipo de recurso que pueda lidiar con algunos archivos que se presentan en cadenas en la memoria y otros archivos que se leen directamente desde el disco. Esto es cierto para aws_s3_bucket_object , pero no es cierto para todos los tipos de recursos que podrían funcionar con archivos arbitrarios.