如何解决如何在pyinfra中包含自定义模块?
我正在使用pyinfra
设置一些文件。我想知道放置自定义模块的最佳位置。
示例
给出一个自定义事实,如果系统不是无头的,则返回True:
class HasGui(FactBase):
default = list
command = 'ls /usr/share/xsessions/*.desktop || true'
def process(self,output):
return output
问题
我该放在哪里?我想我可以将此代码段直接编码到“操作”文件中,但是如果我想在多个模块中重用此代码怎么办?如何将其抽象到一个单独的模块中或从API中访问它?
在data can be shared across modules期间,推荐的layout似乎不容易允许自定义模块挂接到API。
方法
- 我试图制作一个单独的任务级模块,但是在命令行调用时无法识别。
- 万不得已的方法是将路径添加到
sys.path
,但我希望使用更简洁的选项。
解决方法
此bug建议可以从位于next to "deploy" files的顶级config.py
文件中检测到自定义事实。
代码
一个自定义事实,已编码到配置中(可选)。另请参见示例layout:
# config.py
from pyinfra.api import FactBase
class HasGui(FactBase):
default = list
command = 'ls /usr/share/xsessions/*.desktop || true'
def process(self,output):
return output
自定义事实子类为FactBase
的子类时,它将添加到facts index中。您可以通过snake-cased attributes访问它们:
# tasks/operation.py
from pyinfra import host
if host.fact.has_gui:
# Insert operation
...
演示
在命令行中运行。
> pyinfra @local tasks/operation.py
[@local] Successful: 1 Errors: 0 Commands: 1/1
> pyinfra @<server> tasks/operation.py
[@local] Successful: 0 Errors: 0 Commands: 1/1
注意:尾随|| true
可以防止pyinfra在失败时出错。尽管继续存在,但故障似乎仍在内部处理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。