如何让Ansible运行命令时实时打印stdout而非结束后输出
Ansible实时打印运行中命令stdout的实现方案
可以实现,核心要同时解决程序自身的非交互终端输出缓冲和Ansible的输出缓冲两个问题,不需要开启verbose参数,具体方法如下:
- 方法1:使用
unbuffer工具禁用程序输出缓冲
大部分程序(比如make、gcc)在非交互式终端下默认开启stdout块缓冲,只有缓冲写满或者进程结束才会输出内容,你可以通过unbuffer工具(属于expect软件包,大部分操作系统可以直接通过包管理器安装expect得到)包裹要执行的命令,禁用程序自身的缓冲,示例配置如下:
- name: make project shell: unbuffer make -j4 install args: chdir: "{{ project_dir }}/build"
- 方法2:开启Ansible本身的无缓冲输出模式
运行ansible-playbook命令时加上--unbuffered参数,即可禁用Ansible侧的输出缓存,实时打印命令输出:
ansible-playbook --unbuffered your_playbook.yml
- 方法3:调整全局callback配置(可选)
如果需要永久生效,可以修改ansible.cfg配置,指定标准输出回调为实时输出类型,同时关闭缓冲:
[defaults] stdout_callback = debug force_color = 1 [callback_debug] display_ok_hosts = yes display_skipped_hosts = yes show_per_host_start = yes buffered = False
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

