Terraform SQLCMD 和 ServicePrincipal

问题描述 投票:0回答:1

我试图让我的 terraform 配置运行以下三个

sqlcmd
命令

sqlcmd -S myserver.database.windows.net -d master --authentication-method ActiveDirectoryServicePrincipal -Q "CREATE LOGIN [[email protected]] FROM EXTERNAL PROVIDER;"
sqlcmd -S myserver.database.windows.net -d somedb --authentication-method ActiveDirectoryServicePrincipal -Q "CREATE USER [[email protected]] FOR LOGIN [[email protected]];"
sqlcmd -S myserver.database.windows.net -d somedb --authentication-method ActiveDirectoryServicePrincipal -Q "ALTER ROLE db_ddladmin ADD MEMBER [[email protected]];"

这些环境变量:

  • SQLCMDUSER
  • SQLCMD密码
  • ARM_CLIENT_ID
  • ARM_CLIENT_SECRET
  • ARM_SUBSCRIPTION_ID
  • ARM_TENANT_ID
  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_TENANT_ID

设置正确。许多方法之一是使用

resource "terraform_data" "configure_sql_access" {
  triggers_replace = [
    module.mssqlsrv,
    module.sqldb_for_service
  ]

  for_each = var.env_features["awi"] ?  { for obj in local.required_db : obj.db_name => obj } : {}

  provisioner "local-exec" {
    command = <<EOT
      c:/tools/sqlcmd -S ${module.mssqlsrv[0].fully_qualified_domain_name} -d master --authentication-method ActiveDirectoryServicePrincipal -Q "CREATE LOGIN [${each.value.awi_name}] FROM EXTERNAL PROVIDER;"
    EOT
  }
}

因错误而失败

运行命令'c:/tools/sqlcmd -S myserver.database.windows.net -d master --authentication-method ActiveDirectoryServicePrincipal -Q“从外部提供商创建登录[[电子邮件受保护]]”时出错;“ │ ': 退出状态 1. 输出:Sqlcmd: 'LOGIN': 未知命令。输入“--help”以获取命令帮助。

在同一 cmd 会话中从输出运行相同的命令,没有问题。

我做错了什么?

azure terraform azure-active-directory terraform-provider-azure
1个回答
0
投票

运行命令时出错输出:Sqlcmd:'LOGIN':未知命令。输入“--help”以获取命令帮助。

问题可能在于传递时

sqlcmd
中包含的特殊字符。每个
local-exec
配置程序都在自己独特的 shell 环境中执行,并且还以不同的方式读取命令和特殊字符。

为了使用 terraform 正确读取它们而不产生任何冲突,请使用双反斜杠转义它们,以便它们可以正确传递到

local-exec
下的命令。

还要检查环境中的环境变量是否设置正确。或者,您也可以使用 Provisioner 下的

environment{}
块为
local-exec
部分设置环境变量。

请参阅 SO 了解类似的设置方法。

在您的

local-exec
中添加以下块并执行代码。

environment = { 
  SQLCMDUSER = "" 
  SQLCMDPASSWORD = "*****" 
  ARM_SUBSCRIPTION_ID = "" 
  ARM_TENANT_ID = "Tenant_ID"
 }

提到上面,我修改了命令语法如下。

provisioner "local-exec" {
    command = <<EOT
      c:/tools/sqlcmd -S ${azurerm_mssql_server.example.name}.database.windows.net
 -d master --authentication-method ActiveDirectoryServicePrincipal -Q "CREATE LOGIN \\[${xxxx}\\] FROM EXTERNAL PROVIDER;"
    EOT
  }

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.