terraform 本地预配程序中的 Sqlcmd 多行脚本

Sqlcmd multiline script in terraform local provisioner

提问人:Michael 提问时间:9/5/2023 更新时间:9/6/2023 访问量:133

问:

当我运行此配置程序时,它给了我错误:

exit status 2. Output: Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Login failed for user 'User'..
│ /bin/sh: 2: Syntax error: "(" unexpected

TF代码:

resource "null_resource" "init" {
  
depends_on = [azurerm_mssql_firewall_rule.creator]

  provisioner "local-exec" {
    command = <<EOT
sqlcmd -S tcp:someserver.database.windows.net -d master -U ${var.mssql_admin_username} -P ${var.mssql_admin_password}
IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'poweruser')
BEGIN
CREATE USER poweruser;
ALTER USER poweruser WITH PASSWORD '${var.mssql_admin_password}';
END;
QUIT
    EOT
  }
}

看起来它把它作为一个命令。如何将其拆分为两个命令?我不能将 sql 部分用于单独的文件,因为我需要获取值。'${var.mssql_admin_password}'

Azure Terraform azure-sql-database sqlcmd

评论


答:

0赞 SiddheshDesai 9/6/2023 #1

若要在本地计算机中下载并安装 SSMS,安装 SSMS 后,默认情况下会安装。请参阅下文:-sqlcmdlocal execsqlcmd

SSMS 下载参考:-

现在,运行以下 terraform 脚本来部署 Azure SQL DB,并使用 local_exec 运行 sql 命令来创建 DB 和 Table。

My locals.tf:-

locals {
  resource_group_name="silicon-app-grp"
  location="North Europe"  
}

My main.tf:-

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.37.0"
    }
  }
}

provider "azurerm" {
  # Configuration options
  subscription_id = "sub-id"
  tenant_id       = "tenant-id"
  client_id       = "client-id"
  client_secret   = "client-secret"
  features {}
}

My sqldatabase.tf:-

resource "azurerm_mssql_server" "sqlserver" {
  name                         = "sqlserver400908"
  resource_group_name          = local.resource_group_name
  location                     = local.location
  version                      = "12.0"
  administrator_login          = "adminuser"
  administrator_login_password = "Admin@123"  
  depends_on = [
    azurerm_resource_group.appgrp
  ]
}

resource "azurerm_mssql_database" "appdb" {
  name           = "appdb"
  server_id      = azurerm_mssql_server.sqlserver.id
  collation      = "SQL_Latin1_General_CP1_CI_AS"
  license_type   = "LicenseIncluded"
  max_size_gb    = 2  
  sku_name       = "S0"  

 lifecycle {
    ignore_changes = [
      license_type
    ]
  }
  
  depends_on = [
    azurerm_mssql_server.sqlserver
      ]
  
}


resource "azurerm_mssql_firewall_rule" "allowmyclient" {
  name             = "AllowClientIP"
  server_id        = azurerm_mssql_server.sqlserver.id
  start_ip_address = "103.133.65.143"
  end_ip_address   = "103.133.65.143"
  depends_on = [
    azurerm_mssql_server.sqlserver
  ]
}

My sqlcmd.tf:-

resource "null_resource" "database_setup" {
  provisioner "local-exec" {
      command = "sqlcmd -S ${azurerm_mssql_server.sqlserver.fully_qualified_domain_name} -U ${azurerm_mssql_server.sqlserver.administrator_login} -P ${azurerm_mssql_server.sqlserver.administrator_login_password} -d appdb -i 01.sql"
  }
  depends_on=[
    azurerm_mssql_database.appdb
  ]
}

01.sql 是我的 SQL 脚本文件,与上面的 Terraform 文件位于同一文件夹中。

01.sql 脚本:-

CREATE TABLE Products
(
     ProductID int,
     ProductName varchar(1000),
     Quantity int
)


INSERT INTO Products(ProductID,ProductName,Quantity) VALUES (1,'Mobile',100)

INSERT INTO Products(ProductID,ProductName,Quantity) VALUES (2,'Laptop',200)

INSERT INTO Products(ProductID,ProductName,Quantity) VALUES (3,'Tabs',300)

参考

输出:-

enter image description here

enter image description here

enter image description here

评论

0赞 Michael 9/6/2023
这是chatgpt的答案吗?你的回答根本无法解决我在问题中描述的问题。此外,您绝对不需要安装 SSMS 即可使 sqlcmd 正常工作......
0赞 SiddheshDesai 9/6/2023
不,我已经在我的 VS Code 中尝试过了,你能检查一下我的 sqlcmd.tf 吗?我是否为sqlcmd添加了正确的连接字符串以使其正常工作?此外,是的,SSMS 不是强制性的。但默认情况下,这是在系统中安装 sqlcmd 的方法之一。
0赞 SiddheshDesai 9/6/2023
用户“User”登录失败。│ /bin/sh: 2: 语法错误: “(” unexpected > 检查我的 sqlcmd sqlcmd.tf 文件中,并尝试使你的连接字符串格式相同。我引用了管理员用户名和密码 sqldatabase.tf
0赞 SiddheshDesai 9/6/2023
我建议你试试我上面的代码,这应该有助于你运行sqlcmd,你不会因为登录而收到ODBC错误。
0赞 SiddheshDesai 9/6/2023
@Michael 尝试添加 IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE NAME = 'poweruser') BEGIN CREATE USER poweruser;使用密码“${var.mssql_admin_password}”更改用户 poweruser;结束;在 01.sql 命令文件中退出 sql 命令,然后运行此设置程序 “local-exec” { command = “sqlcmd -S ${azurerm_mssql_server.sqlserver.fully_qualified_domain_name} -U ${azurerm_mssql_server.sqlserver.administrator_login} -P ${azurerm_mssql_server.sqlserver.administrator_login_password} -d appdb -i 01.sql” } 你的命令应该可以工作