如何清理陷入交互停滞的Ansible Runner进程?
Ansible Runner停滞任务的安全清理与超时预防
一、提前设置超时,从根源避免停滞
- 模块级超时:使用shell/command模块时,直接添加Ansible内置的
timeout参数,超时后会自动终止远程任务并清理关联进程:- name: 执行带超时的shell命令 shell: "your_target_command" args: executable: /bin/bash timeout: 300 # 单位秒,示例为5分钟 - Ansible Runner全局超时:通过CLI或API设置整个任务的超时上限,CLI方式示例:
Python API示例:ansible-runner run --timeout 3600 /path/to/your/runner/projectrunner = ansible_runner.Runner( private_data_dir='/path/to/runner/dir', playbook='your_playbook.yml', timeout=3600 # 1小时超时 ) - Cron脚本兜底超时:在cron调用的脚本里用系统
timeout命令包裹ansible-runner,做双重保险:timeout 4h ansible-runner run /path/to/your/runner/project
二、安全清理已停滞的进程
不要直接用kill -9强制终止控制节点的Ansible进程,优先用以下方法:
- 优雅终止控制节点进程:找到停滞的ansible-runner/ansible-playbook进程PID,先发送
SIGTERM(默认kill <PID>),给Ansible时间主动清理远程子进程;若几分钟后仍未结束,再用kill -9 <PID>强制终止。 - 批量清理远程孤儿进程:如果远程确实留下孤儿进程,写个playbook批量清理:
替换- name: 清理远程服务器的停滞进程 hosts: your_target_hosts become: yes tasks: - name: 查找并终止指定命令的进程 shell: "ps aux | grep 'stuck_command_keyword' | grep -v grep | awk '{print $2}' | xargs kill -9" ignore_errors: yesstuck_command_keyword为停滞命令的特征关键词即可。 - 终止整个进程组:获取停滞进程的进程组ID(PGID),用
kill -TERM -<PGID>终止整个进程组,避免遗漏控制节点的子进程:# 获取PGID ps -o pgid= <停滞进程PID> | tr -d ' ' # 终止进程组 kill -TERM -<PGID>
三、额外优化建议
- 禁用交互:shell模块执行的命令必须是非交互式的,比如给需要确认的命令加
-y参数(如apt-get -y install),或用管道自动输入确认信息(echo y | your_command)。 - 开启日志与进程追踪:在
ansible.cfg中配置日志路径和verbosity,方便排查停滞原因:[defaults] log_path = /var/log/ansible/ansible.log verbosity = 2 - 监控任务运行时长:在cron脚本中记录任务启动/结束时间,超过预设阈值就触发报警,及时发现停滞任务。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

