提问人:Michael 提问时间:9/5/2023 更新时间:9/6/2023 访问量:133
terraform 本地预配程序中的 Sqlcmd 多行脚本
Sqlcmd multiline script in terraform local provisioner
问:
当我运行此配置程序时,它给了我错误:
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}'
答:
0赞
SiddheshDesai
9/6/2023
#1
若要在本地计算机中下载并安装 SSMS,安装 SSMS 后,默认情况下会安装。请参阅下文:-sqlcmd
local exec
sqlcmd
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)
输出:-
评论
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” } 你的命令应该可以工作
评论