es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecución de invoke-sqlcmd dentro de Terraform

He creado esto en Terraform: estoy tratando de ejecutar algunos comandos SQL en el servidor SQL después de que se haya construido y se ejecute en el momento correcto. Realmente no puedo usar un nombre de usuario y contraseña para ejecutar el Invoke-sqlcmd, y ¿por qué debería hacerlo cuando Terraform se está ejecutando con la cuenta correcta?

Aquí está mi código:

Recurso “null_resource” “create-sql-user” {

  Provisionador “local-exec” {
    Comando = <<eot
    install-module -name sqlserver -force
     invoke-sqlcmd -query “create login [azsg-atp-users-${var.environment}] from external provider” -connectionstring “server=tcp:sqlsvr-${lower(var.locationname)}-${lower(var.resourcename)}-${lower(var.environment)}.database.windows.net,1433;initial catalog=master;persist security info=false;multipleactiveresultsets=false;encrypt=true;trustservercertificate=false;”
    eot

    intérprete = [“pwsh”, “-command”]
  }

  depends_on = [“azurerm_sql_firewall_rule.main”]
}

no puedo usar la parte de autenticación de la cadena de conexión para usar integrated security ya que no está permitido. he estado luchando con esto durante días.

¿alguna idea o ejemplos de trabajo sobre este tema?

estoy obteniendo el siguiente error:

error de inicio de sesión para el usuario ”.     install-module=”” -name=”” sqlserver=”” -force=””      invoke-sqlcmd=”” -query=”” “create=”” login=”” [azsg-atp-users-${var.environment}]=”” from=”” external=”” provider”=”” -connectionstring=”” “server=”tcp:sqlsvr-${lower(var.locationname)}-${lower(var.resourcename)}-${lower(var.environment)}.database.windows.net,1433;Initial” catalog=”Master;Persist” security=”” info=”False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;"”     eot=””     intérprete=”["pwsh",” “-command”]=””   }=””   depends_on=”["azurerm_sql_firewall_rule.main"]” }=”” no=”” puedo=”” usar=”” la=”” parte=”” de=”” autenticación=”” de=”” la=”” cadena=”” de=”” conexión=”” para=”” usar=”” integrated=”” security=”” ya=”” que=”” no=”” está=”” permitido.=”” he=”” estado=”” luchando=”” con=”” esto=”” durante=”” días.=”” ¿alguna=”” idea=”” o=”” ejemplos=”” de=”” trabajo=”” sobre=”” este=”” tema?=”” estoy=”” obteniendo=”” el=”” siguiente=”” error:=”” error=”” de=”” inicio=”” de=”” sesión=”” para=”” el=”” usuario=””></eot
    install-module -name sqlserver -force
     invoke-sqlcmd -query “create login [azsg-atp-users-${var.environment}] from external provider” -connectionstring “server=tcp:sqlsvr-${lower(var.locationname)}-${lower(var.resourcename)}-${lower(var.environment)}.database.windows.net,1433;initial catalog=master;persist security info=false;multipleactiveresultsets=false;encrypt=true;trustservercertificate=false;”
    eot

    intérprete = [“pwsh”, “-command”]
  }

  depends_on = [“azurerm_sql_firewall_rule.main”]
}

no puedo usar la parte de autenticación de la cadena de conexión para usar integrated security ya que no está permitido. he estado luchando con esto durante días.

¿alguna idea o ejemplos de trabajo sobre este tema?

estoy obteniendo el siguiente error:

error de inicio de sesión para el usuario ”.>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es utilizar una identidad administrada para los recursos de Azure que requieran acceso al SQL Server. Esto se puede lograr configurando el servicio de Azure como una aplicación de Azure AD o una identidad administrada. Una vez configurada la identidad, puede otorgarle permisos para acceder al SQL Server mediante un grupo de Azure AD o un rol de Control de Acceso Basado en Roles (RBAC).

    Luego, puede modificar su código de Terraform para utilizar la identidad administrada para autenticarse con el SQL Server. Esto se puede lograr configurando la propiedad ‘Authentication‘ del comando ‘Invoke-Sqlcmd‘ en ‘ActiveDirectoryIntegrated‘.

    Aquí hay un ejemplo de código de Terraform:

    resource "azurerm_sql_server" "example" {
      name                         = "example-sql-server"
      resource_group_name          = azurerm_resource_group.example.name
      location                     = azurerm_resource_group.example.location
      administrator_login          = "sqladmin"
      administrator_login_password = "password"
    }
    
    resource "azurerm_sql_database" "example" {
      name                     = "example-sql-db"
      resource_group_name      = azurerm_resource_group.example.name
      location                 = azurerm_resource_group.example.location
      server_name              = azurerm_sql_server.example.name
      requested_service_objective_name = "S0"
    }
    
    resource "azurerm_managed_identity" "example" {
      name                = "example-managed-identity"
      location            = azurerm_resource_group.example.location
      resource_group_name = azurerm_resource_group.example.name
    }
    
    resource "azurerm_role_assignment" "example" {
      scope              = azurerm_sql_server.example.id
      role_definition_id = data.azurerm_role_definition.sql_contributor.id
      principal_id       = azurerm_managed_identity.example.principal_id
    }
    
    resource "null_resource" "example" {
      provisioner "local-exec" {
        command = <<-EOT
          Install-Module -Name SqlServer -Force
          $connectionString = "Server=tcp:${azurerm_sql_server.example.fqdn};Initial Catalog=${azurerm_sql_database.example.name};Encrypt=True;TrustServerCertificate=False;Authentication=ActiveDirectoryIntegrated;"
          $query = "SELECT * FROM sys.databases"
          Invoke-Sqlcmd -Query $query -ConnectionString $connectionString
        EOT
    
        interpreter = ["pwsh", "-Command"]
      }
    
      depends_on = [azurerm_role_assignment.example]
    }
    

    En este ejemplo, creamos un SQL Server y una base de datos SQL utilizando los recursos azurerm_sql_server y azurerm_sql_database respectivamente. También creamos una identidad administrada utilizando el recurso azurerm_managed_identity y le otorgamos el rol Contributor en el SQL Server utilizando el recurso azurerm_role_assignment.

    Finalmente, creamos un null_resource con un aprovisionador local-exec que utiliza el comando Invoke-Sqlcmd para consultar el SQL Server utilizando la identidad administrada para autenticarse.

    Tenga en cuenta que este ejemplo está simplificado y siempre debe seguir el principio de privilegio mínimo al otorgar permisos a los recursos.

Comments are closed.