这里对盐有点陌生。我设置了盐,并设法让一切工作得很好。设置完成后,我决定尝试制作小状态文件并从另一个状态文件运行这些文件。主要原因是易于故障排除/更改小文件与对大型状态文件进行故障排除。不幸的是,在顶部文件之外,我还没有成功地从另一个状态调用一个状态。
例如,假设我有 foo.sls 和 bar.sls,而 bar.sls 是一个正确安装软件包的状态。我已经尝试了以下方法。
#foo.sls
packages:
state.apply:
- source: salt://packages/bar.sls
也
#foo.sls
packages/bar.sls:
state.apply
而且
#foo.sls
state.apply:
- source: salt://packages/bar.sls
还有一些我现在不记得了。
不过,大多数时候我尝试过,我都会收到一个错误,指出 state.apply 不可用,导致我相信这要么是不可能的,要么我做错了。
这能做到吗?如果是这样,如何?如果没有,也许我会为此提交功能请求,因为它似乎很有用。
背景
听起来您的问题可能源于在编写状态时混合状态模块和执行模块。
简要回顾一下,"状态"是你编写的声明性文件(foo.sls
,bar.sls
(,"状态模块"是你在这些状态中列出的指令(例如pkg.installed
(,而"执行模块"提供了 salt 实际上知道如何运行的命令(state.apply
、test.ping
等(。
state.apply
只是知道如何解释状态的执行模块。请注意,文档中state.apply
的完全限定名称(或者如果您浏览盐源树(实际上是salt.modules.state.apply
,而pkg.installed
是salt.states.pkg.installed
。modules
命名空间中的模块通常不能从states
命名空间访问,反之亦然,但也有例外。当执行模块和状态模块共享虚拟名称时,知道完整的命名空间也是一个必要的区别,例如test
既以salt.modules.test
存在,又以salt.states.test
的形式存在。
溶液
如果我理解正确,您可能希望将状态文件包含在彼此中。
例如,假设您具有以下文件夹结构:
$ 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
也会应用。
盐文档还包括一个名为"超越单个SLS"的部分,该部分讨论了使用include
和extend
将多个状态粘合在一起。
出于组织目的拆分 SLS 也是init.sls
的常见用途
作为简短的旁白,有一些状态会走向另一个方向,并允许您从SLS中运行执行模块。一些例子是salt.states.module.run
和salt.states.saltmod.state
,尽管这些用途比你看起来要做的要专业得多。