2016-12-16 1479 views
18

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

管道输出回is a difficult problem for Ansible to solve in its current form。但是有没有什么Ansible的技巧可以用来提供某种迹象表明事情还在发展中?

当前票号是https://github.com/ansible/ansible/issues/4870

回答

8

有一对夫妇的事情可以做,但你已经正确地指出,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 

这至少可以给你一个“平”要知道,任务不挂。

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

哈克上下的解决方案:

除了上面,你几乎将不得不推出自己的。通过脚本定期调用AWS CLI并计算存储桶中的项目数量,您可以非常轻松地监控同步S3存储桶的具体示例,但这不是一个好的通用解决方案。

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

要做到这一点,您可以配置该机器上的有用用户通过屏幕进行连接并主动观看。或者,可以在该用户的sudoers条目中使用log_output选项,以允许您尾随文件。可以在sudoers man page上找到log_output的详细信息

10

我今天在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正在本地主机上执行(即这是在库存设置主机),这就是为什么我听与nc为localhost。

相关问题