从另一个盐状态调用盐状态

时间:2018-10-10 18:00:04

标签: salt-stack

这里有些新鲜的东西。我设置了盐,并设法使所有工作正常进行。设置完成后,我决定尝试制作小的状态文件,然后从另一个状态文件运行它们。主要原因是易于排除故障/更改小文件而不是排除大型状态文件。不幸的是,在顶级文件之外,我还没有成功地从另一个州调出一个州。

例如,假设我有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不可用,这使我认为这是不可能的,或者我正在做错事。

可以做到吗?如果是这样,怎么办?如果没有,也许我会为此提出功能请求,因为这似乎很有用。

1 个答案:

答案 0 :(得分:0)

背景

听起来state modulesexecution modules混合时可能是您写states时出现的问题。

简述,“状态”是您编写的声明性文件(foo.slsbar.sls),“状态模块”是您在这些状态中列出的指令(例如pkg.installed),和“执行模块”提供了salt实际知道如何运行的命令(state.applytest.ping等)。

state.apply只是执行模块,它知道如何解释状态。可能会有助于注意,文档中state.apply的完全限定名称(或者如果您浏览salt source tree)实际上是salt.modules.state.apply,而pkg.installed是{{3} }。尽管存在例外,但是modules名称空间中的模块通常无法从states名称空间访问,反之亦然。当执行模块和状态模块共享虚拟名称(例如,虚拟名称)时,知道完整的名称空间也是必要的区别。 testsalt.states.pkg.installedsalt.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的部分,该部分讨论了如何使用includeextend将多个状态粘合在一起。

出于组织目的拆分SLS也是Moving Beyond a Single SLS

的常见用法

作为一个简短的说明,有 种状态可以向另一个方向发展,并允许您从SLS内部运行执行模块。有几个例子是init.slssalt.states.module.run,尽管它们的用途远比您想做的要专门。