(这是我在盐用户组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”要求之间重新启动。目前,状态失败,我们手动重启,然后重新运行状态,它的工作原理。当然,我们想省略手动重启步骤。
是否有解决此类问题的常见模式?
答案 0 :(得分: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 %}
然后多次运行高位状态或在你的minion的配置中设置以下内容以在启动时运行高态。
startup_states: highstate
答案 1 :(得分: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
应该很好地工作。