背景
听起来问题可能源于在您编写states 时混合state modules 和execution modules。
简要回顾一下,“状态”是您编写的声明性文件(foo.sls、bar.sls),“状态模块”是您在这些状态中列出的指令(例如 pkg.installed),而“执行模块”提供salt 实际上知道如何运行的命令(state.apply、test.ping 等)。
state.apply 只是知道如何解释状态的执行模块。请注意,文档中的 state.apply 的完全限定名称(或者如果您浏览 salt source tree)实际上是 salt.modules.state.apply,而 pkg.installed 是 salt.states.pkg.installed。 modules 命名空间中的模块通常不能从 states 命名空间访问,反之亦然,但也有例外。当执行模块和状态模块共享一个虚拟名称时,了解完整的命名空间也是必要的区别,例如test 同时作为 salt.modules.test 和 salt.states.test 存在。
解决方案
如果我理解正确,您可能希望 include 彼此之间的状态文件。
例如,假设您有以下文件夹结构:
$ tree srv
srv
└── salt
├── foo.sls
└── packages
└── bar.sls
而bar.sls有以下内容
# bar.sls
packages_bar_install_fun:
pkg.installed:
- pkgs:
- cowsay
- fortune
- sl
到 include bar.sls 到 foo.sls 你只需要使用点符号来引用它,这取决于你的文件夹结构
# foo.sls
include:
- packages.bar
foo_another_example_state:
test.show_notification:
- text: |
foo.sls can have other states inside of it,
though you may need to use `require` if you want
them interspersed between multiple includes
现在您可以在您的top.sls 中包含- foo,或者运行salt '<tgt>' state.apply foo test=True,您应该会看到package.bar 也将被应用。
salt 文档还包括一个标题为 Moving Beyond a Single SLS 的部分,其中讨论了使用 include 和 extend 将多个状态粘合在一起。
出于组织目的拆分 SLS 也是 init.sls 的常见用途
简而言之,有一些状态相反,允许您从 SLS 中运行执行模块。一些例子是salt.states.module.run 和salt.states.saltmod.state,尽管它们的用途远比你想要做的更专业。