簡體   English   中英

如何在 Terraform 中 DRY 重復塊列表

[英]How to DRY repeating block lists in Terraform

我有以下配置,我想避免重復registrant_contactadmin_contacttech_contact 我怎樣才能使這個配置更短? 我有多個域,相同的阻止列表在配置文件中一次又一次地重復:

locals {
  contact = {
    address_line_1 = "Berlin"
    city           = "Berlin"
    contact_type   = "PERSON"
    country_code   = "DE"
    email          = var.aws_billing_mails[0]
    first_name     = "Foo"
    last_name      = "Bar"
    zip_code       = "12345"
    phone_number   = "+49.123456789"
  }
}

resource "aws_route53domains_registered_domain" "my_domain" {
  domain_name        = "mydomain.com"
  auto_renew         = true
  transfer_lock      = true
  registrant_privacy = true
  admin_privacy      = true
  tech_privacy       = true

  registrant_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }

  admin_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }

  tech_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }
}

resource "aws_route53domains_registered_domain" "my_other_domain" {
  domain_name        = "myotherdomain.com"
  auto_renew         = true
  transfer_lock      = true
  registrant_privacy = true
  admin_privacy      = true
  tech_privacy       = true

  registrant_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }

  admin_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }

  tech_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }
}

您對塊無能為力,但可以減少資源數量 因此,在for_each的幫助下,您可以只擁有一個,而不是擁有兩個aws_route53domains_registered_domain 例如:

locals {
 contact = {
    "mydomain.com" = {
        address_line_1 = "Berlin"
        city           = "Berlin"
        contact_type   = "PERSON"
        country_code   = "DE"
        email          = var.aws_billing_mails[0]
        first_name     = "Foo"
        last_name      = "Bar"
        zip_code       = "12345"
        phone_number   = "+49.123456789"
    },
    
    "myotherdomain.com" = {
        address_line_1 = "Berlin"
        city           = "Berlin"
        contact_type   = "PERSON"
        country_code   = "DE"
        email          = var.aws_billing_mails[0]
        first_name     = "Foo"
        last_name      = "Bar"
        zip_code       = "12345"
        phone_number   = "+49.123456789"
    }
}

然后


resource "aws_route53domains_registered_domain" "domain" {
  
  for_each           = local.contact

  domain_name        = each.key
  auto_renew         = true
  transfer_lock      = true
  registrant_privacy = true
  admin_privacy      = true
  tech_privacy       = true

  registrant_contact {
    address_line_1 = each.value.address_line_1
    city           = each.value.city
    contact_type   = each.value.contact_type
    country_code   = each.value.country_code
    email          = each.value.email
    first_name     = each.value.first_name
    last_name      = each.value.last_name
    zip_code       = each.value.zip_code
    phone_number   = each.value.phone_number
  }

  admin_contact {
    address_line_1 = each.value.address_line_1
    city           = each.value.city
    contact_type   = each.value.contact_type
    country_code   = each.value.country_code
    email          = each.value.email
    first_name     = each.value.first_name
    last_name      = each.value.last_name
    zip_code       = each.value.zip_code
    phone_number   = each.value.phone_number
  }

  tech_contact {
    address_line_1 = each.value.address_line_1
    city           = each.value.city
    contact_type   = each.value.contact_type
    country_code   = each.value.country_code
    email          = each.value.email
    first_name     = each.value.first_name
    last_name      = each.value.last_name
    zip_code       = each.value.zip_code
    phone_number   = each.value.phone_number
  }
}

更新如果您總是使用相同的聯系人,則:

locals {
 
  domains = ["mydomain.com", "myotherdomain.com"]

  contact = {
    address_line_1 = "Berlin"
    city           = "Berlin"
    contact_type   = "PERSON"
    country_code   = "DE"
    email          = var.aws_billing_mails[0]
    first_name     = "Foo"
    last_name      = "Bar"
    zip_code       = "12345"
    phone_number   = "+49.123456789"
  }
}

然后

resource "aws_route53domains_registered_domain" "my_domain" {

  for_each           = toset(local.domains) 

  domain_name        = each.key
  auto_renew         = true
  transfer_lock      = true
  registrant_privacy = true
  admin_privacy      = true
  tech_privacy       = true

  registrant_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }

  admin_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }

  tech_contact {
    address_line_1 = local.contact.address_line_1
    city           = local.contact.city
    contact_type   = local.contact.contact_type
    country_code   = local.contact.country_code
    email          = local.contact.email
    first_name     = local.contact.first_name
    last_name      = local.contact.last_name
    zip_code       = local.contact.zip_code
    phone_number   = local.contact.phone_number
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM