从另一个盐状态调用一个盐状态
Call a salt state from another salt state
这里对盐有些陌生。我设置了 salt 并设法让一切都很好地工作。设置完成后,我决定尝试制作小型状态文件和 运行 来自另一个状态文件的文件。主要原因是 troubleshooting/changing 一个小文件比对一个巨大的状态文件进行故障排除更容易。不幸的是,在顶级文件之外,我没有成功地从另一个状态调用一个状态。
比如我有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 不可用,这让我相信这不可能,或者我做错了。
这能做到吗?如果是这样,如何?如果没有,也许我会为此提交一个功能请求,因为它看起来很有用。
背景
听起来问题可能源于混合 state modules and execution modules when you are writing your states。
简要回顾一下,"states" 是您编写的声明性文件(foo.sls
、bar.sls
),"state modules" 是您在这些状态中列出的指令(例如 pkg.installed
), 和 "execution modules" 提供 salt 实际上知道如何执行的命令 运行 (state.apply
, test.ping
, 等等).
state.apply
只是知道如何解释状态的执行模块。可能有助于注意文档中 state.apply
的完全限定名称(或者如果您浏览 salt source tree) is actually salt.modules.state.apply
, whereas pkg.installed
is salt.states.pkg.installed
. A module in the modules
namespace generally cannot be accessed from states
namespace and vice versa, though there are exceptions. Knowing the full namespace is also a necessary distinction when an execution module and a state modules share a virtual name, e.g. test
exists as both salt.modules.test
and 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
and salt.states.saltmod.state
,尽管这些示例的用途比您尝试做的要专业得多。
这里对盐有些陌生。我设置了 salt 并设法让一切都很好地工作。设置完成后,我决定尝试制作小型状态文件和 运行 来自另一个状态文件的文件。主要原因是 troubleshooting/changing 一个小文件比对一个巨大的状态文件进行故障排除更容易。不幸的是,在顶级文件之外,我没有成功地从另一个状态调用一个状态。
比如我有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 不可用,这让我相信这不可能,或者我做错了。
这能做到吗?如果是这样,如何?如果没有,也许我会为此提交一个功能请求,因为它看起来很有用。
背景
听起来问题可能源于混合 state modules and execution modules when you are writing your states。
简要回顾一下,"states" 是您编写的声明性文件(foo.sls
、bar.sls
),"state modules" 是您在这些状态中列出的指令(例如 pkg.installed
), 和 "execution modules" 提供 salt 实际上知道如何执行的命令 运行 (state.apply
, test.ping
, 等等).
state.apply
只是知道如何解释状态的执行模块。可能有助于注意文档中 state.apply
的完全限定名称(或者如果您浏览 salt source tree) is actually salt.modules.state.apply
, whereas pkg.installed
is salt.states.pkg.installed
. A module in the modules
namespace generally cannot be accessed from states
namespace and vice versa, though there are exceptions. Knowing the full namespace is also a necessary distinction when an execution module and a state modules share a virtual name, e.g. test
exists as both salt.modules.test
and 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
and salt.states.saltmod.state
,尽管这些示例的用途比您尝试做的要专业得多。