我试图让我的 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]];"
这些环境变量:
设置正确。许多方法之一是使用
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 会话中从输出运行相同的命令,没有问题。
我做错了什么?
运行命令时出错输出: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
}