【问题标题】:Call a salt state from another salt state从另一个盐州调用一个盐州
【发布时间】:2018-10-11 17:17:21
【问题描述】:

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

例如,假设我有 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 不可用,这让我相信这是不可能的,或者我做错了。

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

【问题讨论】:

    标签: salt-stack


    【解决方案1】:

    背景

    听起来问题可能源于在您编写states 时混合state modulesexecution modules

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

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

    出于组织目的拆分 SLS 也是 init.sls 的常见用途


    简而言之,一些状态相反,允许您从 SLS 中运行执行模块。一些例子是salt.states.module.runsalt.states.saltmod.state,尽管它们的用途远比你想要做的更专业。

    【讨论】:

    • 谢谢!这正是我试图找到的。 salt 的文档状态给我留下了深刻的印象……只是有时很难找到东西。
    • 没问题!我可以理解,我花了一段时间才真正将这种区别内化。我确实发现使用Zeal/Dash docsets 让我更容易找到自己的方式,并在我仍然熟悉自己的同时将执行和状态模块分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多