【问题标题】:How to include custom modules in pyinfra?如何在 pyinfra 中包含自定义模块?
【发布时间】:2020-10-02 02:30:59
【问题描述】:

我正在使用pyinfra 来配置一些文件。我想知道放置自定义模块的最佳位置。

示例

给定一个自定义事实,如果系统不是无头的,则返回 True

class HasGui(FactBase):
    default = list
    command = 'ls /usr/share/xsessions/*.desktop || true'

    def process(self, output):
        return output

问题

我把这个放在哪里?我想我可以将这个 sn-p 直接编码到一个“操作”文件中,但是如果我想在几个模块中重用这个代码怎么办?如何将其抽象为单独的模块或从 API 访问它?

虽然data can be shared across modules,推荐的layout 似乎不允许自定义模块挂接到API。

方法

  • 我尝试创建一个单独的任务级模块,但在命令行调用时无法识别。
  • 最后的手段可能是添加sys.path 的路径,但我更喜欢更简洁的选项。

【问题讨论】:

    标签: python provisioning pyinfra


    【解决方案1】:

    这个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
    

    注意:结尾的 || true 可防止 pyinfra 在失败时出错。尽管继续,但故障似乎是在内部处理的。

    当自定义事实子类化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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 2020-09-22
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多