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

如何让Ansible async_status重试时显示脚本输出而非重试提示?

问题

使用ansible.builtin.expect模块执行交互式脚本,通过ansible.builtin.async_status获取脚本执行状态,但每次重试时仅显示如下重试提示,想实现每次重试时显示脚本输出:

TASK [Wait for the script execution] *******************************************
FAILED - RETRYING: [SERVER1]: Wait for the script execution (100 retries left).
FAILED - RETRYING: [SERVER1]: Wait for the script execution (99 retries left).
FAILED - RETRYING: [SERVER1]: Wait for the script execution (98 retries left).
...

当前使用的Playbook片段:

- name: Execute Shutdown Script
  ansible.builtin.expect:
    command: "./{{ script_file }}"
    responses: "{{ responses }}"
  args:
    chdir: "{{ script_path }}"
  register: script_status
  async: 1000
  poll: 0
  changed_when: not script_status.changed

- name: Wait for the script execution
  ansible.builtin.async_status:
    jid: "{{ script_status.ansible_job_id }}"
  register: script_job_async_result
  until: script_job_async_result.finished
  retries: "{{ script_async_retries | default(100) }}"
  delay: "{{ script_async_delay | default(1) }}"
  when: script_status.ansible_job_id is defined

解决方案

方法1:在重试周期内直接打印async_status返回的输出

async_status模块会返回异步任务的stdout和stderr字段,将状态检查和输出打印放在同一个任务块中,利用always确保每次重试都执行输出操作:

- name: Wait for script execution and show output
  block:
    - name: Check async job status
      ansible.builtin.async_status:
        jid: "{{ script_status.ansible_job_id }}"
      register: script_job_async_result
      until: script_job_async_result.finished
      retries: "{{ script_async_retries | default(100) }}"
      delay: "{{ script_async_delay | default(1) }}"
      when: script_status.ansible_job_id is defined
  always:
    - name: Print current script output
      debug:
        msg: |
          脚本执行中,当前输出:
          {{ script_job_async_result.stdout | default('无') }}
          当前错误输出:
          {{ script_job_async_result.stderr | default('无') }}
      when: script_status.ansible_job_id is defined

方法2:通过expect日志文件追踪输出

让expect模块将脚本执行日志写入远程主机的文件,每次重试时读取该文件内容并打印:

  1. 修改执行脚本的任务,添加logfile参数:
- name: Execute Shutdown Script
  ansible.builtin.expect:
    command: "./{{ script_file }}"
    responses: "{{ responses }}"
    logfile: "{{ script_path }}/script_execution.log"
  args:
    chdir: "{{ script_path }}"
  register: script_status
  async: 1000
  poll: 0
  changed_when: not script_status.changed
  1. 修改等待任务,配合slurp模块读取并打印日志:
- name: Wait for script execution and show log
  ansible.builtin.async_status:
    jid: "{{ script_status.ansible_job_id }}"
  register: script_job_async_result
  until: script_job_async_result.finished
  retries: "{{ script_async_retries | default(100) }}"
  delay: "{{ script_async_delay | default(1) }}"
  when: script_status.ansible_job_id is defined
  changed_when: false
  notify: Print script execution log

- name: Read script log file
  ansible.builtin.slurp:
    src: "{{ script_path }}/script_execution.log"
  register: script_log_content
  listen: Print script execution log
  when: script_status.ansible_job_id is defined

- name: Display script log
  debug:
    msg: "{{ script_log_content.content | b64decode }}"
  listen: Print script execution log
  when: script_status.ansible_job_id is defined

方法3:调整Ansible输出 verbosity

如果只是需要临时查看详细输出,可以在运行Playbook时增加-v、-vv或更高级别 verbosity 参数,Ansible会默认展示更多任务执行细节,包括异步任务的输出内容。


内容的提问来源于stack exchange,提问作者Gineesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:19:51