在Ansible中,使用sh模块执行shell命令时,默认行为是在远程主机上执行命令,并在命令完成后报告输出。但是,有时可能需要在命令完成之前获取输出。以下是一个解决方法的代码示例:
- name: Execute shell command and capture output
hosts: your_host
gather_facts: false
tasks:
- name: Run shell command and capture output
shell: your_command
register: command_output
async: 60
poll: 0
- name: Wait for command completion
async_status:
jid: "{{ command_output.ansible_job_id }}"
register: command_result
until: command_result.finished
retries: 30
delay: 2
- name: Print command output
debug:
msg: "{{ command_result.results[0].ansible_job_result.stdout }}"
在上面的示例中,我们使用了sh模块来执行shell命令,并将输出注册到变量command_output
中。通过设置async
参数为60,poll
参数为0,我们告诉Ansible在后台异步执行该命令,而不是等待其完成。
接下来,我们使用async_status
模块来检查命令的执行状态。我们使用ansible_job_id
从command_output
中获取作业ID,并将结果注册到变量command_result
中。通过设置until
参数为command_result.finished
,retries
参数为30,delay
参数为2,我们告诉Ansible在命令完成之前等待,并每2秒检查一次状态。
最后,我们使用debug
模块打印命令的输出,通过访问command_result.results[0].ansible_job_result.stdout
来获取stdout。
使用上述方法,你可以在Ansible中获取sh模块执行的shell命令的输出,即使命令尚未完成。