首页 文章

如何在盐状态中重启?

提问于
浏览
12

(这是我在盐用户组FWIW上提出的问题的副本)

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

例如,我有一个“webserver”状态,应该在一台机器上安装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”要求之间重新启动之外,上述工作非常好 . 目前,状态失败,我们手动重启,然后重新运行状态,它的工作原理 . 当然,我们想省略手动重启步骤 .

是否有解决此类问题的常见模式?

2 回答

  • 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
    

    应该很好地工作 .

  • 15

    我过去遇到过这种情况 . 我所做的是为了获得所需的行为是使用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
    

相关问题