25

就我在 Salt 文档中看到的(例如此处)而言,支持两种主要类型的模块:状态模块执行模块(我知道还有渲染器、返回器等)。大多数 SLS 文件示例包含仅与状态模块相关的语句(在 salt.state 命名空间下),而对于执行模块,仅显示命令行示例。例如,我们有两个名为“service”的模块:salt.states.service 和 salt.modules.service。现在我在使用 SLS 文件中的执行模块时遇到问题,似乎它们根本不可用,或者我缺少使它们可用的东西。我的问题是:是否可以在 SLS 文件中使用执行模块,例如如何使用 salt.modules.service.restart 函数在 Ubuntu 机器上重新启动服务?我也不清楚这些模块类型之间的区别。

我的服务名称是 selenium-node ,我尝试了几种组合,但都失败了:

# First attempt:
selenium-node:
  service.restart

# Another one:
service:
  - restart
  - name: selenium-node

# Or even:
selenium-node:
  service:
    - restart

在使用 git state 和执行模块时,我遇到了同样的问题。但是,当我在 minion 上运行以下命令时(如文档中所示),它会成功:

$ sudo salt-call service.restart selenium-node
4

1 回答 1

50

您是正确的,执行模块状态模块之间存在显着差异。不幸的是,术语模块有点过载。

执行模块是发送到 Salt Minion 以立即执行的命令。例如“安装 apache”或“重启 memcached”。

状态模块告诉 Salt Minion 最终结果或“状态”应该是什么。例如“确保已安装 apache”或“确保此特定配置文件存在于文件系统中”。重要的区别是状态模块会在执行任何操作之前检查系统以查看机器是否符合所需的状态。因此,在“确保已安装 apache”的情况下,Salt Minion 将检查是否已安装 Apache,如果已安装 Apache,则不执行任何操作。如果不是很明显,Salt 会在需要时安装 Apache。

现在要像您在问题中指出的那样重新启动 selenium-node,您需要让您的服务监视一些东西;通常是包更改和/或配置更改。这样 Selenium 只会在需要时重新启动。这是一个粗略的例子。我不熟悉 selenium-node 的安装,因此请以以下 sls 文件为例。我假设 selenium-node 可以从您系统的软件包仓库中安装。

cat /srv/salt/selenium-node.sls

selenium-node:
  pkg:
    - installed
  service:
    - running
    - watch:
      - pkg: selenium-node
      - file: /etc/selenium-node.conf
  file:
    - managed
    - name: /etc/selenium-node.conf
    - source: salt://selenium/selenium-node.conf # assuming config located at /srv/salt/selenium/selenium-node.conf  on the Salt Master

在这里,我们在“selenium-node”ID 声明下有 3 个状态。我们正在管理系统包、服务和配置文件。您会注意到该服务正在监视 selenium-node 包和配置文件。默认情况下,当服务正在监视某事时,该服务将在“被监视”的事物报告更改时重新启动。

这通常是您在使用 Salt States 时想要处理导致服务重新启动的方式。这样服务只会在需要时重新启动。这有助于您的 Salt States 是幂等的,并且仅在实际需要时才对您的系统进行更改。

现在,回答你问题的第二部分。是的,可以从状态或 sls 文件中运行执行模块。您可以通过“module.run”状态完成此操作。文档在这里:http ://docs.saltstack.com/ref/states/all/salt.states.module.html#module-salt.states.module

以下是每次运行此状态或 sls 文件时导致服务重新启动的方式:

猫 /srv/salt/selenium/selenium-restart.sls

restart_selenium:
  module.run:
    - name: service.restart
    - m_name: selenium-node   # m_name gets passed to the execution module as "name"
于 2013-12-26T17:18:53.767 回答