Получите StdOut из RunCommand с помощью Javascript SDK виртуальной машины Azure. - PullRequest
0 голосов
/ 11 января 2019

Я использую Javascript SDK виртуальной машины Azure в моем веб-приложении Node.js. Я пытаюсь использовать функцию RunCommand для запуска пользовательского сценария на моих виртуальных машинах Azure.

У меня проблема с получением ответа от запуска команды, которая должна содержать строки StdOut и StdErr.

Если я запускаю команду из интерфейса командной строки Azure, выполните следующие действия:

az vm run-command invoke -g 'myResource' -n 'myVm' --command-id RunPowerShellScript --scripts 'Get-ChildItem -Name'

Тогда я смогу получить ответ, например, (обратите внимание, что в разделе 'message' есть список файлов, возвращаемых из 'Get-ChildItem')

{
  "value": [
    {
      "code": "ComponentStatus/StdOut/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "myTxtFile.txt\nscript12.ps1\nscript13.ps1\nscript14.ps1\nscript15.ps1\nscript16.ps1\nscript17.ps1\nscript18.ps1\nscript19.ps1\nscript20.ps1\nscript21.ps1\nscript22.ps1\nscript23.ps1\nscript24.ps1\nscript25.ps1\nscript26.ps1",
      "time": null
    },
    {
      "code": "ComponentStatus/StdErr/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "",
      "time": null
    }
  ]
}

Однако, когда я запускаю этот код из javascript SDK, я ничего не получаю. Вот код:

let usr = ...;
let pas = ...;
let subscriptionId = ...;
let client = null;
msRestAzure.loginWithUsernamePassword(usr, pas, function(err, credentials) {
    if (err) return console.log(err);
    client = new azureArmCompute.ComputeManagementClient(credentials, subscriptionId);

    let param = {
        commandId: 'RunPowerShellScript',
        script: [
            'echo $null >> myTxtFile.txt\n' + 
            'Get-ChildItem -Name\n'
        ]
    };
    client.virtualMachines.runCommand('myResource', 'myVm', param, function (err, result) {
        console.log(err);
        console.log(result);
    })


});

и вот что выводится на консоль:

null
{}

Я знаю, что скрипт действительно запущен, потому что я попытался и смог успешно создать текстовый файл (myTxtFile.txt).

Кто-нибудь знает, почему я ничего не получаю в результате объекта?

Редактировать 1 (в ответ на @Itay):

Глядя на источник, предполагается, что обратный вызов является «ServiceCallback» типа «RunCommandResult». Вот три объявления функций для RunCommand. RunCommand Function Declarations

Вот объявление для интерфейса ServiceCallback. ServiceCallback interface

Так что в моем обратном вызове я ожидал, что будет четыре возврата "err" и "result" и "request" и "response" (очевидно, я опускаю последние два). В моем примере я печатаю объекты ошибок и результатов в консоль, но в объекте результатов ничего нет ...

1 Ответ

0 голосов
/ 13 января 2019

Я думаю, что подпись для обратного вызова, которую вы определили, не соответствует описанию в документации.

Глядя на runCommand (строка, строка, RunCommandInput, ServiceCallback ) , кажется, что обратный вызов должен принимать интерфейс RunCommandResult , который, в свою очередь, содержит свойство называется Value, который является массивом интерфейса InstanceViewStatus экземпляров, которые могут содержать информацию, которую вы ищете.

Надеюсь, это поможет!

...