这里有些新鲜的东西。我设置了盐,并设法使所有工作正常进行。设置完成后,我决定尝试制作小的状态文件,然后从另一个状态文件运行它们。主要原因是易于排除故障/更改小文件而不是排除大型状态文件。不幸的是,在顶级文件之外,我还没有成功地从另一个州调出一个州。
例如,假设我有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不可用,这使我认为这是不可能的,或者我正在做错事。
可以做到吗?如果是这样,怎么办?如果没有,也许我会为此提出功能请求,因为这似乎很有用。
答案 0 :(得分:0)
听起来state modules和execution modules混合时可能是您写states时出现的问题。
简述,“状态”是您编写的声明性文件(foo.sls
,bar.sls
),“状态模块”是您在这些状态中列出的指令(例如pkg.installed
),和“执行模块”提供了salt实际知道如何运行的命令(state.apply
,test.ping
等)。
state.apply
只是执行模块,它知道如何解释状态。可能会有助于注意,文档中state.apply
的完全限定名称(或者如果您浏览salt source tree)实际上是salt.modules.state.apply
,而pkg.installed
是{{3} }。尽管存在例外,但是modules
名称空间中的模块通常无法从states
名称空间访问,反之亦然。当执行模块和状态模块共享虚拟名称(例如,虚拟名称)时,知道完整的名称空间也是必要的区别。 test
以salt.states.pkg.installed
和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
现在,您可以只将- foo
包含在top.sls
中,也可以运行salt '<tgt>' state.apply foo test=True
,您将看到package.bar
也将被应用。
salt文档还包括标题为include的部分,该部分讨论了如何使用include
和extend
将多个状态粘合在一起。
出于组织目的拆分SLS也是Moving Beyond a Single SLS
的常见用法作为一个简短的说明,有 种状态可以向另一个方向发展,并允许您从SLS内部运行执行模块。有几个例子是init.sls
和salt.states.module.run
,尽管它们的用途远比您想做的要专门。