15

(这是我在 salt-users 组 FWIW 上提出的问题的副本)

我需要编写一个状态来安装一些 Windows 服务器功能,重新启动 minion,然后安装更多软件。似乎所有部分都在那里(cmd.wait,system.reboot),但我无法连接这些点。

例如,我有一个“网络服务器”状态,应该在机器上安装 IIS。它需要启用一些服务器功能,重新启动(因为 Windows),然后继续。我们使用一个名为“website”的自定义模块来完成此操作,它可以让我安装一个网站,以及另一个用于安装应用程序池的模块。我们的状态文件看起来像这样:

my_website:
  website.installed:
    - name: example.com 
    - version: alpha-1.0.0
        - type: Website
        - bindings:
           - hostheader: localhost
           - port: 1234
        - installdir: c:\\wwwroot\\example.com
        - apppool: static
    - require:
          - sls: serverstate.webserver
          - sls: apppool.static

上面的效果很好,除了我们需要在“serverstate.webserver”和“apppool.static”要求之间重新启动。就目前而言,状态失败,我们手动重新启动,然后重新运行状态并且它可以工作。自然,我们想省略手动重启步骤。

是否有解决此类问题的通用模式?

4

2 回答 2

17

我过去遇到过这种情况。为了获得所需的行为,我所做的是使用 jinja 在运行时决定是否需要运行 sls 文件的一部分。我通过让每个需要重新启动的部分在成功后设置一个自定义粒度来做到这一点。然后在接下来的运行中,它将跳过已经完成的部分。

这是一个示例 sls 文件。

{% if grains.get('myapp_done') != 'completed' %}

myapp:
  pkg.installed:
    - source: salt:/windows/myapp.exe

myapp_done:
  module.run:
    - name: grains.setval
    - key: myapp
    - val: complete

system.reboot:
  module.run:
    - watch:
      - pkg: myapp

{% endif %}

{% if grains.get('myotherapp_done') != 'completed' %}

myotherapp:
  pkg.installed:
    - source: salt:/windows/myotherapp.exe

myotherapp_done:
  module.run:
    - name: grains.setval
    - key: myotherapp
    - val: complete


system.reboot:
  module.run:
    - watch:
      - pkg: myotherapp

{% endif %}

然后多次运行 highstate 或在你的 minion 配置中设置以下内容以在启动时运行 highstate。

startup_states: highstate
于 2014-09-08T19:22:29.037 回答
0

这可能是在上述答案之后添加的功能,但这里有一个对我有用的示例:

/boot/cmdline.txt:
  file.managed:
    - source: salt://cmdline.txt
    - user: root
    - group: root
    - mode: 755
    - backup: minion

system.reboot:
  module.run:
    - onchanges:
      - file: /boot/cmdline.txt

onchanges必要条件将仅system.reboot在依赖项更改时运行。这就是我想要的依赖;如果 cmdline.txt 发生变化,我需要重新启动。

如果未来的状态需要运行或依赖于原始帖子描述中提到的重新启动,那么Utah_Dave的使用想法

startup_states: highstate

应该工作得很好。

于 2018-10-18T16:00:50.237 回答