Salt Stack:在SLS中使用执行模块

时间:2013-12-25 13:42:36

标签: python service salt-stack

我在Salt文档中可以看到(例如here),支持两种主要类型的模块:状态模块执行模块(我知道还有渲染器,返回者等等。大多数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状态和执行模块时遇到了同样的问题。但是当我在minion上运行以下命令时(如文档中所示),它成功了:

$ sudo salt-call service.restart selenium-node

1 个答案:

答案 0 :(得分:45)

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

执行模块是发送给Salt Minion以立即执行的命令。例如“install apache”或“restart memcached”。

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

现在要像你在问题中提到的那样重新启动selenium-node,你会想让你的服务看到一些东西;通常是包更改和/或配置更改。这样Selenium只会在需要时重新启动。这是一个粗略的例子。我不熟悉selenium-node的安装,所以请考虑以下sls文件示例。我假设selenium-node可以从系统的软件包repo中安装。

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文件时如何重新启动服务:

cat /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"
相关问题