首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在8台服务器上重新启动特定服务

在8台服务器上重新启动特定服务
EN

Code Review用户
提问于 2018-08-08 20:07:41
回答 1查看 29关注 0票数 2

我创建了这个脚本来停止,然后在一个由8台服务器组成的环境中启动特定的服务。服务器名是阿波罗-1通过阿波罗-8。我正在寻找建议的修改,以确保我的脚本是可以接受的生产。

代码语言:javascript
复制
#Create a credential to be used on remote machines
$User = "MyDomain\myusername"
$Password = ConvertTo-SecureString 'password' -asplaintext -force
$Credential = New-Object -typename System.Management.Automation.PSCredential 
-ArgumentList $User, $Password


$Server1 = New-Object System.Object
$Server1 | Add-Member -type NoteProperty -name Name -value "Apollo-1"
$arrServ1Services = @("MSSQLSERVER","QueueManager")
$Server1 | Add-Member -type NoteProperty -name Services -value $arrServ1Services



$Server2 = New-Object System.Object
$Server2 | Add-Member -type NoteProperty -name Name -value "Apollo-2"
$arrServ2Services = @("Analytics Engine", "MSSQLSERVER")
$Server2 | Add-Member -type NoteProperty -name Services -value $arrServ2Services



$Server3 = New-Object System.Object
$Server3 | Add-Member -type NoteProperty -name Name -value "Apollo-3"
$arrServ3Services = @("EDDS Agent Manager", "MSSQLSERVER", "Secret Store") 
$Server3 | Add-Member -type NoteProperty -name Services -value 
$arrServ3Services


$Server4 = New-Object System.Object
$Server4 | Add-Member -type NoteProperty -name Name -value "Apollo-4"
$arrServ4Services = @("Service Host Manager", "MSSQLSERVER","Service Bus 
Gateway","Service Bus Message Broker","Service Bus Resource 
Provider","Service Bus VSS","EDDS Agent Manager","Analytics Engine") 
$Server4 | Add-Member -type NoteProperty -name Services -value arrServ4Services


$Server5 = New-Object System.Object
$Server5 | Add-Member -type NoteProperty -name Name -value "Apollo-5"
$arrServ5Services = @("MSSQLSERVER")
$Server5 | Add-Member -type NoteProperty -name Services -value $arrServ5Services


$Server6 = New-Object System.Object
$Server6 | Add-Member -type NoteProperty -name Name -value "Apollo-6"
$arrServ6Services = @("Web Processing Manager", "Service Host Manager") 
$Server6 | Add-Member -type NoteProperty -name Services -value $arrServ6Services


$Server7 = New-Object System.Object
$Server7 | Add-Member -type NoteProperty -name Name -value "Apollo-7"
$arrServ7Services = @("Web Processing Manager", "Service Host Manager") 
$Server7 | Add-Member -type NoteProperty -name Services -value 
$arrServ7Services


$Server8 = New-Object System.Object
$Server8 | Add-Member -type NoteProperty -name Name -value "Apollo-8"
$arrServ8Services = @("elasticsearch-service-x64")
$Server8 | Add-Member -type NoteProperty -name Services -value 
$arrServ8Services



#Create an object to represent the entire Server environment
$ServerEnvironment = New-Object System.Object
$ServerEnvironment | Add-Member -type NoteProperty -name Machines -value 
@($Server1, $Server2, $Server3, $Server4, $Server5, $Server6, $Server7, 
$Server8)


#Iterate through each machine in the environment and stop the services.
for ($x = $ServerEnvironment.Machines.Length-1; $x -gt -1; $x--) {
Write-Host " "
Write-Host " "
Write-Host "Machine:" $ServerEnvironment.Machines[$x].Name
Write-Host "No. of Services we are monitoring:" 
$ServerEnvironment.Machines[$x].Services.Length

#iterate through services 
for ($c = 0; $c -lt $ServerEnvironment.Machines[$x].Services.Length; $c++) {
   $_s = Invoke-Command -ComputerName $ServerEnvironment.Machines[$x].Name - 
Credential $Credential -Command{param($SERV) Get-Service -Name $SERV} - 
ArgumentList $ServerEnvironment.Machines[$x].Services[$c]
Write-Host $ServerEnvironment.Machines[$x].Services[$c]  $_s.Status 
$_s.StartType

Invoke-Command -ComputerName $ServerEnvironment.Machines[$x].Name - 
Credential $Credential -Command{param($SERV) Stop-Service -Name $SERV} - 
ArgumentList $ServerEnvironment.Machines[$x].Services[$c]   
}
 }


#Iterate through each machine in the environment.  Here we are starting the 
services.
for ($x = 0; $x -lt $ServerEnvironment.Machines.Length; $x++) {

Write-Host " "
Write-Host " "

Write-Host "Machine:" $ServerEnvironment.Machines[$x].Name
Write-Host "No. of Services we are monitoring:" 
$ServerEnvironment.Machines[$x].Services.Length

#iterate through service 
for ($c = 0; $c -lt $ServerEnvironment.Machines[$x].Services.Length; $c++) {
$_s = Invoke-Command -ComputerName $ServerEnvironment.Machines[$x].Name - 
Credential $Credential -Command{param($SERV) Get-Service -Name $SERV} -ArgumentList $ServerEnvironment.Machines[$x].Services[$c]
Write-Host $ServerEnvironment.Machines[$x].Services[$c]  $_s.Status $_s.StartType

 Invoke-Command -ComputerName $ServerEnvironment.Machines[$x].Name - 
 Credential $Credential -Command{param($SERV) Start-Service -Name $SERV} - 
 ArgumentList $ServerEnvironment.Machines[$x].Services[$c]

}

  }


 Write-Host "Done"
EN

回答 1

Code Review用户

回答已采纳

发布于 2018-08-08 21:10:48

我不明白为什么要用单独的$server变量构建一个复杂的结构。您有一个带有关联服务的服务器名称列表。

这是一个可以包含在csv文件中的简单列表。如果读入变量对象,则可以在不需要索引的情况下迭代列表。

顺便说一句,正确的缩进有助于读取代码。有几个意想不到的断线。

代码语言:javascript
复制
#Create a credential to be used on remote machines
$User = "MyDomain\myusername"
$Password = ConvertTo-SecureString 'password' -asplaintext -force
$Credential = New-Object -typename System.Management.Automation.PSCredential -ArgumentList $User, $Password

$ServerServices = @"
"Name","Services"
"Apollo-1","MSSQLSERVER,QueueManager"
"Apollo-2","Analytics Engine,MSSQLSERVER"
"Apollo-3","EDDS Agent Manager,MSSQLSERVER,Secret Store "
"Apollo-4","Service Host Manager,MSSQLSERVER,Service Bus "
"Apollo-5","MSSQLSERVER"
"Apollo-6","Web Processing Manager,Service Host Manager "
"Apollo-7","Web Processing Manager,Service Host Manager "
"Apollo-8","elasticsearch-service-x64"
"@ | ConvertFrom-Csv


#Iterate through each machine in the environment and stop the services.

ForEach ($Server in $ServerServices){
    $Services = $Server.Services -split ','
    Write-Host " "
    Write-Host " "
    Write-Host "Machine:" $Server.Name
    Write-Host ("No. of Services we are monitoring: {0}" -f $Services.Length)

    #iterate through services 
    ForEach ($Service in $Services) {
        Write-Host ("Proceesing service: {0} on server:{1}" -f $Service,$Server.Name)
    #    $_s = Invoke-Command -ComputerName $Server.Name -Credential $Credential -Command {
    #        param($SERV) Get-Service -Name $SERV} -ArgumentList $Service
    #    }
#...
    }
}

#Iterate through each machine in the environment.  Here we are starting the 

# same as above

Write-Host "Done"

样本输出:

代码语言:javascript
复制
Machine: Apollo-1
No. of Services we are monitoring: 2
Proceesing service: MSSQLSERVER on server:Apollo-1
Proceesing service: QueueManager on server:Apollo-1


Machine: Apollo-2
No. of Services we are monitoring: 2
Proceesing service: Analytics Engine on server:Apollo-2
Proceesing service: MSSQLSERVER on server:Apollo-2

...snip...
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/201233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档