显示完成每个 vagrant ansible 任务所需的时间

Posted

技术标签:

【中文标题】显示完成每个 vagrant ansible 任务所需的时间【英文标题】:Display the time it takes each vagrant ansible task to complete 【发布时间】:2013-11-20 08:40:57 【问题描述】:

我正在将 vagrant provisioner 从 shell 转换为 ansible,我想知道是否有任何选项可以显示完成每项任务所需的实际时间?

理想情况下,我想对使用 shell: 方法和内置 yum: with_items 方法在 yum 中安装多个包之间的差异进行基准测试。提款机 我正拿着秒表坐在这里,但我需要准确的时间。

【问题讨论】:

Raath,如果有适合您的答案,请接受。或者,您可以回答自己的问题。 【参考方案1】:

我已经通过添加callback plugin 解决了 Ansible 任务持续时间的计时问题。回调插件旨在允许您根据 Ansible 运行上下文中发生的事件运行自己的任意代码。

The plugin I use 很容易通过创建 callback_plugins 目录并将 python 脚本放入其中来部署。

以下是 playbook 运行结束时生成的输出示例:

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

另外,我将 shell 命令 time 添加到 ansible-playbook 运行中。这很好地汇总了所有单个任务的持续时间。

编辑#1:

从 Ansible v2.0.0 开始,这个特定的插件随 Ansible 本身一起提供!只需将callbacks_enabled = profile_tasks 添加到~/.ansible.cfg 文件的[defaults] 部分即可。

编辑#2: 由于 Ansible v2.1.5 callback_whitelist 已被弃用,取而代之的是 callbacks_enabled

[defaults]
callbacks_enabled = profile_tasks
...

【讨论】:

callback_whitelist = ... 行应该放在 `ansible.cfg' 的 [defaults] 部分【参考方案2】:

Ansible 将时间戳放入其日志中,因此您可以使用它。您可以使用您的 ansible.cfg 文件打开它:

[defaults]
log_path = ./ansible.log

你也可以像这样粗略地做一些事情——创建一个看起来像这样的剧本:

---
#
# 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,无论你想在哪里输出时间戳。

【讨论】:

【参考方案3】:

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

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

如需完整示例,请查看datadog 插件

【讨论】:

【参考方案4】:

只需在整个 Ansible playbook 的执行前加上 time。 确保您的shell: 脚本与yum: 模块执行相同的操作,例如更新缓存、下载文件与使用本地缓存等。

使用yum: 的好处之一是,Ansible 可以更好地处理失败的安装,而不是盲目地将shell: 命令作为一个整体运行。

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

【讨论】:

以上是关于显示完成每个 vagrant ansible 任务所需的时间的主要内容,如果未能解决你的问题,请参考以下文章

基于 Vagrant 和 Ansible 搭建持续交付平台

在WINDOWS上通过VAGRANT练习ANSIBLE

python Ansible的Vagrant动态库存脚本

vagrant 上的 Ansible 错误中没有模块名称 Yum

使用 Vagrant 测试 Ansible 剧本 | Linux 中国

Ansible Galaxy Provisioner 未在 Vagrant 中使用私钥