You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清理陷入交互停滞的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方式示例:
    ansible-runner run --timeout 3600 /path/to/your/runner/project
    
    Python API示例:
    runner = 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: yes
    
    替换stuck_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:18:20