У меня есть несколько виртуальных машин, для которых я запланировал автоматические обновления.На некоторых из них работают специальные службы, которые я хотел бы остановить и запустить изящно в случае необходимости перезагрузки во время процесса обновления.У меня есть шаблон ниже, но он не работает ... Буду признателен, если кто-нибудь может мне помочь с этим ...
Сценарий выглядит следующим образом ...
<#
.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 **
Заранее спасибо ...