我最近编写了一个salt状态,它通过支柱中的一些静态变量处理许多服务器的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状态下将此状态添加到监视器中,如果configtest通过则会重新加载。
但是,我希望只有当配置文件中的任何一个配置文件发生了更改 AND ,或者如果nginx更改了 AND 配置测试通过,我才会重新加载。我知道如果所有的事情都是真的,我可以使用onlyif来运行状态,并且从经验中你可以'有多种用途的相同方法(所以我不能有3种不同的唯一方法 - 如果我错了就纠正我。)
但是,如果配置文件已经更改(或者nginx已经更新)并且configtest已经过去,我也没有看到任何重新加载nginx的方法。
这可能吗?
答案 0 :(得分:1)
让重载状态观察配置测试状态;让config-test状态监视配置文件状态和pkg状态。只有在某些内容发生变化时才会运行测试,只有在测试运行并通过时才会重新加载。
警告:从结构上说这会起作用,但我从未使用过nginx.configtest,所以我不能保证它的行为与你的想法一致。
您还需要使用module.wait而不是module.run;观察声明不与.run合作。参考here。
这样就变成了:
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/*