如何通过Ansible Playbook运行Python脚本并输出结果?
问题分析
你的Ansible任务卡在Run the script步骤,核心原因有两个:
- Ansible的
command模块默认会阻塞等待命令执行完毕,而你的Python脚本是无限循环,永远不会主动退出,所以任务会一直挂起。 - 即使脚本正常运行,Ansible默认会缓存命令输出,直到命令结束才返回结果,因此你看不到实时的
I'm alive输出。
另外,你的Playbook里还有一个语法错误:Check if script ran任务中引用了未定义的变量script_output,正确的变量名应该是你注册的script_result。
解决方案
根据你的需求,分两种场景处理:
场景1:让脚本后台运行(不阻塞Ansible任务)
如果只是需要脚本在后台持续运行,同时保留输出日志,修改Run the script任务为:
- name: Run the script in background shell: nohup {{ python_interpreter }} {{ python_script_dest }} > /opt/web_service/script_output.log 2>&1 & register: script_result become: true become_user: root
参数解释:
nohup:让脚本脱离当前终端会话,即使Ansible任务结束,脚本仍会继续运行> /opt/web_service/script_output.log:把标准输出重定向到日志文件2>&1:把错误输出也重定向到同一个日志文件&:让进程在后台运行,立即返回控制权给Ansible
之后可以添加任务查看最新的日志内容:
- name: Show latest script output command: tail -n 10 /opt/web_service/script_output.log register: recent_logs - debug: var: recent_logs.stdout_lines
场景2:实时查看脚本输出(阻塞Ansible任务)
如果需要在Ansible执行过程中实时看到I'm alive的输出,可以保留command模块,但需要注意:
- Ansible会一直阻塞直到你手动中断(
Ctrl+C) - 需要使用较高的 verbosity 级别(比如
-vvv)才能看到实时输出
同时修正变量名错误:
- name: Check if script ran debug: msg: "Script ran: {{ script_result.changed }}"
注意事项
- 后台运行的脚本可以用
ps aux | grep python_script.py查看进程状态 - 如果需要停止脚本,使用
pkill -f python_script.py命令 - 避免在生产环境中直接运行无限循环的后台脚本,建议添加进程管理(比如systemd服务)来保证脚本异常退出后自动重启
内容的提问来源于stack exchange,提问作者Mahdi Kh
相关产品推荐
相关产品推荐

