Ansible 2.7.5通过WinRM执行Windows Playbook无输出问题求助
解决Ansible Playbook中WinRM执行PowerShell命令无法获取输出的问题
你的问题核心在于win_command模块的使用逻辑和PowerShell的调用方式不匹配,咱们来一步步梳理解决办法:
问题根源
你在命令行直接执行ansible win -I hosts -m win_command -a "PowerShell.exe ipconfig"能成功,是因为命令行里把ipconfig作为powershell.exe的参数直接传递了;但在Playbook里用stdin: ipconfig的方式,PowerShell在非交互模式下的输出缓冲逻辑和交互模式不同,导致Ansible没能正确捕获到输出内容。
推荐解决方案
方案1:直接用win_command执行ipconfig(最简单)
ipconfig本身是Windows系统自带的可执行文件,不需要通过PowerShell中转,直接调用即可:
- hosts: win gather_facts: no tasks: - name: Execute ipconfig directly win_command: ipconfig register: ipconfig_result - debug: var: ipconfig_result.stdout_lines
方案2:用win_shell模块执行PowerShell命令(更适合复杂场景)
如果后续要执行复杂的PowerShell脚本或命令,推荐使用专门的win_shell模块——它是为Windows shell(包括PowerShell)执行命令设计的,处理输出更可靠:
- hosts: win gather_facts: no tasks: - name: Run ipconfig via PowerShell win_shell: ipconfig register: shell_result - debug: var: shell_result.stdout_lines
如果需要强制指定用PowerShell而非默认的cmd,可以额外加上executable: powershell.exe参数。
方案3:调整win_command调用PowerShell的方式(兼容特殊场景)
如果坚持要用win_command调用powershell.exe,需要用-Command参数传递命令,而非stdin的方式,和你命令行执行的逻辑保持一致:
- hosts: win gather_facts: no tasks: - name: Execute ipconfig via PowerShell with -Command win_command: powershell.exe -Command "ipconfig" register: shell_result - debug: var: shell_result.stdout_lines
总结
优先选择方案1或方案2,它们更符合Ansible模块的设计意图,能避免不必要的输出捕获问题;方案3仅适合需要兼容特定调用逻辑的场景。
内容的提问来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

