Невозможно выполнить сценарий powershell с помощью задачи «Пакетная учетная запись Azure» - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь выполнить сценарий 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, это было бы очень полезно. Спасибо!

EDIT: Спасибо @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"

1 Ответ

0 голосов
/ 16 мая 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...