我有一個包含檔案的本地目錄。如何使用 Terraform 將該目錄與包含的物件復制到另一個目錄?而且我每次應用模塊時都需要這樣做,而不僅僅是第一次。
我嘗試使用provisioner "local-exec",但它不適合我,因為我將在 Linux 和 Win 上運行它,我不想每次都更改命令和解釋器
uj5u.com熱心網友回復:
Terraform 不是為管理本地檔案而設計的;它主要用于通過網路使用遠程 API,以便結果可以在運行之間保持在遠程系統中。
但是,提供hashicorp/local程式確實有一些資源型別,它們試圖將本地檔案系統視為遠程 API。它的檔案包含對這樣做的可能限制的警告:
Terraform 主要處理能夠比單次 Terraform 運行更長的遠程資源,因此本地資源有時可能會違反其假設。最好謹慎使用此處的資源,因為根據本地狀態,可能難以在許多不同的本地系統上應用相同的 Terraform 配置,而這些本地資源可能無法普遍使用。有關詳細資訊,請參閱每個資源中的特定說明。
如果您可以接受這種權衡,那么應該可以實作一個 Terraform 模塊,該模塊宣告您使用資源型別來宣告目標檔案所描述的local_file效果,但提供者沒有用于讀取內容的資料源目錄,因此對于源檔案,需要在 Terraform 運行之前將檔案集固定在磁盤上,以便使用該fileset功能。(函式在 Terraform 執行任何其他操作之前作為初始配置評估的一部分進行評估,因此該函式無法在 Terraform 運行時對檔案系統所做的更改做出反應。)
variable "source_dir" {
type = string
}
variable "destination_dir" {
type = string
}
locals {
source_files = fileset(var.source_dir, "**")
}
resource "local_file" "dest" {
for_each = local.source_files
filename = "${var.source_dir}/${each.value}"
content_base64 = filebase64("${var.destination_dir}/${each.value}")
}
這用于local_file宣告每個目標檔案都應該存在。
這里一個重要的警告是,該filebase64函式將給定檔案的全部內容讀入記憶體,然后 Terraform 將該值復制到提供者的content_base64引數中,作為對提供者插件的請求的一部分。這意味著只有當您知道要復制的所有檔案都相對較小時,此技術才可行。如果您有任何特別大的檔案,那么您可能會遇到 RAM 限制,將檔案加載到記憶體或提供程式插件協議訊息大小限制將內容發送到hashicorp/local提供程式。
如果有任何方法可以使用 Terraform 之外的軟體解決這部分問題,例如使用傳統的配置管理工具,那么我建議您考慮使用這種方法。盡管這可能有效,但這不是 Terraform 的設計目的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/531750.html
標籤:linux视窗地形
