我最近编写了一个盐状态,它通过支柱中的一些静态变量处理许多服务器的 nginx 配置。我想将其推广到所有服务器,但在执行此操作之前,我想确保在将配置应用到服务器之前,它已首先经过测试。
Nginx 有一个内置的 configtest,我经常在命令行上使用它,我发现 salt 有一个 nginx 模块,可以用来运行 configtest。
我的状态文件中有以下内容:
reload-nginx:
service.running:
- enabled: True
- reload: True
- watch:
- pkg: nginx
- file: /etc/nginx/sites-available/*
- file: /etc/nginx/nginx.conf
如果配置文件更改,或者 nginx 安装升级/更改,这应该重新加载 nginx。我相信我可以使用状态文件中的以下内容运行配置测试(未经测试):
nginx-config-test:
module.run:
- name: nginx.configtest
我相信,如果我将此状态添加到 reload-nginx 状态下的手表中,如果配置测试通过,它将重新加载。
但是,我希望仅当其中一个配置文件已更改AND配置测试通过,或者nginx更改AND配置测试通过时才会重新加载。我发现如果 ALL 的事情都是 True,我可以使用 onlyif 来运行状态,并且根据经验,您可以多次使用同一方法(所以我不能有 3 个不同的 onlyif - 如果我错了,请纠正我) ).
但我没有看到只有在配置文件已更改(或 nginx 已更新)且配置测试已通过的情况下重新加载 nginx 的方法。
这可能吗?
让重新加载状态监视配置测试状态;让 config-test 状态监视配置文件状态和 pkg 状态。仅当发生更改时测试才会运行,并且仅当测试运行并通过时才会重新加载。
警告:从结构上讲,这是可行的,但我从未使用过 nginx.configtest,所以我不能保证它的行为符合你的想法。
您还需要使用 module.wait 而不是 module.run; watch 语句不适用于 .run。参考这里。
这样就变成:
reload-nginx:
service.running:
- name: nginx
- enable: True
- reload: True
- watch:
- module: nginx-config-test
nginx-config-test:
module.wait:
- name: nginx.configtest
- watch:
- file: /etc/nginx/sites-available/*
对于像 ssh 这样的服务,没有像
.configtest
这样的 salt 模块方法,可以像这样手动完成:
reload-sshd:
service.running:
- name: ssh
- reload: True
- enable: True
- watch:
- cmd: test-sshd-config
test-sshd-config:
cmd.wait:
- name: sshd -t
- stateful: True
- watch:
- file: /etc/ssh/sshd_config