Запустите пользовательский сценарий Powershell на подготовленной виртуальной машине Azure

#powershell #pulumi #azure-vm

Вопрос:

Я подготовил виртуальную машину со следующим фрагментом кода C#

 var ssrsVm = new WindowsVirtualMachine("vmssrs001", new WindowsVirtualMachineArgs
{
    Name = "vmssrs001",
    ResourceGroupName = resourceGroup.Name,
    NetworkInterfaceIds = { nic.Id },
    Size = "Standard_B1ms",
    AdminUsername = ssrsLogin,
    AdminPassword = ssrsPassword,
    SourceImageReference = new WindowsVirtualMachineSourceImageReferenceArgs
    {
        Publisher = "microsoftpowerbi",
        Offer = "ssrs-2016",
        Sku = "dev-rs-only",
        Version = "latest"
    },
    OsDisk = new WindowsVirtualMachineOsDiskArgs
    {
        Name = "vmssrs001disk",
        Caching = "ReadWrite",
        DiskSizeGb = 200,
        StorageAccountType = "Standard_LRS",
    }
});
 

После подготовки виртуальной машины я хотел бы запустить на ней пользовательский сценарий Powershell, чтобы добавить правило брандмауэра. Теперь интересно, как это сделать в рамках приложения Pulumi.
С лазурью, похоже, я мог бы сделать это, RunPowerShellScript но не смог найти ничего об этом в документах Pulumi, может быть, есть лучший способ справиться с моим делом?

Обновить

Благодаря комментарию Эша я смог найти VirtualMachineRunCommandByVirtualMachine то, что, по-видимому, должно делать то, что я ищу, но, к сожалению, следующий фрагмент кода возвращает ошибку

 var virtualMachineRunCommandByVirtualMachine = new VirtualMachineRunCommandByVirtualMachine("vmssrs001-script",
    new VirtualMachineRunCommandByVirtualMachineArgs
    {
        ResourceGroupName = resourceGroup.Name,
        VmName = ssrsVm.Name,
        RunAsUser = ssrsLogin,
        RunAsPassword = ssrsPassword,
        RunCommandName = "enable firewall rule for ssrs",
        Source = new VirtualMachineRunCommandScriptSourceArgs
        {
            Script =
                @"Firewall AllowHttpForSSRS
            {
                Name                  = 'AllowHTTPForSSRS'
                DisplayName           = 'AllowHTTPForSSRS'
                Group                 = 'PT Rule Group'
                Ensure                = 'Present'
                Enabled               = 'True'
                Profile               = 'Public'
                Direction             = 'Inbound'
                LocalPort             = ('80')
                Protocol              = 'TCP'
                Description           = 'Firewall Rule for SSRS HTTP'
            }"
        }
    });
 

ошибка
The property 'runCommands' is not valid because the 'Microsoft .Compute/RunCommandPreview' feature is not enabled for this subscription."

Похоже, что другие люди борются с тем же самым здесь.

Комментарии:

1. Не могли бы вы использовать вычислительное расширение для запуска своего сценария? Более подробная информация о стороне PowerShell здесь .

2. @Ash thansk к вашему ответу я также нашел VirtualMachineRunCommandByVirtualMachine , попробую.

3. VirtualMachineRunCommandByVirtualMachine терпит неудачу The property 'runCommands' is not valid because the 'Microsoft .Compute/RunCommandPreview' feature is not enabled for this subscription." и Compute Extensions терпит неудачу VM has reported a failure when processing extension 'vmssrs001-psscript'. Error message: "Extension '' of Han dler 'Microsoft.Azure.Extensions.CustomScript' version '2.0.7' faulted due to exception during extension processing"rnrnMore.. at https://aka.ms/VMExtensionCSELinuxTroubleshoot . Compute Extensions Доступно только для виртуальных машин на базе Linux?

4. Спасибо, Эш, я только что обновил свой вопрос и обнаружил эту проблему на GitHub. Не удается найти RunCommandPreview функцию в списке функций моих подписок. Дадим еще одну попытку вашей Compute Extension идее.

5. @Ash рад принять ваш ответ, если вы его предоставите, спасибо за вашу помощь.

Ответ №1:

Вы можете использовать расширение Compute для выполнения сценария на виртуальной машине с помощью Pulumi.

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

Ответ №2:

В качестве дополнения к ответу Ash вот как я интегрировал его с Pulumi

  • сначала я создаю контейнер больших двоичных объектов для сценариев моего проекта

введите описание изображения здесь

 var deploymentContainer = new BlobContainer("deploymentscripts", new BlobContainerArgs
{
    ContainerName = "deploymentscripts",
    ResourceGroupName = resourceGroup.Name,
    AccountName = storageAccount.Name,
});
 
  • затем я загружаю все свои сценарии Powershell для создания большого двоичного объекта

с помощью этого фрагмента

 foreach (var file in Directory.EnumerateFiles(Path.Combine(Environment.CurrentDirectory, "Scripts")))
{
    var fileName = Path.GetFileName(file);
    var blob = new Blob(fileName, new BlobArgs
    {
        ResourceGroupName = resourceGroup.Name,
        AccountName = storageAccount.Name,
        ContainerName = deploymentContainer.Name,
        Source = new FileAsset(file),
    });
    
    deploymentFiles[fileName] = SignedBlobReadUrl(blob, deploymentContainer, storageAccount, resourceGroup);
}
 

SignedBlobReadUrl выхватил из репо Пулуми.

 private static Output<string> SignedBlobReadUrl(Blob blob, BlobContainer container, StorageAccount account, ResourceGroup resourceGroup)
{
    return Output.Tuple<string, string, string, string>(
        blob.Name, container.Name, account.Name, resourceGroup.Name).Apply(t =>
    {
        (string blobName, string containerName, string accountName, string resourceGroupName) = t;

        var blobSAS = ListStorageAccountServiceSAS.InvokeAsync(new ListStorageAccountServiceSASArgs
        {
            AccountName = accountName,
            Protocols = HttpProtocol.Https,
            SharedAccessStartTime = "2021-01-01",
            SharedAccessExpiryTime = "2030-01-01",
            Resource = SignedResource.C,
            ResourceGroupName = resourceGroupName,
            Permissions = Permissions.R,
            CanonicalizedResource = "/blob/"   accountName   "/"   containerName,
            CacheControl = "max-age=5",
        });
        return Output.Format($"https://{accountName}.blob.core.windows.net/{containerName}/{blobName}?{blobSAS.Result.ServiceSasToken}");
    });
}
 
  • и, наконец, я создаю Extension , чтобы запустить свой скрипт

код

 var extension = new Extension("ssrsvmscript", new Pulumi.Azure.Compute.ExtensionArgs
{
    Name = "ssrsvmscript",
    VirtualMachineId = ssrsVm.Id,
    Publisher = "Microsoft.Compute",
    Type = "CustomScriptExtension",
    TypeHandlerVersion = "1.10",
    Settings = deploymentFiles["ssrsvm.ps1"].Apply(script => @" {
    ""commandToExecute"": ""powershell -ExecutionPolicy Unrestricted -File ssrsvm.ps1"",
    ""fileUris"": ["   """   script   """   "]}")
});
 

Надеюсь, это сэкономит некоторое время кому-то еще, кто борется с этой проблемой.