據我所知,有三種方法可以讓 Terraform 使用預填充的插件(以防止從網路上下載init命令)。
terraform provider mirror命令provider_installationin .terraformrc(或 terraform.rc)terraform init -plugin-dir命令- 預熱提供者插件快取
它們都是等價的嗎?推薦哪一個?我的用例是為 CI/CD 管道構建“部署者”docker 映像,并且我正在考慮在Terraspace下使用 Terraform 的可能性。
uj5u.com熱心網友回復:
前兩個是相互關聯的,因為它們都共享相同的底層機制:“檔案系統鏡像”插件安裝方法。
使用terraform init -plugin-dir使 Terraform實際上構造了一個一次性provider_installation塊,其中僅包含一個filesystem_mirror參考給定目錄的塊。它允許您僅通過一個安裝操作獲得這種效果,而不是在一個中心位置為所有未來命令配置它。
具體來說,如果您運行,terraform init -plugin-dir=/example那么它在功能上等同于以下 CLI 配置:
provider_installation {
filesystem_mirror {
path = "/example"
}
}
插件快取目錄不同,因為 Terraform 仍會訪問配置的安裝方法(默認情況下,每個提供程式的原始注冊表),但會跳過下載插件包檔案(實際上包含插件代碼的檔案,而不是有關插件的元資料)釋放),如果它已經在快取中。同樣,它會將下載的任何新插件包保存到快取中以備將來使用。
因此,這不會阻止 Terraform 嘗試安裝它通過網路訪問原始注冊表遇到的任何新插件。這只是為了避免重復重新下載同一個包的優化。
最后一種方法與第一種方法類似,但略有不同:隱含的本地鏡像目錄。
如果您provider_installation的配置中沒有塊,那么 Terraform 將通過搜索隱含的鏡像目錄并將它在那里找到的任何提供程式視為僅本地提供程式來為自己構建一個。例如,如果/usr/share/terraform/plugins包含registry.terraform.io/hashicorp/aws(官方 AWS 提供商)的任何版本,那么 Terraform 的行為就好像它配置如下:
provider_installation {
filesystem_mirror {
path = "/usr/share/terraform/plugins"
include = ["registry.terraform.io/hashicorp/aws"]
}
direct {
exclude = ["registry.terraform.io/hashicorp/aws"]
}
}
因此,這使得 Terraform 將本地目錄視為該特定提供程式的唯一可能的安裝源,但仍允許 Terraform 從上游獲取任何其他提供程式(如果需要)。
如果你的要求是terraform init不征詢任何遠程服務在所有的插件安裝的目的,直接用于這種情況下,采取的辦法是寫一個provider_installation塊只用filesystem_mirror它的塊中,因此這將禁用direct {}的安裝方法,從而防止Terraform 嘗試訪問任何提供程式的原始注冊表。
uj5u.com熱心網友回復:
不確定 Terraspace。僅關于插件:
terraform provider mirrorcommandprovider_installationin .terraformrc(或 terraform.rc):似乎更安全的版本,但每當您更改插件版本時都需要更新本地鏡像。對于需要不同插件集或版本的不同配置,是否可以重用相同的鏡像位置還不是很清楚。terraform init -plugin-dir命令:如果未預裝所需的插件和特定版本,terraform 命令將失敗。這種方法似乎是最耗時的,也是對可用插件的最大控制。
使用此選項時,只有給定目錄中的插件可供使用。
- 預熱provider-plugin-cache:這個可以重復使用預先下載的插件版本,并且會在您更新約束時嘗試下載新版本。如果您的快取路徑可寫,此方法將有效。如果不是,那么 terraform 作為第二個選項可能會失敗。這個選項似乎耗時最少,也更貼近當地的發展。快取不會自動清理,需要一些清理自動化。
根據您是否有許多不同的配置、需要什么級別的安全性、您是否有能力足夠頻繁地更新快取/鏡像以跟隨所需版本,選擇也可能不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/388092.html
