Dies ist ein Terraform-Modul nur für Computer (dh ein Modul, das keine Remote-API-Aufrufe tätigt), das alle Dateien unter einem bestimmten Basisverzeichnis versammelt und diejenigen rendert, die ein bestimmtes Suffix als Terraform-Vorlagendateien haben.
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 "
}
} Die Ausgabe files ist eine Karte von Dateipfaden relativ zum Basisverzeichnis zu Objekten mit den folgenden Attributen:
content_type : Ein MIME -Typ, der für die Datei verwendet werden soll.content : Wörtlicher Inhalt der Datei, nachdem er eine Vorlage gemacht hat.source_path : Lokaler Dateisystemspeicherort einer Nicht-Template-Datei.digests : Eine Karte, die die Ergebnisse der Anwendung verschiedener Digest/Hash -Algorithmen auf den Dateiinhalt enthält. content und source_path schließen sich gegenseitig aus. content wird für Vorlagendateien eingestellt und enthält das Ergebnis der Rendern der Vorlage. Für Nicht-Template-Dateien wird source_path auf den Speicherort der Datei auf der lokalen Festplatte gesetzt, wodurch nicht der Versuch, Nicht-UTF-8-Dateien wie Bilder in den Speicher zu laden, nicht geladen werden.
Die digests -Karte für jede Datei enthält die folgenden Schlüssel, deren Werte das Ergebnis der Anwendung der benannten Hash -Funktion auf den Dateiinhalt sind:
md5sha1sha256base64sha256base512base64sha512 Standardmäßig wird jede Datei im Basisverzeichnis, deren Dateiname in .tmpl endet, als Vorlage interpretiert. Sie können dieses Suffix überschreiben, indem Sie die variable template_file_suffix auf eine beliebige Zeichenfolge einstellen, die mit einem Zeitraum beginnt und von einem oder mehreren Nicht-Perioden-Zeichen folgt.
Die Vorlagen werden als String -Vorlagensyntax von Terraform interpretiert. Vorlagen können eine der integrierten Funktionen von Terraform verwenden, mit Ausnahme der templatefile -Funktion, die dieses Modul für das interne Rendieren von Vorlagen verwendet.
Jede Datei, in der das Suffix der Vorlagendatei nicht verfügt, wird als statische Datei behandelt, wodurch der lokale Pfad in die Quelldatei zurückgibt.
Inhaltswerte ( content_type in den resultierenden Objekten) werden basierend auf den Suffixen aller entdeckten Dateien ausgewählt.
Das Variable file_types ist eine Zuordnung von Dateinamen-Suffixen (ein Punkt, gefolgt von mindestens einem Nicht-Punkt-Zeichen) auf Content-Type Header-Werte. Die Standardzuordnung enthält eine Reihe von Filetypen, die häufig auf statischen Websites verwendet werden.
Wenn das Modul auf eine Datei stößt, die überhaupt kein Suffix hat oder dessen Suffix nicht in file_types liegt, verwendet es den Wert der Variablen default_file_type als Fallback, der selbst standardmäßig für application/octet-stream ausfällt.
Ein wichtiger Anwendungsfall für dieses Modul besteht darin, Inhalte zum Hochladen in einen Amazon S3-Bucket zu erstellen, beispielsweise als statische Website zu verwenden.
Verwenden Sie in Ihrem Anrufmodul aws_s3_bucket_object vom AWS -Anbieter mit for_each , um ein S3 -Objekt für jede Datei zu erstellen:
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
}Das Muster zum Hochladen von Dateien auf GCS ist dem oben für Amazon S3 sehr ähnlich:
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
}Dieses Modul erfordert Terraform V0.12.8 oder höher. Es wird keine Terraform -Anbieter verwendet und deklariert keine Terraform -Ressourcen.
template_dir verwenden? Der template_dir -Ressourcentyp wurde als pragmatische Problemumgehung für verschiedene Einschränkungen in früheren Versionen von Terraform implementiert, aber es ist problematisch, da er gegen eine Annahme, die Terraform über Ressourcen macht Die Ressource ist nicht sichtbar, wenn Sie Terraform auf anderen Hosts ausführen.
Der Ressourcentyp template_dir ist für die meisten Anwendungskräfte nicht mehr erforderlich, da genügend integrierte Funktionen genügend integrierte Funktionen sind, um ähnliche Ergebnisse ohne Ressourcen zu erzielen.
Neben diesem Modul ist es ein besserer Bürger im Workflow von Terraform als eine Ressource template_file , sondern ermöglicht auch eine Mischung aus Vorlagen- und Nicht-Template-Dateien im selben Verzeichnis und lädt nur in den Speicher und rendert die Vorlagendateien. Bei Nicht-Template-Dateien lässt sie nur auf der Festplatte, wo sie sich befinden, und gibt einen lokalen Dateisystempfad an den ursprünglichen Speicherort zurück.
Auf der anderen Seite geht dieses Modul davon aus, dass sein Ergebnis mit einem anderen Ressourcentyp verwendet wird, der sich mit einigen Dateien befassen kann, die in Speicher und anderen Dateien direkt von der Festplatte gelesen werden. Dies gilt für aws_s3_bucket_object , jedoch nicht für alle Ressourcentypen, die möglicherweise mit beliebigen Dateien funktionieren.