【问题标题】:What is the sequence of 'create' and 'destroy' during plan phase?在计划阶段“创建”和“销毁”的顺序是什么?
【发布时间】:2019-07-16 16:19:08
【问题描述】:

刚刚运行terraform plan,它吐出了需要针对 GCP API 运行的配置。根据计划,它必须摧毁一些实体并重新创建它们。这些模块不相互依赖。下面的示例输出。

只是想知道创建(在这种情况下更像是“覆盖”)是否发生在销毁之前,反之亦然,还是完全随机的?


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

  + module.project_01.google_project_service.project_service[0]
      id:                 <computed>
      disable_on_destroy: "true"
      project:            "proj-**"
      service:            "compute.googleapis.com"

  + module.project_01.google_project_service.project_service[1]
      id:                 <computed>
      disable_on_destroy: "true"
      project:            "proj-**"
      service:            "cloudresourcemanager.googleapis.com"

  + module.project_01.google_project_service.project_service[2]
      id:                 <computed>
      disable_on_destroy: "true"
      project:            "proj-**"
      service:            "cloudbilling.googleapis.com"

  + module.project_01.google_project_service.project_service[3]
      id:                 <computed>
      disable_on_destroy: "true"
      project:            "proj-**"
      service:            "servicenetworking.googleapis.com"

  - module.project_01.google_project_service.project_service_billing

  - module.project_01.google_project_service.project_service_compute

  - module.project_01.google_project_service.project_service_crm


Plan: 4 to add, 0 to change, 3 to destroy.

------------------------------------------------------------------------

【问题讨论】:

    标签: terraform terraform-provider-gcp


    【解决方案1】:

    在资源无法更新的change+- 情况下,Terraform 将在创建新资源之前自动销毁资源。引用文档:

    默认情况下,当 Terraform 必须更改由于远程 API 限制而无法就地更新的资源参数时,Terraform 将改为销毁现有对象,然后使用新配置的参数创建新的替换对象。

    Terraform 资源基本上将CRUD,并为四个操作中的每一个都编写了代码。在这种change 情况下将尝试更新,但有时由于 API 限制,这是不可能的。在这些情况下,destroy 后跟 create

    但是,当没有可用的更新代码和/或 API 端点可用时,可以在资源内的 lifecycle 块中 create_before_destroy

    lifecycle {
      create_before_destroy = true
    }
    

    您可以在lifecycle block documentation 中阅读更多相关信息。

    【讨论】:

    • 谢谢!那么在这种情况下,如果启用了create_before_destroy,它最终会破坏它创建的东西吗?还是只会破坏旧对象,同时保持新创建的对象完好无损?我想我的困惑是新旧对象是否相同,或者它们是否不同,如果不同,在哪方面?
    • @aplusp 在这种情况下,将创建新资源,然后销毁旧资源,因此新资源将保持不变。这在 AWS 安全组等情况下最有用。
    • 这实际上并没有用问题中的示例回答具体的答案,因为这里没有依赖顺序,所以实际上所有 6 件事都会并行发生(假设 -parallelism&gt;=6 默认为10).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2016-08-27
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多