如何在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在失败时出错。尽管继续存在,但故障似乎仍在内部处理。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...