您是正确的,执行模块和状态模块之间存在显着差异。不幸的是,术语模块有点过载。
执行模块是发送到 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"