如何显示长期运行的Ansible任务的进度?

时间:2016-12-16 23:54:59

标签: ansible ansible-2.x

我有一些Ansible任务执行不幸的长操作 - 比如运行S3文件夹的同步操作。并不总是很清楚它们是否正在进展,或者只是卡住了(或者ssh连接已经死亡),所以显示某种进度输出会很好。如果直接显示命令的stdout / stderr,我会看到,但Ansible会捕获输出。

管道输出is a difficult problem for Ansible to solve in its current form。但是,我有什么可以使用的Ansible技巧来提供某种迹象表明事情还在继续吗?

当前故障单为https://github.com/ansible/ansible/issues/4870

4 个答案:

答案 0 :(得分:16)

我今天在OSX上遇到了这个问题,在那里我运行了一个docker shell命令,它需要很长时间才能构建,并且在构建时没有输出。不理解命令是否挂起或者进展缓慢是非常令人沮丧的。

我决定将shell命令的输出(和错误)传递给一个端口,然后可以通过另一个终端中的netcat监听该端口。

myplaybook.yml

- name: run some long-running task and pipe to a port
  shell: myLongRunningApp > /dev/tcp/localhost/4000 2>&1

在另一个终端窗口中:

$ nc -lk 4000
Output from my
long
running
app will appear here

请注意,我将错误输出传递给同一个端口;我可以轻松地管道到不同的端口。

另外,我最终设置了一个名为nc_port的变量,它允许在端口正在使用时更改端口。然后,ansible任务看起来像:

  shell: myLongRunningApp > /dev/tcp/localhost/{{nc_port}} 2>&1

请注意,命令myLongRunningApp正在localhost上执行(即库存中的主机设置),这就是我使用nc收听localhost的原因。

答案 1 :(得分:10)

你可以做几件事,但正如你正确指出的那样,Ansible目前的形式并没有提供一个好的解决方案。

官方解决方案:

一个想法是将任务标记为异步并轮询它。显然,这只适用于能够以这种方式运行而不会导致剧本中其他地方失败的情况。异步文档是here,这是一个取消它们的示例:

- hosts: all
  remote_user: root
  tasks:
  - name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec
    command: /bin/sleep 15
    async: 45
    poll: 5

至少可以给你一个' ping'要知道任务不是悬而未决。

唯一正式认可的方法是Ansible Tower,它有任务进度条,但不是免费的。

Hacky-ish解决方案:

除了上述内容之外,你几乎不得不自己动手。您可以使用脚本定期调用AWS CLI并计算存储桶中的项目数来轻松监控同步S3存储桶的具体示例,但这不是一个好的通用解决方案。

我能想象的唯一有效的方法就是从你的一个节点观看传入的ssh会话。

为此,您可以将该计算机上的ansible用户配置为通过屏幕连接并主动观看。或者也许在该用户的sudoers条目中使用log_output选项,允许您拖尾文件。可以在sudoers man page

上找到log_output的详细信息

答案 2 :(得分:4)

此后,Ansible实现了以下功能:

---
# Requires ansible 1.8+
- name: 'YUM - async task'
  yum:
    name: docker-io
    state: installed
  async: 1000
  poll: 0
  register: yum_sleeper

- name: 'YUM - check on async task'
  async_status:
    jid: "{{ yum_sleeper.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 30

有关更多信息,请参阅主题上的official documentation(确保您选择的是Ansible版本)。

答案 3 :(得分:2)

如果您使用Linux,则可以使用systemd-run创建瞬态单元并使用journalctl检查输出,例如:

sudo systemd-run --unit foo \                                      
     bash -c 'for i in {0..10}; do 
                   echo "$((i * 10))%"; sleep 1;
              done;
              echo "Complete"'

在另一场会议中

sudo journalctl -xf --unit foo

它会输出如下内容:

Apr 07 02:10:34 localhost.localdomain systemd[1]: Started /bin/bash -c for i in {0..10}; do echo "$((i * 10))%"; sleep 1; done; echo "Complete".
-- Subject: Unit foo.service has finished start-up
-- Defined-By: systemd
-- Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit foo.service has finished starting up.
-- 
-- The start-up result is done.
Apr 07 02:10:34 localhost.localdomain bash[10083]: 0%
Apr 07 02:10:35 localhost.localdomain bash[10083]: 10%
Apr 07 02:10:36 localhost.localdomain bash[10083]: 20%
Apr 07 02:10:37 localhost.localdomain bash[10083]: 30%
Apr 07 02:10:38 localhost.localdomain bash[10083]: 40%
Apr 07 02:10:39 localhost.localdomain bash[10083]: 50%
Apr 07 02:10:40 localhost.localdomain bash[10083]: 60%
Apr 07 02:10:41 localhost.localdomain bash[10083]: 70%
Apr 07 02:10:42 localhost.localdomain bash[10083]: 80%
Apr 07 02:10:43 localhost.localdomain bash[10083]: 90%
Apr 07 02:10:44 localhost.localdomain bash[10083]: 100%
Apr 07 02:10:45 localhost.localdomain bash[10083]: Complete