saltstack:在状态和支柱中使用 Python 模块

saltstack:在状态和支柱中使用 Python 模块

我有一个自定义模块,它具有可以在我的状态下使用的功能,就像这样

{% set myvar = salt['mymodule.myfunction']() %}

现在我想/需要在我的支柱中使用它。我尝试以相同的方式调用它,但出现了错误

Jinja variable 'salt.loader.LazyLoader object' has no attribute 'mymodule.myfunction'

有没有什么办法可以将此模块和功能声明为在支柱中有效?

谢谢

编辑

实际功能是一个简单的正则表达式,用于将 minion ID 转换为它的简短形式。我最终在 states 和 pillar 中用 Jinja 实现了实际功能,并且它有效。我想在 states 和 pillar 中使用它来加载 .sls 文件(如果存在),以便用每个 minion 的设置覆盖默认设置。

所以我的问题实际上已经解决了,但背后的问题:如何拥有一个可以在状态和支柱中加载的(执行)模块,我认为仍然相关。我可能会重命名我的问题。

答案1

Pillar 编译发生在 master 上,而不是 minion 上。这意味着仅在salt://...树中可用的模块(例如salt://_modules)不能在 Pillar 文件中使用。

为了在 pillar 文件中使用该模块,还必须将其提供给 master。在默认配置中,这可以通过将模块复制到来实现/var/cache/salt/master/extmods/modules。为了避免必须在两个位置维护模块,可以简单地添加一个符号链接:

ln -s /srv/salt/_modules /var/cache/salt/master/extmods/modules

extension_modules根据和module_dirs选项的值/etc/salt/master,必须使用的实际路径可能会有所不同。

答案2

这可能不完全是正确的解决方案,但 Salt 中有一个机制,可以通过调用来生成支柱数据外支柱接口。这允许您使用在 salt 之外定义的任何信息。请注意,您需要更新ext_pillarsalt-master 配置中的选项以配置ext_pillar要运行的接口。

有关可用的 ext_pillar 函数的完整列表,请参阅:https://github.com/saltstack/salt/tree/develop/salt/pillar

相关内容