Ansible Playbook能否运行无限循环?能否监控Python脚本指定输出?
问题解答
1. Ansible Playbook 是否支持运行无限循环?
支持,但要适配 Ansible 的任务执行特性:
- 可通过
loop结合until: false实现 Playbook 层面的无限循环任务,示例:- name: 无限循环执行任务 debug: msg: "循环执行中" until: false retries: 1 delay: 5 - 如果是运行外部无限循环的命令/脚本,必须使用异步执行模式——因为 Ansible 默认会等待任务完成才继续,无限循环任务会触发超时。可通过
async和poll参数实现:- name: 异步运行无限循环脚本 shell: python3 python_script.py async: 0 # 0 表示无限期运行 poll: 0 # 立即返回,不等待任务结束 register: script_job
2. 运行指定 Python 脚本并监控每次“I'm alive”输出是否可行?
完全可行,两种常见实现方式:
方式一:异步运行脚本并轮询输出
通过异步模式启动脚本,再用 async_status 模块定期轮询捕获输出:
- name: 启动无限循环脚本 shell: python3 python_script.py async: 0 poll: 0 register: alive_job - name: 监控脚本输出 async_status: jid: "{{ alive_job.ansible_job_id }}" register: job_status until: "'I\\'m alive' in job_status.stdout" retries: 100 delay: 5
每次轮询会检查输出是否包含目标字符串,满足条件时可触发后续逻辑。
方式二:定向脚本输出到日志,监控日志文件
让 Python 脚本将输出写入日志,再用 Ansible 的 wait_for 模块监控日志内容:
- 修改 Python 脚本,输出写入日志:
import time import logging logging.basicConfig(filename='alive.log', level=logging.INFO, format='%(message)s') while True: msg = "I'm alive" print(msg) logging.info(msg) time.sleep(5) - Playbook 中运行脚本并监控日志:
- name: 启动脚本后台运行 shell: nohup python3 python_script.py & - name: 监控日志中的"I'm alive" wait_for: path: /path/to/alive.log search_regex: "I'm alive" state: present timeout: 30 register: log_monitor retries: 10 delay: 5
提示:如果需要长期持续监控,建议结合 systemd 等系统服务管理脚本运行,Ansible 负责配置启动服务,再通过日志工具捕获输出。
内容的提问来源于stack exchange,提问作者Mahdi Kh
相关产品推荐
相关产品推荐

