impdp
导入Oracle数据库。这会向控制台生成大量输出,因此我将
no_log: True
设置为。但是,当失败时,我想要要查看日志!
如何将该特定任务日志保存到文件而不是控制台?
#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
评论
您正在使用命令模块吗?一个想法(更多黑客技巧)是将日志写到某个外部文件,然后在其后执行一个任务,该任务利用条件为fail_when的条件,并删除日志文件(如果有)。任务成功:)
无论如何,为什么仍能在成功运行期间看到控制台输出?我没有看到配置,也没有想到在成功执行任务期间显示stdout,它应该出现[确定:主机名]。但是,当检测到错误时,输出将转储到ansible控制台(以及定义的任何ansible日志)中,您介意共享在常规成功运行期间为您提供较大stdout的配置吗?
@hvindin在ansible-playbook命令后放入-vvv以获取详细的日志。
注册变量似乎是最好的逻辑选择,请参阅我对您的回答的评论,以获取有关如何处理ansible触发命令的输出的意见。