Как запустить команду Powershell в Rundeck с конвейерами

Я использую Rundeck версии 3.0.13 для отправки команд PowerShell через WinRM на узлы Windows Server 2016. Есть ли способ запустить команду PowerShell с символами канала как одну команду? Например, я бы хотел иметь возможность выполнить такую ​​команду для запуска неотключенных служб:

Get-Service | where-object {$_.StartType -ne "Disabled"} | foreach-object {Start-Service $_}

Но я получаю сообщение об ошибке "где-объект" не найден. Исполнитель узла WinRM запускает команду в качестве аргумента для powershell в приглашении CMD, поэтому происходит то, что часть команды Get-Service запускается в Powershell, но затем он пытается передать по конвейеру «where-object» в CMD подсказка, вот так:

CMD> powershell Get-Service | where-object ... 

Есть ли способ избежать оператора powershell в Rundeck, чтобы команды конвейера выполнялись в PowerShell, а не только в первой части? Я безуспешно пытался заключить его в -команду "& {...}". (В этом случае я получаю синтаксическую ошибку и в результате появляется экран справки по PowerShell.)

Спасибо!


person Greg Graham    schedule 25.09.2019    source источник
comment
Почему бы не выполнить заранее разработанный сценарий, файл .ps1? Я не понимаю, почему так много людей пытаются передать серию команд PowerShell основному исполняемому файлу, когда вы можете гораздо проще поддерживать простой файл сценария. Есть ли причина, по которой вы должны отправлять команды скрипта таким образом?   -  person gravity    schedule 25.09.2019
comment
Да, я согласен. В нашем случае у сетевых администраторов есть правило брандмауэра, которое блокирует административный ресурс C $ и не позволяет нам протолкнуть скрипт с хоста rundeck на цель Windows с WinRM.   -  person Greg Graham    schedule 25.09.2019


Ответы (2)


Самый несложный способ сделать это - вызвать скрипт, как говорит @gravity, или использовать шаг встроенного скрипта, выбрать новый шаг «Сценарий - Выполнить встроенный скрипт», нажать кнопку «Дополнительно», установить «powershell.exe» в «Строка вызова» и «.ps1» в текстовом поле «Расширение файла» (и, конечно же, ваш материал Powershell в поле «Введите весь скрипт для выполнения»).

Если удаленное выполнение сценария отключено в вашем узле Windows, вы можете включить его с помощью set-executionpolicy remotesigned на вашем узле Windows.

Обновить ответ:

Если вы хотите выполнить непосредственно на «шаге команды» (поскольку политики безопасности, как вы сказали, ограничены), убедитесь, что в конфигурации вашего проекта настроен «WinRM Node Executor Python» (на «Default Node Executor»), определите «Powershell "в текстовом поле" Оболочка ". Кроме того, в качестве хорошей практики определите «WinRM Node Executor Python» в «Копировщике файлов по умолчанию».

Теперь вам не нужно вызывать "poweshell.exe" в вашей команде, просто введите команду конвейера, например, Get-Content myfile.txt | Select-string -SimpleMatch "${option.mystring}".

person MegaDrive68k    schedule 25.09.2019
comment
Потрясающие! Я получил это для работы с WinRM Node Executor Python. Два коротких примечания: (1) Мне пришлось заключить строковые литералы в двойные кавычки в одинарные кавычки, как было предложено в сообщении об ошибке, например: Get-Service | где-объект {$ _. StartType -ne 'Disabled'} | foreach-object {Start-Service $ _} (всего 3 кавычки) (2) Я сам не добавлял powershell.exe; если я неправильно прочитал исходный код, обычный WinRM Node Executor делает это и запускает весь shebang в командной оболочке. - person Greg Graham; 27.09.2019

Вам необходимо настроить правильные определения узлов, используется ли в вашем проекте смешанный набор узлов Windows и Linux или только узлы Windows?

Есть ли у вас окна rundeck server? Если да, установите локальный режим выполнения проекта или используйте python исполнителя узла WinRm. Взгляните на следующее определение узла: я использую pywinrm для выполнения на узле Windows с включенным делегированием учетных данных и устанавливаю оболочку по умолчанию на powershell, используя эту конфигурацию, я могу запускать запросы второго прыжка и каналы как один лайнер.

  <node name="server.WinRMPython" 
    description="JUMP" 
    tags="Server 2019,WinRMPython" 
    hostname="myserver" osArch="amd64" 
    osFamily="windows" 
    osName="Server 2019" 
    osVersion="2019" 
    role="jump server" 
    function="rundeck execution node" 
    username="my user" 
    winrm-password-option="winrmPassword" 
    winrm-password-storage-path="keys/windows/myserver.pass" 
    node-executor="WinRMPython" 
    file-copier="WinRMcpPython" 
    Winrm-protocol="http" 
    winrm-cmd="PowerShell" 
    winrm-auth-type="credssp" 
    file-copy-destination-dir="c:\temp"/>
person Konrad Tjaden    schedule 21.10.2019