#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
}
}
Для получения более подробной информации вы можете обратиться к ссылкам ниже::