Aujourd’hui, je souhaite partager une méthode pour garder une copie des configurations des instances SQL Server en utilisant dbatools et GIT. Cette approche s’appuie sur le travail de Chrissy LeMaire, qui a écrit sur la simplification de la récupération après sinistre avec dbatools dans un précédent article de blog.
Prérequis
Avant de commencer, il y a quelques prérequis à respecter :
- Un dépôt GIT où nous pouvons stocker les configurations
- Les outils GIT installés sur le serveur où le script sera exécuté
- Le module dbatools
- Une liste ou un endroit pour obtenir toutes les instances pour lesquelles nous voulons exporter les configurations
Préparation du dépôt GIT
La première étape consiste à cloner le dépôt GIT dans un emplacement où dbatools peut écrire. Il est recommandé d’utiliser un jeton d’accès plutôt qu’un nom d’utilisateur/mot de passe pour l’authentification afin d’éviter d’être invité à saisir le mot de passe lors de la validation des modifications.
Obtention de la liste des instances
Pour exporter les configurations de plusieurs instances, nous avons besoin d’une liste de ces instances. Une approche consiste à utiliser une base de données centrale avec une table contenant la liste des serveurs. Nous pouvons utiliser la commande Invoke-DbaQuery de dbatools pour récupérer cette liste.
# Où nous obtiendrons la liste des serveurs
$centralServer = "centralServer"
$centralDatabase = "centralDatabase"
$query = "SELECT ConnString FROM <table/view>"
# Obtenir la liste des serveurs
$ServerList = Invoke-DbaQuery -SqlInstance $centralServer -Database $centralDatabase -Query $query | Select-Object -ExpandProperty ConnString
Exportation des configurations
La commande Export-DbaInstance de dbatools est utilisée pour exporter les configurations de chaque instance. Cette commande crée des scripts pour chaque type d’objet dans un chemin spécifié. Par exemple :
Export-DbaInstance -SqlInstance "devInstance" -Path "D:temp"
Cela créera un dossier nommé “devInstance-{date}” dans le chemin spécifié, contenant un fichier par type d’objet.
Exclusion des mots de passe de l’exportation
Par défaut, la commande Export-DbaInstance inclut les mots de passe des informations d’identification, des serveurs liés et des connexions dans les scripts exportés. Cependant, vous ne souhaitez peut-être pas enregistrer les mots de passe en clair. Pour exclure les mots de passe, vous pouvez utiliser le paramètre -ExcludePassword :
Export-DbaInstance -SqlInstance "devInstance" -Path "D:temp" -ExcludePassword
Cela remplacera les mots de passe des informations d’identification et des serveurs liés par des espaces réservés, tout en conservant les mots de passe hachés des connexions.
Utilisation de GIT pour suivre les modifications
Pour suivre les modifications des configurations au fil du temps, nous pouvons utiliser GIT. Voici les commandes GIT qui peuvent être utilisées :
- git pull : Pour vous assurer que vous avez la version la plus récente du dépôt dans votre dossier local
- git add . : Pour préparer toutes les modifications pour le prochain commit
- git commit -m “un message” : Pour valider les modifications avec un message spécifique
- git push : Pour pousser les modifications vers le dépôt central
Il est recommandé d’exécuter “git pull” avant de déclencher la commande Export-DbaInstance, et le reste des commandes GIT après que toutes les autres étapes soient terminées.
Renommer les fichiers et dossiers pour plus de cohérence
Lors de l’exportation des configurations, les fichiers et dossiers sont nommés selon un format spécifique. Cependant, pour assurer la cohérence et faciliter le suivi des modifications dans GIT, il est recommandé de renommer les fichiers et dossiers avant de valider les modifications.
Voici un exemple de comment renommer les fichiers :
# Trouver les fichiers .sql dont le nom commence par un nombre et renommer les fichiers pour exclure la partie numérique "#-<NOM>.sql" (supprimer le "#-")
Get-ChildItem -Path $tempPath -Recurse -Filter "*.sql" | Where {$_.Name -match '^[0-9]+.*'} | Foreach-Object {Rename-Item -Path $_.FullName -NewName $($_ -split '-')[1] -Force}
De même, vous pouvez renommer les dossiers :
# Supprimer le suffixe "-datetime"
Get-ChildItem -Path $tempPath | Foreach-Object {Rename-Item -Path $_.FullName -NewName $_.Name.Substring(0, $_.Name.LastIndexOf('-')) -Force}
Étapes finales
Après avoir renommé les fichiers et dossiers, les étapes finales consistent à déplacer les dossiers avec les fichiers du dossier temporaire vers le dossier final dans le dépôt GIT, et à nettoyer le dossier temporaire.
# Copier les dossiers/fichiers du répertoire temporaire vers un niveau supérieur (écraser)
Copy-Item -Path "$tempPath*" -Destination $instancesPath -Recurse -Force
# Nettoyer le dossier temporaire
Get-ChildItem $tempPath | Remove-Item -Force -Recurse -Confirm:$false
Conclusion
Dans cet article de blog, nous avons exploré comment utiliser dbatools et GIT pour garder une copie des configurations des instances SQL Server. En exportant les configurations et en suivant les modifications dans GIT, vous pouvez disposer d’une solution de sauvegarde et de récupération après sinistre. Cette méthode vous permet de comparer facilement les configurations au fil du temps et de revenir à des versions précédentes si nécessaire.
Restez à l’écoute pour la deuxième partie de ce processus, où nous mettrons en œuvre la parallélisme pour optimiser davantage les temps d’exécution. Merci de votre lecture !