Служба управления обновлениями Azure останавливает службы на виртуальной машине с использованием предварительной книги запуска сценария - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть несколько виртуальных машин, для которых я запланировал автоматические обновления.На некоторых из них работают специальные службы, которые я хотел бы остановить и запустить изящно в случае необходимости перезагрузки во время процесса обновления.У меня есть шаблон ниже, но он не работает ... Буду признателен, если кто-нибудь может мне помочь с этим ...

Сценарий выглядит следующим образом ...

<# 
.SYNOPSIS 
 Stop a service on an AzureRM using RunCommand 

.DESCRIPTION 
  This script is intended to be run as a part of Update Management Pre/Post scripts.  
  It uses RunCommand to execute a PowerShell script to stop a service 

.PARAMETER SoftwareUpdateConfigurationRunContext 
  This is a system variable which is automatically passed in by Update Management during a deployment. 
#> 

param( 
    [string]$SoftwareUpdateConfigurationRunContext 
) 

#region BoilerplateAuthentication 
#This requires a RunAs account 
$connectionName = "AzureRunAsConnection"
$ServicePrincipalConnection = Get-AutomationConnection -Name $connectionName

Add-AzureRmAccount ` 
    -ServicePrincipal ` 
    -TenantId $ServicePrincipalConnection.TenantId ` 
    -ApplicationId $ServicePrincipalConnection.ApplicationId ` 
    -CertificateThumbprint $ServicePrincipalConnection.CertificateThumbprint 

$AzureContext = Select-AzureRmSubscription -SubscriptionId $ServicePrincipalConnection.SubscriptionID 
#endregion BoilerplateAuthentication 

#If you wish to use the run context, it must be converted from JSON 
$context = ConvertFrom-Json  $SoftwareUpdateConfigurationRunContext 
$vmIds = $context.SoftwareUpdateConfigurationSettings.AzureVirtualMachines 
$runId = $context.SoftwareUpdateConfigurationRunId 

#The script you wish to run on each VM 
#VM Name = ***
$scriptBlock = @" 
Stop-Service -Name "service1"
Stop-Service -Name "service2"
"@ 

#The cmdlet only accepts a file, so temporarily write the script to disk using runID as a unique name 
Out-File -FilePath "$runID.ps1" -InputObject $scriptBlock 

#Start script on each machine 
$vmIds | ForEach-Object { 
    $vmId =  $_ 

    $split = $vmId -split "/"; 
    $subscriptionId = $split[2];  
    $rg = $split[4]; 
    $name = $split[8]; 
    Write-Output ("Subscription Id: " + $subscriptionId) 
    $mute = Select-AzureRmSubscription -Subscription $subscriptionId 
    Write-Output "Invoking command on '$($name)' ..." 
    Invoke-AzureRmVMRunCommand -ResourceGroupName $rg -Name $name -CommandId 'RunPowerShellScript' -ScriptPath "$runID.ps1" -AsJob 
} 

Write-Output "Waiting for machines to finish executing..." 
Get-Job | Wait-Job 
#Clean up our variables: 
Remove-Item -Path "$runID.ps1"

Кажется, ошибки связаны с синтаксисом или форматированием ... Все они похожи на приведенную ниже ошибку, но с другими терминами / командами.

** - ServicePrincipal: термин '-ServicePrincipal' не распознаетсякак имя командлета, функции, файла сценария или работающей программы.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

В строке: 22 символа: 5

  • -ServicePrincipal `

  • ~~~~~~~~~~~~~~~~~

    • CategoryInfo: ObjectNotFound: (-ServicePrincipal: String) [], CommandNotFoundException

    • FullyQualifiedErrorId: CommandNotFoundException **

Заранее спасибо ...

...