Мне нужно зафиксировать результат запросов MSSQL в выводе Ansible, однако нет поддерживаемых модулей Ansible, которые помогли бы мне добиться этого. В качестве обходного пути я написал сценарий PowerShell, который запускает SQL-запрос и возвращает результат в странном формате с большим количеством ненужных данных, которые я хотел бы удалить.
Сценарий PowerShell
$ServerInstance = 'serverhostname'
$Database = 'master'
$Query = "DECLARE @sqlVers numeric(2,0)
DECLARE @compatlevel numeric(3,0)
SET @sqlVers = left(cast(serverproperty('productversion') as varchar), 2)
SET @compatlevel=@sqlVers*10
SELECT name,compatibility_level
FROM sys.databases WHERE compatibility_level<>@compatlevel"
$SqlcmdOptions = @"
-S"$ServerInstance" -d "$Database" -Q "$Query"
"@
Start-Process -FilePath "SQLCMD.EXE" -ArgumentList @"
$SqlcmdOptions
"@ -Wait -NoNewWindow -RedirectStandardOutput C:\temp\SQLCOMPLVL.txt -PassThru
Get-Content C:\temp\SQLCOMPLVL.txt
Вывод скрипта Powershell:
Как можно отформатировать вышеперечисленное либо с помощью сценария Powershell, либо в анзибле таким образом, чтобы я получал только данные следующим образом: имя значение данных comptibility_level
или, короче, я мог получить данные между название и (затронуто x строк) и мог преобразовать его в формат JSON, чтобы Ansible мог собирать выходные данные сценария PowerShell в формате JSON.
Вы можете использовать модуль SQLPS.
Пример:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery" -ServerInstance "MyComputer\MainInstance"
21.09.2017 14:48:24
Проверьте следующие ссылки: -
Слишком много комментариев, так что
Перенаправляя на стандартный вывод, вы уничтожаете возможно существующие объекты, преобразовывая их в строку.
$ServerInstance = 'serverhostname'
$Database = 'master'
$Query = "DECLARE @sqlVers numeric(2,0)
DECLARE @compatlevel numeric(3,0)
SET @sqlVers = left(cast(serverproperty('productversion') as varchar), 2)
SET @compatlevel=@sqlVers*10
SELECT name,compatibility_level
FROM sys.databases WHERE compatibility_level<>@compatlevel"
$SqlcmdOptions = @"
-S"$ServerInstance" -d "$Database" -Q "$Query"
"@
Start-Process -FilePath "SQLCMD.EXE" -ArgumentList @"
$SqlcmdOptions
"@ -Wait | Get-Member
Посмотрите, что возвращает Get-Member