Как и в большинстве случаев в нашей профессии, ваш самый простой подход заключается в том, чтобы разбить задачу на простые, дискретные задачи, а затем либо выполнить эти задачи последовательно, либо связать их обратно (например, сложив их все в один сценарий).
В этом случае у вас есть 3 дискретные задачи, которые я могу установить.
Соберите список клиентов для выдачи команды на.
Подключитесь ко всем клиентам.
Выдайте команду всем клиентам.
После этого вы, вероятно, захотите проверить результаты, как и до этого, вы захотите протестировать свой процесс, но давайте проигнорируем это для целей этого вопроса. Просто не игнорируйте пре-имплементационное и пост-имплементационное тестирование в реальном мире, иначе вы пожалеете.
Вам также предстоит принять "архитектурное" решение (выполнять ли шаги 2 и 3 параллельно или последовательно), но давайте проигнорируем и это. Я буду делать их последовательно, потому что это проще, и я ленив.
Обратите внимание, до сих пор я не упоминал о каких-либо конкретных инструментах, реализациях или приведенных примерах. Это преднамеренно. До сих пор все это было проектной и/или архитектурной работой. Да, если вы хотите "сделать все правильно", вы проектируете и планируете до . (Переходим от общего к конкретному.)
Чтобы сделать это практичным, ниже приведена конкретная проблема, которую я решил, одновременно выдавая команду тысячам компьютеров в домене Windows.
По причинам, в которые не нужно вдаваться, я недавно столкнулся с ситуацией, когда лучшим решением было выдавать одну команду на каждый один компьютер, принадлежащий моему работодателю, чтобы исправить перекос времени во всем домене. (Я также был сильно ограничен во времени - у меня было менее 2 часов, чтобы все компьютеры в домене снова синхронизировались с "настоящим" временем)
Get-ADComputer
, которая используется для извлечения компьютерного объекта из Active Directory. Так и должно быть, потому что все компьютеры были присоединены к домену и поэтому перечислены в AD.$boxlist = Get-ADComputer -filter *
(Хранит список всех компьютерных объектов, найденных в Active Directory, в переменной с именем boxlist)
New-PSSession
- это моя команда для этого.Get-Credential
cmdlet, и в результате я получу две команды ниже. $creds = Get-Credential domain\user
(Создает запрос, в который я введу свои учетные данные и сохраню маркер аутентификации в переменной с именем creds)$session = New-PSS Session -ComputerName $boxlist.name -Credential $creds
(Создает новые сеансы PowerShell для каждого компьютера в переменной boxlist, используя только что предоставленные мною учетные данные, и сохраняет эти сеансы PowerShell в переменной с именем ).
w32tm /resync /nowait /rediscover
, и использование Powershell будет вызвано командой Invoke-Command. Invoke-Command -Session $session -ScriptBlock {w32tm /resync /nowait /rediscover}
(Вызов команды, подаваемой на переключатель блока сценариев, на переключатель сеанса, которая содержит переменную с именем сеансов, содержащую список всех компьютеров в моем домене)Сценарий, или все его компоненты, были написаны и могут быть либо выполнены, по одной строке за раз в оболочке PowerShell, либо сохранены в виде файла сценария PowerShell и запущены. Я спешу, и это довольно короткий скрипт, который я не думаю, что мне придется использовать снова (или у меня будут проблемы с воссозданием, так что, в конце концов, я пробиваю его построчно в окне оболочки.
$boxlist = Get-ADComputer -filter *
$creds = Get-Credential domain\user
$session = New-PSSession -ComputerName $boxlist.name -Credential $creds
Invoke-Command -Session $session -ScriptBlock {w32tm /resync /nowait /rediscover}