如何将任务输出记录到文件中?


10

我的一项艰巨的任务是使用导入Oracle数据库impdp

这会产生很多输出到控制台,所以我已经设置了no_log: True

但是,如果失败,我想查看日志!

如何使此特定任务记录到文件而不是控制台?



一个想法(更多关于黑客的内容)是将日志写入某个外部文件,然后在其后执行一个任务,该任务利用failed_when条件,并删除日志文件(如果有)。任务成功:)
Dawny33

无论如何,为什么在成功运行期间仍能看到控制台输出?我没有看到配置,也没有可能在成功执行任务期间显示stdout,它应该出现[确定:主机名]。但是,当检测到错误时,输出将转储到ansible控制台(以及定义的任何ansible日志)中,您介意共享在常规成功运行期间为您提供较大stdout的配置吗?
hvindin

@hvindin在获取详细日志-vvvansible-playbook命令后放置。
Dawny33

1
注册变量似乎是最好的逻辑选择,请参阅我对您的回答的评论,以获取有关如何处理ansible触发命令的输出的意见。
hvindin

Answers:


4

[将我的评论转换为答案]

一种实现方法是将日志写入某个外部文件,然后在其后执行一个任务,该任务利用failed_when条件,如果先前的任务成功,则删除日志文件。

这样的事情应该可以帮助您。

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

注意:这可能不是解决问题的最佳方法。但是,这是一个黑客,它帮助我进行了日志记录和监视。


2
我再说一遍,您可以将命令写到stdout / stderr,然后将其转储以作为对失败的响应。因此,作为上述示例的示例,如果您确实想在发生故障时停止执行,那么在rc!= 0时,使用fail任务仅输出在PyScript中注册的stdout和stderr似乎是​​一个更全面的解决方案。例如,如果使用ansibles内置机制,则如果在控制服务器上设置了ansible日志记录,则该控制服务器会将故障记录在ansible日志中。其中觉得这是它的正确位置
hvindin

3

我认为您要做的就是注册所需的每个命令的输出(将其存储在变量中),然后将变量简单地转储到文件中。这样一来,您以后就可以查看它。

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

然后在dumpall.j2中:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

我正在使用的示例是从这里开始


3

我通过添加解决了这个问题

ignore_errors: true
register: results

到no_log-task。即使任务失败,这也使ansible继续执行下一个任务。然后为下一个任务定义一个调试任务,该任务将始终失败并输出已注册的变量,但仅在上一个任务失败时才运行:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

因此,即使使用no_log:true,这也将使ansible显示失败任务的输出。此解决方案不会按要求将其记录到文件中,而是满足了“失败时查看日志”的需求,当然,您可以重定向或使用tee将完整的ansible输出输出到文件,通过此解决方案还包含失败任务的日志。


2

当我有一个要执行的命令并希望仅在失败的情况下获取日志时,我要做的事情如下(由Shell comcomnd前缀,例如/bin/sh -c '...'在发起方不使用system调用或没有外壳的情况下直接执行命令的情况) :

command 2&>1 > command-log.txt || cat command-log.txt

仅在失败的情况下,这会将错误和标准输出重定向到文件并显示文件的内容。如果命令非常冗长,并且您不希望保留日志,可以使用以下命令:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

sh联机帮助页获取报价&&||用法:

符号&&(||)使仅在前一个管道返回零(非零)值时才执行后面的列表。

那可能不是ansible的最惯用的方法,但是它的优点是可以随便携带任何配置管理系统,并能够显示命令标准输出。


0

假设ansible正确地向stderr抛出错误,则可以使用输出重定向将任何程序中的错误输出捕获到文件中:

some command 2> error.log

但是我认为情况并非如此。

相反,您可能希望参考本指南来确定何时会发生错误http://docs.ansible.com/ansible/playbooks_error_handling.html,然后在输出到文件之前,对输出进行grep表示错误的字符串

即。

ansible-playbook my-playbook | grep 'error' > error.log


-2

我认为您正在寻找的可能只是将stdout和street重定向到文件。

通常,一些命令&> logfile.log

或某些变体...


这只是部分答案,OP希望查看日志,以防万一出错。
Tensibai

我不是这个问题的部分答案。对于shell脚本来说很好,但是对ansible中的编码没用。
小鸡

@chicks我认为这可能是ansible中“ shell”方法的有效解决方法(我不太了解)
Tensibai 2015年

-2

Tee将是一个非常简单的日志记录工具,您可以参考以下命令。

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2
1.这会影响整个运行,而不仅仅是一项任务。2.如果要将其stdout重定向到文件,则没有必要通过tee进行管道传输;那不是您使用命令的方式。3.如果您正确使用tee,它将仍然将所有垃圾邮件输出到控制台,而OP则不需要。
莫妮卡·塞利奥(Monica Cellio)的抵制SE,2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.