You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible过滤器插件中正确引入本地工具类库?

Ansible过滤器插件共享工具类的正确引入方式

针对Ansible 2.9/2.13版本,解决过滤器插件间共享函数的问题,可采用以下两种可靠方案:

方案一:在filter_plugins目录下保留tools.py,添加空FilterModule类

Ansible会自动加载filter_plugins目录下的所有.py文件作为过滤器插件,要求每个文件必须包含FilterModule类。只需给tools.py添加一个空的FilterModule实现,即可避免报错,同时让其他过滤器脚本正常导入共享函数:

  1. 编写filter_plugins/tools.py:
def shared_function(data):
    # 这里是你的共享逻辑
    return processed_data

class FilterModule:
    def filters(self):
        return {}  # 返回空字典,表明该文件无对外提供的过滤器
  1. 在其他过滤器脚本(如filter_plugins/my_filter.py)中导入:
from .tools import shared_function

class FilterModule:
    def filters(self):
        return {
            'my_custom_filter': my_filter_func
        }

def my_filter_func(input_data):
    # 调用共享函数
    return shared_function(input_data)

方案二:在filter_plugins下创建子目录存放工具类

Ansible不会递归加载filter_plugins的子目录,因此可以创建子目录(如utils)存放工具文件,避免被当作过滤器插件扫描:

  1. 调整目录结构:
你的剧本目录/
└── filter_plugins/
    ├── utils/
    │   └── tools.py
    ├── filter_a.py
    └── filter_b.py
  1. 在filter_plugins/utils/tools.py中编写共享函数(无需FilterModule):
def shared_function(data):
    # 共享逻辑实现
    return result
  1. 在过滤器脚本中导入:

    • 方法A:使用相对导入(需在filter_plugins目录下创建空的__init__.py,将其变为Python包):
    from .utils.tools import shared_function
    
    class FilterModule:
        def filters(self):
            return {
                'filter_a': filter_a_func
            }
    
    def filter_a_func(data):
        return shared_function(data)
    
    • 方法B:手动添加工具目录到Python路径(无需__init__.py):
    import sys
    from os.path import dirname, abspath
    
    # 将utils目录加入Python搜索路径
    sys.path.insert(0, abspath(dirname(__file__) + '/utils'))
    
    from tools import shared_function
    
    class FilterModule:
        def filters(self):
            return {
                'filter_a': filter_a_func
            }
    
    def filter_a_func(data):
        return shared_function(data)
    

原方案失败原因说明

  • 方案1失败:filter_plugins下的.py文件会被Ansible当作过滤器插件加载,缺少FilterModule类会触发报错。
  • 方案2失败:library目录是Ansible存放执行模块的路径,默认不会被加入Python的模块搜索路径,因此无法直接导入其中的文件。

内容的提问来源于stack exchange,提问作者Johan G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:59:51