我有一个自定义模块,它具有可以在我的状态下使用的功能,就像这样
{% 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_pillar
salt-master 配置中的选项以配置ext_pillar
要运行的接口。
有关可用的 ext_pillar 函数的完整列表,请参阅:https://github.com/saltstack/salt/tree/develop/salt/pillar