У меня есть 3 среды для моей инфраструктуры.Все они одинаковые, но разных размеров.Я понимаю, что это хороший пример использования рабочих пространств Terraform.И действительно, это хорошо работает в этом отношении.Но, пожалуйста, поправьте меня, если это не правильный путь.
Теперь моя единственная проблема - это управление DNS в рабочих пространствах.Я использую провайдера Google, и он работает, имея 2 типа ресурсов: google_dns_managed_zone
, который представляет зону, и тип google_dns_record_set
для каждой записи DNS.
Обратите внимание, что тип набора записей должен иметь ссылку натип управляемой зоны.
Имея это в виду, мне нужно управлять зоной DNS из производственной среды.Я не могу поделиться этим ресурсом в других рабочих пространствах, потому что я должен быть в состоянии уничтожить рабочую область dev или staging без разрушения зоны DNS.
Я пытаюсь решить эту проблему с помощью count
.Я использую его как логическое значение, как показано в коде ниже, и нахожу его довольно хакерским, но это то, что я нашел в сообществе Terraform.Любое улучшение приветствуется.
Это позволяет мне иметь зону и производственные записи (как MX, показанный ниже в качестве примера) только в рабочем пространстве prod.
Но тогда я застрял, когда дело доходит до управлениянаборы записей только в определенной рабочей области.Мне это нужно, например, в случае создания nginx в рабочей области dev и автоматического создания для него набора записей DNS, например dev.example.com.
Для этого мне нужен доступ к ресурсу управляемой зоны.Как показано ниже, я использую terraform_remote_state
для доступа к ресурсу из рабочей области prod.Насколько я понимаю, это работает с output
, который вы можете увидеть ниже.Когда я выбираю рабочую область prod, я действительно могу вывести управляемую зону.И затем, если я выберу другое рабочее пространство, используя удаленное состояние, удастся извлечь управляемую зону из prod.Но моя проблема в том, что Terraform завершается неудачно, когда дело доходит до строки output
, поскольку она присутствует только в рабочем пространстве prod и не существует ни в каком другом рабочем пространстве и поэтому не может быть выведена.
Так что это чепуха, и я не понимаю, есть ли лучший способ добиться этого.Я провел немало исследований и спросил сообщество, но не смог найти ответ на этот вопрос.Мне кажется, что управление DNS является общим для всех инфраструктур и должно быть довольно хорошо освещено.Что я делаю не так и как это должно быть сделано?
locals {
environment="${terraform.workspace}"
dns_zone_managers = {
"dev" = "0"
"staging" = "0"
"prod" = "1"
}
dns_zone_manager = "${lookup(local.dns_zone_managers, local.environment)}"
}
resource "google_dns_managed_zone" "base_zone" {
name = "base_zone"
dns_name = "example.com."
count = "${local.dns_zone_manager}"
}
resource "google_dns_record_set" "mx" {
name = "${google_dns_managed_zone.base_zone.dns_name}"
managed_zone = "${google_dns_managed_zone.base_zone.name}"
type = "MX"
ttl = 300
rrdatas = [
"10 spool.mail.example.com.",
"50 fb.mail.example.com."
]
count = "${local.dns_zone_manager}"
}
data "terraform_remote_state" "dns" {
backend = "local"
workspace = "prod"
}
output "dns_zone_name" {
value = "${google_dns_managed_zone.base_zone.*.name[0]}"
}
Затем я могу вводить наборы записей только в определенном рабочем пространстве, снова используя count
и обращаясь к управляемой зоне через удаленное состояние, вот так:
resource "google_dns_record_set" "a" {
name = "dev"
managed_zone = "${data.terraform_remote_state.dns.dns_zone_name}"
type = "A"
ttl = 300
rrdatas = ["1.2.3.4"]
}