Áno, niekedy chcete vytvoriť / nastaviť určitý blok v rámci resource iba vtedy, keď je nastavená konkrétna časť premennej.
… a áno, je to možné, vďaka try a dynamic blocks ako aj for_each :)
Ukážem vám, ako to dosiahnuť.
Povedzme napríklad, že chcete v gcp vytvoriť niekoľko rôznych segmentov a chcete použiť premennú terraformu na „ďalšiu“ definíciu niektorých detailov, okrem „predvolených“ nastavení definovaných v súbore .tf.
Nech je toto vaša konfiguračná premenná segmentov, pomenujme ju gcp_buckets
, ktorá je pochopiteľne vo formáte json:
{
"test-bucket": {
"cors": [
{
"origin": [
"*"
],
"method": [
"GET",
"HEAD"
],
"responseHeader": [
"Content-Type"
],
"maxAgeSeconds": 3600
}
]
},
"test-bucket-two": {
"ttlDays": 2
}
}
Teraz chcete vytvoriť blok „cors“ iba keď má objekt „bucket“ v premennej gcp_buckets
kľúč s názvom „cors“ a odtiaľ prevezmete konfiguráciu. Tiež chcete nastaviť lifecycle_rule
, iba ak existuje kľúč s názvom „ttlDays“ a odtiaľ použiť hodnotu ..
Takto to robím ja, dovoľte mi vysvetliť základné veci.
- Tento resource sa generuje iba vtedy, keď existuje premenná
gcp_storage
a vďaka vyššie uvedenej funkcii try sa pokúsi extrahovať údaje kódované v json formáte a ak zlyhá, vráti prázdny objekt, čo znamená, že nie sú generované žiadne resources, inak generuje resource pre každý objekt, ktorý iterujeme vďaka for_each. - Ako je vysvetlené vyššie, blok
cors
pre resource sa vytvára iba „dynamicky“, keď v objekte existuje kľúč cors a potom použije hodnoty odtiaľ. - Rovnako ako v prípade bloku cors, jeden z parametrov
lifecycle_rule
-s sa vygeneruje iba ak existuje kľúč s názvom ttlDays a odtiaľ potom získa hodnotu. - Posledná nedynamický lifecycle_rule slúži ako príklad ‘predvoleného’ bloku, ktorý sa vytvára pre každý vytvorený resource, rovnako ako s definíciou nastavení pre tento resource atď.
resource "google_storage_bucket" "global" {
for_each = try(jsondecode(var.gcp_storage), {})
name = each.key
project = google_project.project.project_id
location = "US-EAST1"
storage_class = "STANDARD"
requester_pays = "false"
default_event_based_hold = "false"
force_destroy = "false"
uniform_bucket_level_access = "false"
dynamic "cors" {
for_each = try(each.value.cors, {})
content {
max_age_seconds = cors.value.maxAgeSeconds
method = cors.value.method
origin = cors.value.origin
response_header = cors.value.responseHeader
}
}
dynamic "lifecycle_rule" {
for_each = try(["${each.value.ttlDays}"], {})
content {
action {
type = "Delete"
}
condition {
age = lifecycle_rule.value
created_before = ""
days_since_custom_time = "0"
days_since_noncurrent_time = "0"
num_newer_versions = "0"
with_state = "ANY"
}
}
}
lifecycle_rule {
action {
type = "Delete"
}
condition {
age = "0"
created_before = ""
days_since_custom_time = "0"
days_since_noncurrent_time = "30"
num_newer_versions = "0"
with_state = "ANY"
}
}
versioning {
enabled = "true"
}
lifecycle {
ignore_changes = [labels,]
}
}
Dúfam, že vám to pomôže a užite si prácu s Terraform !