«

»

jul 07

Como utilizar o cmdlet Start-task para iniciar Tasks em vários servidores

Esse é um post antigo originalmente publicado em 27/01/12 14:56 no meu antigo blog, estou aqui republicando para manter tracking e quem sabe ainda ajude alguém nos dias de hoje 🙂

Sempre que tentamos realizar uma tarefa que parece simples no SCOM, descobrimos que ela é simples depois de muito trabalho. O cmdlet Start-Task do SCOM é um exemplo disso. Precisava rodar uma Task em todos os agentes do SCOM, mas a console permite selecionar apenas 10 servidores por vez, logo a melhor solução foi desenvolver um script, que apresento abaixo:

#Selecionando a classe onde estão os servidores que precisamos rodar a task.
#No meu caso, eram todos os servidores Windows. Importante que a task esteja na mesma classe
$hsMonitoringClass = get-monitoringClass | where {$_.Name -eq ‘Microsoft.Windows.Computer’}
#Esse comando popula a variável com todos os agentes. Pode demorar um pouco.
#Dependendo do número de agentes. Em um ambiente com 5000 agentes, demorou cerca de 20 minutos.
$hsCollection = get-monitoringobject -MonitoringClass:$hsMonitoringClass
#Selecione a task que deseja rodar. Eu coloquei o ID, mas podemos usar o DisplayName.
#Basta substituir o $_.Name por $_.DisplayName
$task = Get-Task | where {$_.Name -eq “Task.to.Run”}
#Se a task tiver overrides, adicionar uma Hash Table com os overrides. Nesse exemplo,
#declaramos a variável e depois importamos de um arquivo. Observar que a primeira linha desse arquivo
#é o cabeçalho, que está especificado no ForEach-Object (Name e Value)
$overrides = @{}
Import-Csv “overrides.csv” | ForEach-Object { $overrides[$_.Name] = $_.Value}
#Variáveis de controle, usamos uma para contar quantos agentes foram afetados
#e a segunda para parar a cada 150 agentes (uma medida de segurança apenas, para não rodar em todos os
#agentes ao mesmo tempo
$icount = 0
$icountpause = 0
#Para cada agente, precisamos rodar a task uma vez, logo usamos um ForEach
foreach($hs in $hsCollection)
{
#Verificamos se o agente está disponível. Caso positivo, ele roda a task, caso contrário,
#passamos para o seguinte
if($hs.IsAvailable -eq $true)
{
#Variáveis de controle
$icount = $icount + 1
$icountpause = $icountpause + 1
Write-host “——————————————-” -foregroundcolor Green
Write-host “Adding value on server $($hs.DisplayName)” -foregroundcolor Green
#Esse é o comando Start-Task. Observe que utilizamos os parametros:
# -Task: Possui a task que selecionamos anteriormente
# -TargetMonitoringObject: a variável com o agente que selecionamos
# -Overrides: os overrides selecionados anteriormente
# -Asynchronous: esse é o segredo para rodar a task em vários agentes ao mesmo tempo.
# Caso esse parametro não seja utilizado, o Start-Task vai esperar que
# a Task seja finalizada antes de ir para o próximo agente, o que demora
# dependendo de cada agente. Com esse parametro, ele apenas agenda a task para
# rodar imediatamente, e podemos acompanhar o resultado na console do SCOM, na
# view Task Status.
Start-Task -task $task -TargetMonitoringObject $hs -overrides $overrides -Asynchronous
Write-host “Done” -foregroundcolor Green
}
else
{
Write-host “——————————————-” -foregroundcolor Green
Write-host “Skipping $($hs.DisplayName) as its not avaiable” -foregroundcolor red -backgroundcolor yellow
}
if($icountpause -gt “150”)
{
cmd /c pause | out-null
$icountpause = 0
}
}
Write-host “Finished, applyed on $icount”

Comments

comments

Deixe uma resposta