local-exec DESTROY 配置程序中的 terraform 和引用

fly*_*uin 5 terraform terraform0.12+

我正在尝试管理数据库用户以及天蓝色实例的数据库,但令人惊讶的是 \xe2\x80\xa6 是不可能的。我以为我找到了一种使用本地执行提供程序的方法,但是 \xe2\x80\xa6 好吧,显然不是。代码和错误消息如下。

\n

它归结为 terraform 抱怨我引用了其他资源中的非静态内容,我只是 \xe2\x80\xa6 don\xe2\x80\x99t。我只使用静态参数,没有其他。我不明白\xe2\x80\x99不明白的是,我什至可以在提供者配置中引用变量 - 但对于销毁提供者来说,它\xe2\x80\x99s太动态了?

\n

感谢任何帮助!

\n

并转到代码 \xe2\x80\xa6 :

\n
resource "azurerm_postgresql_database" "db" {\n  server_name         = var.server_name\n  resource_group_name = var.server_rg\n  name                = var.db_name\n  charset             = var.db_charset\n  collation           = var.db_collation\n\n\n  provisioner "local-exec" {\n    command = "${path.module}/mgt-user.sh create '${var.server_fqdn}' '${var.server_admin_user}' '${var.db_name}' '${var.db_user_pass}'"\n  }\n\n  provisioner "local-exec" {\n    when    = destroy\n    command = "${path.module}/mgt-user.sh destroy '${var.server_fqdn}' '${var.server_admin_user}' '${var.db_name}' '${var.db_user_pass}'"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在当我运行 terraform init 时我得到这个:

\n
Error: Invalid reference from destroy provisioner\n\n  on ../modules/dbs/pg-db-and-user/db_and_user.tf line 27, in resource "azurerm_postgresql_database" "db":\n  27:     command = "echo ${path.module}/create_user.sh destroy '${var.server_fqdn}' '${var.server_admin_user}' '${var.db_name}' '${var.db_user_pass}'"\n\nDestroy-time provisioners and their connection configurations may only\nreference attributes of the related resource, via 'self', 'count.index', or\n'each.key'.\n\nReferences to other resources during the destroy phase can cause dependency\ncycles and interact poorly with create_before_destroy.\n
Run Code Online (Sandbox Code Playgroud)\n

har*_*vmb 10

更新

下面的答案不起作用。null_resource一种方法是与local-exec&一起使用triggers。一个例子就像::

resource "null_resource" "delete_venafi_cert" {

triggers = {
    venafi_url      = var.venafi_url
    cert_name       = var.cert_name
    venafi_scope    = var.venafi_delete_scope
    venafi_client   = var.venafi_client_id
    venafi_oath_url = var.venafi_oauth_url
  }

  provisioner "local-exec" {
    when       = destroy
    command    = "${path.module}/delete-venafi-certificate.sh ${self.triggers.venafi_url} ${self.triggers.cert_name} ${self.triggers.venafi_scope} ${self.triggers.venafi_client} ${self.triggers.venafi_oath_url}"
    on_failure = continue
  }
}
Run Code Online (Sandbox Code Playgroud)

下面的一个不起作用

下面的代码片段必须带有警告而不是抛出错误。问题是因为path.module变量与配置程序一起使用destroy

Terraform 表示这将在进一步的版本中得到改进。在那之前,您可以传递working_dir指向path.modulevar 的指针。

resource "azurerm_postgresql_database" "db" {
  server_name         = var.server_name
  resource_group_name = var.server_rg
  name                = var.db_name
  charset             = var.db_charset
  collation           = var.db_collation


  provisioner "local-exec" {
    command = "${path.module}/mgt-user.sh create '${var.server_fqdn}' '${var.server_admin_user}' '${var.db_name}' '${var.db_user_pass}'"
  }

  provisioner "local-exec" {
    when    = destroy
    command = "./mgt-user.sh destroy '${var.server_fqdn}' '${var.server_admin_user}' '${var.db_name}' '${var.db_user_pass}'"
    working_dir = path.module
  }
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,您可以参考以下链接::