如何让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模块将脚本执行日志写入远程主机的文件,每次重试时读取该文件内容并打印:
- 修改执行脚本的任务,添加
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
- 修改等待任务,配合
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
相关产品推荐
相关产品推荐

