如何通过与 terraform 的明确依赖关系获得正确的部署顺序

问题描述

在下面的部署之前,我有两个名为“one”和“two”的 droplet 和两个 mongodb 访问列表 IP,即。 mongodbatlas_project_ip_access_list,命名为“一”和“二”。 mongodbatlas_project_ip_access_list 和 digitalocean_droplet 都使用生命周期元参数 create_before_destroy 集,并且 mongodb 访问列表依赖于 droplet。在 TF 配置文件下方

resource "mongodbatlas_project_ip_access_list" "wwww_db_accesslist" {
  for_each = toset(local.droplet_names)
  ip_address = digitalocean_droplet.www[each.value].ipv4_address
  project_id = var.mongodbatlas_project_id
  comment    = format("IP address of the www DO droplet floating IP on %s",var.env)
  lifecycle {
    create_before_destroy = true
  }
}

resource "digitalocean_droplet" "www" {
  for_each = toset(local.droplet_names)
  image              = "docker-20-04"
  name               = format("%s.com.gaitup.%s.www.%s",var.env,var.app_name,each.value)
  region             = var.region
  size               = "s-1vcpu-1gb"
  private_networking = true
  vpc_uuid           = data.digitalocean_vpc.www-vpc.id
  backups            = var.env == "prod" ? true : false
  monitoring         = true
  ssh_keys = [
    data.digitalocean_ssh_key.terraform_do_rsa.id
  ]
  tags = [
    "www",format("%s-%s-%s","www"),]
  user_data = data.template_file.cloud-init-www.rendered
  lifecycle {
    create_before_destroy = true
  }
  provisioner "local-exec" {
    command = "${path.root}/scripts/check_health.sh ${self.ipv4_address}/ping 15"
  }
}

以下是部署输出的片段。因为 wwww_db_accesslist 破坏发生在一开始,我的旧液滴无法到达 mongodb 图集集群,导致应用程序关闭

digitalocean_droplet.www["2"]: Creating...
digitalocean_droplet.www["1"]: Creating...
mongodbatlas_project_ip_access_list.wwww_db_accesslist["one"]: Destroying... 
[id=ZW50cnk=:MTY1LjIyLjIyLjEyNw==-cHJvamVjdF9pZA==:NWZjMGJhOWEzNDcwMzE0NjdlOTVjZjE3]
mongodbatlas_project_ip_access_list.wwww_db_accesslist["two"]: Destroying...                                 
[id=ZW50cnk=:MTY1LjIyLjIzLjIxMg==-cHJvamVjdF9pZA==:NWZjMGJhOWEzNDcwMzE0NjdlOTVjZjE3]
digitalocean_loadbalancer.www-lb: Modifying... [id=5a6d7617-a1cf-4bc2-80c2-e13dc24677bb]
mongodbatlas_project_ip_access_list.wwww_db_accesslist["one"]: Destruction complete after 9s
mongodbatlas_project_ip_access_list.wwww_db_accesslist["two"]: Destruction complete after 9s
digitalocean_droplet.www["2"]: Still creating... [10s elapsed]
digitalocean_droplet.www["1"]: Still creating... [10s elapsed]
digitalocean_droplet.www["2"]: Still creating... [20s elapsed]
digitalocean_droplet.www["1"]: Still creating... [20s elapsed]

尽管设置了 local.droplet_names 生命周期元参数,但在更改 create_before_destroy 的值时,为什么在开始时会发生两个 wwww_db_accesslist(“一”和“二”)的破坏? 如果 local.droplet_names 保持不变,它似乎工作正常,但其他东西是..

我期望在销毁之前首先创建 mongodb 访问列表,因为它依赖于液滴(知道它的 IP)它会等待液滴创建。最后,因为液滴也有 create_before_destroy 生命周期元参数,所以所有的创建都应该首先发生,mongodb 访问列表依赖于液滴,然后是销毁,所以我认为事情的顺序是:

droplet creation -> mongo access list creation -> droplet destruction -> mongo access list destruction 

为了让我的应用始终可用,至少这是我希望发生的事情。这仅适用于 terraform 吗?如果是这样怎么办?如果没有,我可以使用哪些策略?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...