我的一项艰巨的任务是使用导入Oracle数据库impdp
。
这会产生很多输出到控制台,所以我已经设置了no_log: True
。
但是,如果失败,我想查看日志!
如何使此特定任务记录到文件而不是控制台?
failed_when
条件,并删除日志文件(如果有)。任务成功:)
-vvv
的ansible-playbook
命令后放置。
我的一项艰巨的任务是使用导入Oracle数据库impdp
。
这会产生很多输出到控制台,所以我已经设置了no_log: True
。
但是,如果失败,我想查看日志!
如何使此特定任务记录到文件而不是控制台?
failed_when
条件,并删除日志文件(如果有)。任务成功:)
-vvv
的ansible-playbook
命令后放置。
Answers:
[将我的评论转换为答案]
一种实现方法是将日志写入某个外部文件,然后在其后执行一个任务,该任务利用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
注意:这可能不是解决问题的最佳方法。但是,这是一个黑客,它帮助我进行了日志记录和监视。
我认为您要做的就是注册所需的每个命令的输出(将其存储在变量中),然后将变量简单地转储到文件中。这样一来,您以后就可以查看它。
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 }}
我正在使用的示例是从这里开始
我通过添加解决了这个问题
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输出输出到文件,通过此解决方案还包含失败任务的日志。
当我有一个要执行的命令并希望仅在失败的情况下获取日志时,我要做的事情如下(由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的最惯用的方法,但是它的优点是可以随便携带任何配置管理系统,并能够显示命令标准输出。
假设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
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"
}