抱歉,基本問題是 terraform 的新手。我在 terraform 中運行了一些示例示例,其中許多示例顯示了區域變數的宣告,即本地變數,按名稱聽起來像是它的范圍,是檔案的本地變數。而不是本地人,我們應該能夠將此串列作為變數傳遞,對嗎?例如.also,示例使用 for_each 構造或 locals.names[count.index] ,其中 count.index = length(locals.names) ,在 terraform 中傳遞和迭代此類串列的最佳方法是什么?
variable "name_list"{
names = ["luke", "Tom", ...]
type = ...
}
檔案 - main.tf
locals{
names = ["luke", "Tom", "Jerry"]
}
resource "aws..." "example..."{
foreach
}
我作為本地人嘗試過,但想將串列作為變數傳遞。
uj5u.com熱心網友回復:
如果您熟悉通用編程語言,那么將 Terraform 模塊視為類似于函式可能會有所幫助,然后模塊中的三種不同型別的命名值也有類比:
- 輸入變數就像函式引數。
- 區域值就像函式中的區域變數。
- 輸出值類似于回傳值。
這個類比并不完美,因為例如在許多語言中,一個函式只能回傳一個值,但 Terraform 允許一個模塊回傳許多單獨的命名值。但希望這仍然可以更容易地想象每一個的范圍和目的。
在模塊的其他地方,運算式既可以參考輸入變數,也可以參考區域值:
var.name_list指variable "name_list"您在示例中顯示的宣告。local.names指names您在示例中顯示的本地值。
您提到要將此與 一起使用for_each,重要的for_each是您分配給它的值必須是映射或一組字串。for_each主要想使用地圖,但是如果您分配一個像 then 這樣的集合,toset(["a", "b"])為了方便起見for_each,它將把它解釋為您已經寫過tomap({"a" = "a", "b" = "b"})與你的每一個元素。
由于您在示例中顯示了一組唯一名稱,因此一組字串似乎足以滿足您的目的,因此以下兩個示例顯示了如何宣告一組字串并在 中使用它for_each,首先使用本地值,然后使用輸入變數。
locals {
names = toset(["Luke", "Tom", "Jerry"])
}
resource "example" "example" {
for_each = local.names
# ...
}
variable "names" {
type = set(string)
}
resource "example" "example" {
for_each = var.names
# ...
}
如果在根 Terraform 模塊中使用第二個示例,則需要names在運行時從模塊外部設定值terraform apply。有多種不同的方法可以做到這一點,但為了舉例,一種簡單的方法是創建一個名為的檔案并將example.tfvars以下內容寫入其中:
names = ["Luke", "Tom", "Jerry"]
然后您可以運行terraform apply -var-file=example.tfvars以使用該組名稱應用此配置。請注意,您不需要(也絕對不能)toset(...)在.tfvars檔案中寫入,因為對于輸入變數,模塊本身負責決定型別,就像我們type = set(string)在上面的配置中所做的那樣。toset因此,Terraform 將在將其傳遞到模塊之前自動有效地傳遞該值。
您通常應該只將根模塊輸入變數用于您期望在運行之間更改的值,而無需編輯模塊自己的源代碼。對于作為模塊定義的一部分固定的東西,區域值是更好的選擇。
uj5u.com熱心網友回復:
在您對變數型別的理解中,似乎有些事情混淆了。有區域變數(用locals塊表示)和輸入變數 [1](它們開始于variable并且通常在單獨的檔案中定義)。檔案中關于locals[2] 的內容:
區域值有助于避免在配置中多次重復相同的值或運算式,但如果過度使用,它們還會通過隱藏使用的實際值使未來的維護者難以閱讀配置。
在多個地方使用單個值或結果并且該值將來可能會更改的情況下,僅適度使用本地值。在中心位置輕松更改值的能力是本地值的關鍵優勢。
為了進一步擴展,您的問題存在一些不準確之處。例如,count.index僅與count元引數一起使用,而不是for_each. 后者需要有一套或一張地圖。如果要使用 list 型別的變數(本地或輸入)for_each,可以使用toset[3] 內置函式將其轉換為集合。
繼續,如果你已經定義了一個輸入變數,你可以使用var.<variable_name>[4] 來參考它:
注意:輸入變數由變數塊創建,但您將它們作為名為 var 的物件的屬性參考。
為了達到最后一點,一個關于如何使用區域變數的示例for_each:
resource "aws..." "example..."{
for_each = toset(local.names)
}
使用宣告的輸入變數:
resource "aws..." "example..."{
for_each = toset(var.name_list)
}
如您所見,在第二個示例中,您使用的是var后跟變數名的物件,即var.name_list.
[1] https://developer.hashicorp.com/terraform/language/values/variables
[2] https://developer.hashicorp.com/terraform/language/values/locals#when-to-use-local-values
[3] https://developer.hashicorp.com/terraform/language/functions/toset
[4] https://developer.hashicorp.com/terraform/language/values/variables#using-input-variable-values
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527148.html
標籤:亚马逊网络服务地形terraform-provider-aws亚马逊-sns
