显示每个Vagrant Ansible任务完成所需的时间

22
我正在将vagrant provisioner从shell转换为ansible,我想知道是否有任何选项可以显示每个任务完成所需的实际时间?
理想情况下,我希望通过使用shell:方法和内置的yum:with_items方法在yum中安装多个软件包之间的差异进行基准测试。目前,我手动计时,但我需要准确的时间。

Raath,请在您有合适的答案时接受答案。或者,您也可以回答您自己的问题。 - tedder42
4个回答

54

我通过添加一个回调插件来解决了计算Ansible任务持续时间的问题。 回调插件旨在允许您基于在Ansible运行上下文中发生的事件运行自己的任意代码。

我使用的插件可以通过创建一个callback_plugins目录并将Python脚本添加到其中轻松部署。

以下是播放簿运行结束时生成的结果输出的示例:

PLAY RECAP ******************************************************************** 
npm_install_foo | Install node dependencies via npm ------------------- 194.92s
gulp_build | Run Gulp to build ----------------------------------------- 89.99s
nodejs | Update npm ---------------------------------------------------- 26.96s
common | Update apt cache and upgrade base os packages ----------------- 17.78s
forever | Install forever (restarts Node.js if it fails) --------------- 16.84s
nodejs | Node.js | Install Node.js and npm ----------------------------- 15.11s
bower | Install bower --------------------------------------------------- 9.37s
Copy locally fetched repo to each instance ------------------------------ 8.03s
express | Express | Install Express ------------------------------------- 8.00s

此外,我在ansible-playbook运行前加入shell命令time。这样可以很好地聚合所有单个任务的持续时间。

编辑#1:

自Ansible v2.0.0起,此特定插件已随Ansible一起提供!只需在[defaults]部分的~/.ansible.cfg文件中添加callbacks_enabled = profile_tasks即可。

编辑#2:自Ansible v2.1.5起,callback_whitelist已弃用,改为使用callbacks_enabled

[defaults]
callbacks_enabled = profile_tasks
...

7
callback_whitelist = ... 这行代码应该放在 ansible.cfg 文件的 [defaults] 部分。 - Mzzzzzz

3

Ansible会在其日志中加入时间戳,因此您可以使用它。您可以通过ansible.cfg文件打开此功能:

[defaults]
log_path = ./ansible.log

您可以采用类似下面这样的简单方法 - 创建一个像这样的playbook:
---
#
# Outputs a timestamp to the console
#
# Used for debugging/timing stuff.
#

- local_action: shell date +'%F %T'
  register: ts
  sudo: no

- name: Timestamp
  debug: msg="{{ ts.stdout }}"

然后,在您想要输出时间戳的任何地方,include它。

0

遗憾的是,默认情况下没有性能日志记录。

但是,您可以向ansible添加自己的回调监听器。此回调将在操作开始和结束时得到通知...

有关完整示例,请查看datadog插件。


-2

只需在整个Ansible playbook的执行前加上time

确保您的shell:脚本与yum:模块执行相同的操作,例如更新缓存、下载文件等,而不是使用本地缓存等等。

使用yum:的好处之一是,Ansible可以更好地处理安装失败,而不是像单片机一样盲目运行shell:命令。

我认为差异将非常小(几分之一秒到2-3秒)。我想您需要多次运行基准测试才能得到统计上准确的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接