terraform и ссылки в local-exec УНИЧТОЖАЮТ провайдеров

#terraform #terraform0.12

#terraform #terraform0.12

Вопрос:

я пытаюсь управлять пользователями базы данных вместе с базой данных для экземпляра Azure, и это на удивление … невозможно. Я думал, что нашел способ использовать поставщика услуг локального исполнителя, но … ну, видимо, нет. код и сообщение об ошибке приведены ниже.

это сводится к тому, что terraform жалуется, что я ссылаюсь на нестатические материалы из других ресурсов, чего я просто … не делаю. Я использую только статические параметры, ничего больше. чего я не понимаю, так это того, что я могу ссылаться на переменные даже в конфигурациях провайдера, но для destroy provisioners это слишком динамично?

ценю любую помощь!

и перейдем к коду … :

 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 = "${path.module}/mgt-user.sh destroy '${var.server_fqdn}' '${var.server_admin_user}' '${var.db_name}' '${var.db_user_pass}'"
  }
}
 

теперь, когда я запускаю инициализацию terraform, я получаю это:

 Error: Invalid reference from destroy provisioner

  on ../modules/dbs/pg-db-and-user/db_and_user.tf line 27, in resource "azurerm_postgresql_database" "db":
  27:     command = "echo ${path.module}/create_user.sh destroy '${var.server_fqdn}' '${var.server_admin_user}' '${var.db_name}' '${var.db_user_pass}'"

Destroy-time provisioners and their connection configurations may only
reference attributes of the related resource, via 'self', 'count.index', or
'each.key'.

References to other resources during the destroy phase can cause dependency
cycles and interact poorly with create_before_destroy.
 

Комментарии:

1. Если это точно, то вам, вероятно, нужно сообщить о проблеме в трекере, чтобы логику можно было уточнить.

2. Я только что попробовал с 0.12.20 версией terraform, terraform init сработало. Было бы хорошо, если бы вы также могли добавить файл vars.

3. Итак, теперь я понимаю, в чем проблема. Это ${path.module} значение, передаваемое в destroy provisioner. Если вы используете какой-либо другой статический путь, например /tmp , /home он работает с предупреждением. Это обсуждалось здесь github.com/hashicorp/terraform/issues/23675 и более широкое обсуждение здесь github.com/hashicorp/terraform/issues/23679

Ответ №1:

Приведенный ниже фрагмент должен работать с предупреждением, а не выдавать ошибку. Проблема заключалась в том, что path.module переменная использовалась в тандеме с destroy provisioner.

Terraform заявляет, что это будет улучшено в следующих выпусках. До тех пор вы могли передавать working_dir указание на path.module var.

 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
  }
}
 

Для получения более подробной информации вы можете обратиться к ссылкам ниже::