Windows Batch File via Ansible - ERROR: Input redirection is not supported

Good day,

Struggling to find a way to run the below vendor-provided batch file via Ansible. The script works fine when run manually, but I receive dozens of the below error when executing via Ansible win_command or win_shell. I have also tried to execute the batch file interactively using become. When ran interactively it simply hangs. Hoping to find a solution that doesn’t involve modifying vendor provided code.

Ansible:

  • name: Upgrade RabbitMQ
    ansible.windows.win_shell: .\install_rabbitmq.bat
    args:
    chdir: ‘{{ install_app_download_dir }}\Prerequisites’

Error:

ERROR: Input redirection is not supported, exiting the process immediately.

install_rabbitmq.bat File:

CLS
@ECHO OFF

%Temp%\install_rabbitmq.log

CALL sc qc RabbitMQ > NUL
if errorlevel 1 (
goto rabbitchecked
)
CALL sc qc RabbitMQ | findstr “erts-13.1.2” > NUL
if %errorlevel% equ 0 (
ECHO RabbitMQ in the newest version detected. Aborting reinstall
goto newestrabbit
)

:rabbitchecked

CALL SC QUERY AppNetStateService > NUL
if errorlevel 1060 (
ECHO Services are stopped >>%Temp%\install_rabbitmq.log
goto servicesstopped
)
ECHO Stopping Services… >>%Temp%\install_rabbitmq.log
CALL “%~dp0\App.ServiceManager.exe” /Mode:Stop 2>>%Temp%\install_rabbitmq.log
:servicesstopped

CALL SC QUERY RabbitMQ > NUL
if errorlevel 1060 (
ECHO Rabbit is uninstalled >>%Temp%\install_rabbitmq.log
goto rabbituninstalled
)

ECHO UNinstalling Rabbit >>%Temp%\install_rabbitmq.log
CALL sc stop RabbitMQ 2>>%Temp%\install_rabbitmq.log
:rabbitloop
CALL sc query RabbitMQ | find “STOPPED”
if errorlevel 1 (
TIMEOUT 10
goto rabbitloop
)

CALL sc config RabbitMQ binPath= “%ProgramW6432%\Erlang OTP\erts-13.1.2\bin\erlsrv.exe”

ECHO Uninstalling RabbitMQ…
CALL “%ProgramW6432%\RabbitMQ Server\uninstall.exe” /S 2>>%Temp%\install_rabbitmq.log
:LOOPUNINSTALL1
CALL “%~dp0\PSLIST” Un_A /accepteula 2>>%Temp%\install_rabbitmq.log
IF ERRORLEVEL 1 (
ECHO RabbitMQ uninstallation finished.
GOTO CONTINUEUNINSTALL1
) ELSE (
TIMEOUT 2
GOTO LOOPUNINSTALL1
)

:CONTINUEUNINSTALL1

TIMEOUT 60 >nul 2>&1

:rabbituninstalled

ECHO Uninstalling Erlang OTP…

IF NOT DEFINED ERLANG_HOME (
SET ERLANG_HOME=%ProgramW6432%\erl-24.2.1
)

CALL “%ERLANG_HOME%\uninstall.exe” /S 2>>%Temp%\install_rabbitmq.log
:LOOPUNINSTALL2
CALL “%~dp0\PSLIST” Un_A /accepteula >nul 2>>%Temp%\install_rabbitmq.log
IF ERRORLEVEL 1 (
ECHO Erlang OTP uninstallation finished.
GOTO CONTINUEUNINSTALL2
) ELSE (
TIMEOUT 2
GOTO LOOPUNINSTALL2
)

:CONTINUEUNINSTALL2

TIMEOUT 60 >nul 2>&1

ECHO Removing cookies, old files and registries…
DEL /F “C:\Windows\System32\config\systemprofile.erlang.cookie” 2>>%Temp%\install_rabbitmq.log
DEL /F “%SystemRoot%.erlang.cookie” 2>>%Temp%\install_rabbitmq.log
DEL /F “%USERPROFILE%.erlang.cookie” 2>>%Temp%\install_rabbitmq.log

DEL /S /Q /F "%AppData%\RabbitMQ" 2>>%Temp%\install_rabbitmq.log

reg delete “HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Ericsson\Erlang” /f
reg delete “HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang” /f

TIMEOUT 10 >nul 2>&1

ECHO Installing Erlang OTP 25…
CALL “%~dp0\otp_win64_25.1.2.exe” /S 2>>%Temp%\install_rabbitmq.log

:LOOP1
CALL “%~dp0\PSLIST” otp_win64_25.1.2 >nul 2>>%Temp%\install_rabbitmq.log
IF ERRORLEVEL 1 (
ECHO Erlang OTP 25 installation finished.
GOTO CONTINUE1
) ELSE (
TIMEOUT 2
GOTO LOOP1
)

:CONTINUE1
SET ERLANG_HOME=%ProgramW6432%\Erlang OTP
SETX ERLANG_HOME “%ProgramW6432%\Erlang OTP”

ECHO Installing RabbitMQ Server 3.11.4…
CALL “%~dp0\rabbitmq-server-3.11.4.exe” /S 2>>%Temp%\install_rabbitmq.log

:LOOP2
CALL “%~dp0\PSLIST” rabbitmq-server-3.11.4 >nul 2>>%Temp%\install_rabbitmq.log
IF ERRORLEVEL 1 (
ECHO RabbitMQ Server 3.11.4 installation finished.
GOTO CONTINUE2
) ELSE (
TIMEOUT 2
GOTO LOOP2
)

:CONTINUE2

ECHO Synchronising Erlang cookies…

:LOOP3
IF EXIST “%USERPROFILE%.erlang.cookie” (
GOTO CONTINUE3
) ELSE (
GOTO LOOP3
)
:CONTINUE3

TIMEOUT 10 >nul 2>&1

DEL /F “C:\Windows\System32\config\systemprofile.erlang.cookie” 2>>%Temp%\install_rabbitmq.log
COPY /Y “%USERPROFILE%.erlang.cookie” “C:\Windows\System32\config\systemprofile.erlang.cookie” 2>>%Temp%\install_rabbitmq.log

DEL /F “%SystemRoot%.erlang.cookie” 2>>%Temp%\install_rabbitmq.log
COPY /Y “%USERPROFILE%.erlang.cookie” “%SystemRoot%.erlang.cookie” 2>>%Temp%\install_rabbitmq.log

ECHO Configuring RabbitMQ…

TIMEOUT 10 >nul 2>&1
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmq-service” stop 2>>%Temp%\install_rabbitmq.log
TIMEOUT 10 >nul 2>&1
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmq-service” start 2>>%Temp%\install_rabbitmq.log

:LOOP4
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmqctl” status >nul 2>>%Temp%\install_rabbitmq.log
IF ERRORLEVEL 1 (
TIMEOUT 5 >nul 2>&1
GOTO LOOP4
) ELSE (
GOTO CONTINUE4
)

:CONTINUE4

TIMEOUT 30 >nul 2>&1
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmqctl” start_app 2>>%Temp%\install_rabbitmq.log
TIMEOUT 30 >nul 2>&1
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmqctl” add_user admin 9 2>>%Temp%\install_rabbitmq.log
TIMEOUT 5 >nul 2>&1
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmqctl” set_user_tags admin administrator 2>>%Temp%\install_rabbitmq.log
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmqctl” add_vhost / 2>>%Temp%\install_rabbitmq.log
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmqctl” set_permissions -p / admin .* .* .* 2>>%Temp%\install_rabbitmq.log
TIMEOUT 5 >nul 2>&1

:LOOP5
CALL “%ProgramW6432%\RabbitMQ Server\rabbitmq_server-3.11.4\sbin\rabbitmqctl” status >nul 2>>%Temp%\install_rabbitmq.log
IF ERRORLEVEL 1 (
TIMEOUT 5 >nul 2>&1
GOTO LOOP5
) ELSE (
GOTO CONTINUE5
)

:CONTINUE5

SC QUERY AppNetStateService > NUL
if errorlevel 1060 (
goto servicesstarted
)
ECHO Restarting services…
CALL “%~dp0\App.ServiceManager.exe” /Mode:Start 2>>%Temp%\install_rabbitmq.log
:servicesstarted

:newestrabbit

Thank you for any and all assistance!

I’m able to workaround the issue by replacing the vendor’s TIMEOUTs with “ping -n X >NUL”.

@jborean93, are there any Ansible flags or tricks that would allow this to work without modifying the vendor’s script?

You could suggest your ping replacement to the vendor. If the vendor then updates their script with your changes, you can have the benefits of running unmodified vendor code.

Try just doing - win_command: ‘{{ install_app_download_dir }}\Prerequisites\install_rabbitmq.bat’. You could also prefix that command with cmd.exe /c path\to\install.bat and see if it helps. Another option is to use ‘- win_shell: exit (Start-Process -FilePath … -Wait -PassThru).ExitCode’ to spawn it in a new console. Unfortunately that will mean you loose out on viewing any of the output.

There is no good answer here, the vendors script requires it to be run in an environment that input can be redirected but Ansible doesn’t allow that to avoid things hanging if they do prompt for input.

Thank you for the reply.

I ended up removing the TIMEOUTs from the vendor’s script and replaced them with pings.