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

这会向控制台生成大量输出,因此我将no_log: True设置为

。但是,当失败时,我想要要查看日志!

如何将该特定任务日志保存到文件而不是控制台?

评论

您正在使用命令模块吗?

一个想法(更多黑客技巧)是将日志写到某个外部文件,然后在其后执行一个任务,该任务利用条件为fail_when的条件,并删除日志文件(如果有)。任务成功:)

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

@hvindin在ansible-playbook命令后放入-vvv以获取详细的日志。

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

#1 楼

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

一种方法是将日志写到某个外部文件,然后执行一个任务,该任务使用条件为when_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


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

评论


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

– hvindin
17年6月6日在13:43

#2 楼

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

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 楼

我通过在no_log-task中添加

ignore_errors: true
register: results


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

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


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

#4 楼

当我有一条命令要执行并希望仅在失败的情况下获取日志时,该怎么办如下(由/bin/sh -c '...'之类的外壳命令作为前缀,以防启动器不使用system调用或直接执行命令而无需shell):
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的功能,但具有可与任何配置管理系统一起非常轻便的优点,从而能够显示命令标准输出。

评论


我喜欢这个答案,但我认为>和&被交换了。您是说“命令2>&1 ...”而不是“命令2>&1 ...”吗?

–贾斯汀·沃伯(Justin Wrobel)
20年7月29日在18:27

您说得对,我当时可能很快就输入了。感谢您的注意

–滕西拜
20年7月30日在6:52

可悲的是,我无法在Ansible中使用它。

–贾斯汀·沃伯(Justin Wrobel)
20年7月31日在18:35

#5 楼

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

some command 2> error.log

但是我不认为这是情况。

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

ie。

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

#6 楼

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

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

或某些变体。 ..

评论


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

–滕西拜
17年4月4日在10:13

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

–小鸡
17年4月4日在12:01

@小鸡我认为这可能是ansible中'shell'方法的有效解决方法(我不太了解)

–滕西拜
17年6月6日在14:13

#7 楼

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"
}


评论


1.这会影响整个运行,而不仅仅是一项任务。 2.如果要将其stdout重定向到文件,则没有必要通过tee进行管道传输;那不是您使用命令的方式。 3.如果您正确使用tee,它将仍然将所有垃圾邮件输出到控制台,而OP则不需要。

–熊佳亚诺夫
17年3月3日在16:13