Невозможно выполнить сценарий PowerShell с помощью задачи учетной записи пакетной службы Azure

Я пытаюсь выполнить сценарий PowerShell (который я загружаю в учетную запись хранения с помощью клиентской библиотеки хранилища Azure для .NET) из задачи, которая выполняется в пуле пакетной службы.

Я знаю, что загружаю сценарий PowerShell правильно (я могу проверить это, войдя в Azure и убедившись, что сценарий .ps1 существует в учетной записи хранения), и что пул, задание и задача созданы правильно, однако я подозреваю, что Фактическая команда, которую я отправляю задаче, неверна, и поэтому моя задача ошибочна. (Это строка с именем powershellTask ​​в приведенном ниже примере кода)

    List<CloudTask> tasks = new List<CloudTask>();
    string inputFileName = inputFiles[0].FilePath;
    string powershellTask = $"powershell {inputFileName}";
    CloudTask task = new CloudTask("Test-Powershell-Execution-Task", 
       powershellTask);
    task.ResourceFiles = new List<ResourceFile> {inputFiles[0]};
    tasks.Add(task);
    batchClient.JobOperations.AddTask(JobId, tasks);

Сценарий PowerShell был ранее загружен в хранилище Azure ранее в коде (и я могу убедиться, что он был загружен правильно):

foreach (string filePath in inputFilePaths)
{
    inputFiles.Add(UploadFileToContainer(blobClient, inputContainerName, filePath));
}

private static ResourceFile UploadFileToContainer(CloudBlobClient blobClient, string containerName, string filePath)
{
    Console.WriteLine("Uploading file {0} to container [{1}]...", filePath, containerName);

    string blobName = Path.GetFileName(filePath);
    filePath = Path.Combine(Environment.CurrentDirectory, filePath);

        CloudBlobContainer container = 
            blobClient.GetContainerReference(containerName);
            CloudBlockBlob blobData = container.GetBlockBlobReference(blobName);
            blobData.UploadFromFileAsync(filePath).Wait();

            SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(2),
                Permissions = SharedAccessBlobPermissions.Read
            };

            // Construct the SAS URL for blob
            string sasBlobToken = blobData.GetSharedAccessSignature(sasConstraints);
            string blobSasUri = String.Format("{0}{1}", blobData.Uri, sasBlobToken);

            return ResourceFile.FromUrl(blobSasUri, filePath);
}

Пул, работа и задача созданы правильно. Однако, когда я нажимаю на свою задачу в Azure, я получаю сообщение. «При обработке вашего запроса произошла ошибка, попробуйте еще раз» Кажется, Azure не дает мне никакой дополнительной информации о том, что не так с запросом. Когда я завершаю задачу, я не могу получить дополнительную информацию, поскольку завершение задачи вызывает исключение. «Возникла исключительная ситуация при попытке определить информацию из выполненных задач. Сообщение: операция вернула недопустимый код состояния« Конфликт »»

Если у кого-то есть идеи или кто-то может указать мне направление дальнейшей документации по загрузке и выполнению сценариев PowerShell в пакетных процессах Azure, это будет действительно признательно. Спасибо!

РЕДАКТИРОВАТЬ: Спасибо @Hydraxy за ответ ниже и позволивший мне немного продвинуться в этом (было действительно полезно, особенно говоря мне НЕ удалять задачу в конце кода).

Задача, как и предполагалось, БЫЛА работающей. Проблема заключалась в том, что мой код пытался проанализировать только stdout.txt, а не stderr.txt.

Когда я проверил stderr.txt на портале Azure, я увидел свою ошибку:

Invoke-Sqlcmd : The term 'Invoke-Sqlcmd' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.
At D:\Dev\codebase\BatchesInAzure\BatchesInAzure\bin\Debug\netcoreapp2.1\BatchesInAzure.ps1:1 
char:1
+ Invoke-Sqlcmd -ServerInstance "dev-database" -Database "Dayinsure.Ap ...
+ ~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Invoke-Sqlcmd:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Так выглядит, поскольку я подозревал, что мой сценарий PowerShell неверен. Я выполнил этот сценарий в PowerShell локально, и он всегда возвращает результаты. Invoke-SqlCmd не поддерживается в Azure?

Подумал, что может быть полезно поделиться содержимым файла BatchesInAzure.ps1, который я загружаю и пытаюсь выполнить (по очевидным причинам удалили имена серверов, имена пользователей и пароли).

Invoke-Sqlcmd -ServerInstance "my-database-server" -Database "my-lovely-database" -Username "database-user" -Password "super-secure-password" -Query "SELECT GetDate() as TimeOfQuery"

person Barry Roberts    schedule 16.05.2019    source источник


Ответы (1)


Я не уверен, что ваша задача действительно не удалась. Возможно, вы столкнулись с периодической ошибкой при переходе на страницу задачи в пользовательском интерфейсе.

Ошибка, возникшая при завершении задачи: «Сообщение: операция вернула недопустимый код состояния« Конфликт »» предполагает, что задача, скорее всего, уже была завершена, когда вы пытались ее завершить. У вас должна быть возможность проверить task.ExecutionInformation, чтобы просмотреть код выхода задачи, или использовать пользовательский интерфейс, например портал Azure, для просмотра результатов.

Можете поделиться скриншотом страницы портала, на котором вы увидели ошибку?

Кроме того, если вы воспроизведете проблему и оставите задачу (т.е. не удаляете задание и задачу), я могу помочь в дальнейшей отладке, если проблема все еще возникает. Обратите внимание, что с вас не взимается плата за оставление заданий / задач, поэтому это бесплатно. Как только мы диагностируем, что случилось, вы можете удалить это.

person Hydraxy    schedule 16.05.2019
comment
Привет, спасибо за ответ. Задача сейчас выполняется (по мере того, как я набираю текст), и я опубликую более подробную информацию, когда она будет завершена, а пока это снимок экрана страницы портала Azure, на котором показана сбойная задача. drive.google.com/file/d/1o7sMjg0VLUA6NpdOe/ > - person Barry Roberts; 17.05.2019
comment
Еще раз привет, Вы были правы. На самом деле задача не была неудачной. Когда я дал задаче время для выполнения, она в конце концов вернулась. Моя проблема заключалась в том, что я анализировал только stdout.txt в своем коде, если бы я проверил stderr.txt, я бы увидел, что я получаю сообщение об ошибке из моей задачи: code Invoke-Sqlcmd : The term 'Invoke-Sqlcmd' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. - person Barry Roberts; 17.05.2019
comment
Основываясь на this, похоже, что вы получите эту ошибку, если машина, на которой вы re, на котором запущен, не имеет установленного SQL Server (или, по крайней мере, клиентских инструментов SQL Server). Я предполагаю, что образ операционной системы, который вы используете, не поставляется с установленным сервером SQL, и поэтому вы не можете использовать этот командлет. Возможно, вам потребуется установить что-то с вашей Batch StartTask, например, клиентские инструменты SQL-сервера, чтобы ваша задача могла его использовать. - person Hydraxy; 18.05.2019