嘗試將從 azure 門戶創建的 sql dbs 添加到 azure 故障轉移組。
Terraform 塊將呼叫 bash 腳本:
data "external" "database_names" {
program = ["sh", "${path.module}/scripts/fetch_db_id.sh"]
query = {
db_rg = azurerm_resource_group.mssql.name
server_name = azurerm_mssql_server.mssqlserver.name
}
}
fetch_db_id.sh bash 腳本:
#!/usr/bin/env bash
# This script will get the database names at runtime.
eval "$(jq -r '@sh "export DB_RG=\(.db_rg) SERVER_NAME=\(.server_name)"')"
if [[ -z $DB_RG || -z $SERVER_NAME ]]; then
echo "Required variables DB_RG & SERVER_NAME not set" 1>&2
exit 1
fi
db_id=$(az sql db list --resource-group $DB_RG --server $SERVER_NAME --query [*].id | grep -v master 2>/dev/null)
jq -n --arg db_id "$db_id" '{"db_id":$db_id}'
unset DB_RG SERVER_NAME NODE_RG db_id
exit 0
Bash 腳本輸出:在沒有 terraform 的 linux VM 上本地運行它:
"db_id": "[\n "/subscriptions/my_subscription_id/resourceGroups/sql_rg/providers/Microsoft.Sql/servers/sql_server_name/databases/databaseprd-db1",\n "/subscriptions/my_subscription_id/resourceGroups/sql_rg/providers/Microsoft .Sql/servers/sql_server_name/databases/databaseprd-db2",\n "/subscriptions/my_subscription_id/resourceGroups/sql_rg/providers/Microsoft.Sql/servers/sql_server_name/databases/databaseprd-db3"\n]" }
Terraform 資源塊以在故障轉移組中添加資料庫:
resource "azurerm_sql_failover_group" "mssql_failover" {
count = (var.enable_read_replica && var.environment == "prd") ? 0 : 1
name = var.mssql_failover_group
resource_group_name = azurerm_resource_group.mssql.name
server_name = azurerm_mssql_server.mssqlserver.name
databases = toset(jsondecode(data.external.database_names.result["db_id"]))
partner_servers {
id = azurerm_mssql_server.replica[0].id
}
read_write_endpoint_failover_policy {
mode = "Automatic"
grace_minutes = 60
}
depends_on = [
azurerm_mssql_server.replica
]
}
terraform 錯誤代碼:通過 terraform jenkins 管道執行時
[1mdata.external.database_names.result["db_id"][0m 是 "[\n "/subscriptions/my_subscription_id/resourceGroups/sql_rg/providers/Microsoft.Sql/servers/sql_server_name/databases/databaseprd-db1",\n " /subscriptions/my_subscription_id/resourceGroups/sql_rg/providers/Microsoft.Sql/servers/sql_server_name/databases/databaseprd-db2",\n "/subscriptions/my_subscription_id/resourceGroups/sql_rg/providers/Microsoft.Sql/servers/sql_server_name/databases databaseprd- db3",\n]" 呼叫函式 "jsondecode" 失敗:無效字符 ']' 尋找值的開頭
注意:當我們使用 terraform jenkins 管道運行它時,它會引入一個額外的“,”,這可能會導致 json 錯誤。
uj5u.com熱心網友回復:
我不認為這里有足夠的資訊可以確定,但我可以給出一個部分的、推測性的答案。
az sql db list --resource-group $DB_RG --server $SERVER_NAME --query [*].id | grep -v master 2>/dev/null
這看起來很可疑:該az命令輸出 JSON,但您正在使用 grep 對其進行過濾。這里的輸出是az什么樣的?你希望結果是有效的 JSON 嗎?
你說我們的輸出有一個你不期望的逗號。如果az命令輸出類似以下內容,這就是您期望看到的:
[
"/blah/blah/databaseprd-db1",
"/blah/blah/databaseprd-db2",
"/blah/blah/databaseprd-db3",
"/blah/blah/master"
]
該grep -v master會洗掉行包含術語“主人”,讓你與無效JSON:
[
"/blah/blah/databaseprd-db1",
"/blah/blah/databaseprd-db2",
"/blah/blah/databaseprd-db3",
]
如果你想使用jq,你可以用類似的東西替換 grep
jq 'map(select(index("master")|not))'
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/393654.html
標籤:天蓝色 地形 azure-sql-数据库 jq terraform-provider-azure
下一篇:阻止.exe檔案
