当我运行ansible dnf模块时,dnf通过logging
模块写入的消息似乎不会转到任何地方。为什么会这样?你知道吗
我有一个呼叫链,比如:
ansible(python3)->;ansible dnf模块->;import dnf
。。。->;dnf插件etckeeper dnf
当前版本的etckeeperdnf继续运行etckeeper
,使用os.system()
。所以它写入stdout和confuses ansible。我假设这是etckeeperdnf中的一个错误。听起来像是另一个类似于dnf的插件,我不一定能修复。你知道吗
Ansible希望能够控制stdout/stderr,而不受库代码的干扰,这似乎是合理的。你知道吗
因此,我修补了etckeeperdnf,并将它的stdout+stderr有效地连接到pythonlogging
模块。这正是我想要的。这是一个很好的解释。而dnf
命令仍然显示所有etckeeper消息。(它们现在也被复制到/var/log/dnf.log
)。你知道吗
但是现在我的阅读理解有问题。
当我运行ansible dnf模块时,dnf通过logging
模块写入的消息(包括来自etckeeper dnf的消息)似乎不会转到任何地方。你知道吗
这不是我的零钱,不是我的错,也不是我需要的东西。我甚至测试了如果etckeeper失败会发生什么:etckeeperdnf只是继续,所以Ansible不会显示任何关于它的警告(除非我故意破坏Ansible)。你知道吗
但我不禁对任何警告信息都将丢失的想法感到不安。你知道吗
我确保使用dnfpluginscore.logger.error()
和.info()
进行测试,但在这两种情况下我都看不到消息。你知道吗
logging
模块的默认配置是写入stderr。dnf
模块不会对其进行任何配置,除非您使用dnf.cli.BaseCli
。Ansible模块dnf.py
不使用dnf.cli
中的任何内容,也不使用logging
执行任何操作。基类AnsibleModule
也不使用python logging
;它有自己独立的.log()
方法。你知道吗
那么,为什么用.error()
编写的消息不会出现在Ansible模块输出管道上,并再次中断Ansible呢?你知道吗
原来的人把它弄坏了。然而,我们确定python
logging
模块写入stderr。你知道吗如果查看链接中的输出,Ansible将} module )。你知道吗
module_stdout
和module_stderr
分开。通常它只是忽略module_stderr
;它只在MODULE FAILURE
的情况下显示它。(尽管其他一些模块并不总是分开stdout/stderr,e.g. the Ansible ^{因此,我仍然认为etckeeper dnf提议的变化是合理的。不管Ansible dnf模块是如何故意这样设计的,依赖这种特定的行为似乎是相当合理的。更改后的代码不太可能被Ansible dnf模块中的未来更改破坏。你知道吗
我要注意的是,当您点击
MODULE FAILURE
时,module_stderr
只显示dnf的错误消息。您看不到来自loglevel INFO或以下的任何消息,即dnf通常的非错误、非交互输出。你知道吗(如果在使用etckeeper dnf时将etckeeper失败视为致命的,那么使用
.info()
记录所有etckeeper输出可能不是一个好主意。Ansible将丢失来自etckeeper的原始错误消息(并且错误消息不会记录在其他任何地方)。你知道吗但是,我在攻击etckeeper后测试了系统以返回
EXIT_FAILURE
。IIRC,dnf继续,无论是否出现任何etckeeper故障。总的来说,Ansible不会给您任何关于运行etckeeper失败的信息,不管我如何记录错误。一般来说,分别处理stdout
和stderr
消息更为复杂,而且会对消息的顺序产生奇怪的影响。所以我遵循了K.I.S.S.原则:-)。你知道吗或者更笼统地说:
默认情况下,在loglevel INFO和以下级别编写的
logging
消息将毫无用处。日志级别警告和更高级别的消息将转到stderr。它们不会干扰Ansible模块的正常运行。在正常的Ansible模块操作中,即使这些消息也不会去任何地方。你知道吗如果存在
MODULE FAILURE
—即模块崩溃或未生成Ansible可以按预期解析的JSON输出—Ansible将显示module_stderr
,其中仅包含日志级别或更高级别的logging
消息警告。你知道吗相关问题 更多 >
编程相关推荐