我最近写了一个salt state,它可以从pillar中的一些静态变量处理一些服务器的nginx配置。我想把它推广到所有的服务器,但是在我这样做之前,我想确保在配置应用到服务器之前,它已经被测试过了。
Nginx有一个内置的测试,我经常在命令行上使用,我发现盐有一个nginx模块,可以用来运行测试。
我在我的国家档案中有以下内容:
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状态下将此状态添加到watch中,如果测试通过,它将重新加载。
然而,我希望只有在配置文件发生更改且配置测试通过时,或者nginx发生更改且配置测试通过时,才能重新加载。我看到我可以使用onlyif来运行一个状态,如果ALL的事情都是True,根据经验,你不能多次使用同一个方法(所以我不能有3个不同的onlyif-如果我错了请纠正我)。
但是我没有看到任何方法来重新加载nginx,只有当配置文件已经改变(或nginx已经更新),并通过了测试。
这可能吗?
2条答案
按热度按时间8qgya5xd1#
让reload状态监视config-test状态;让config-test状态监视configfiles状态和pkg状态。只有在发生变化时,测试才会运行,只有在测试运行并通过时,才会发生reload。
警告:从结构上讲,这是可行的,但我从来没有使用过nginx. nginx测试,所以我不能保证它的行为像你想的那样。
您还需要使用模块.wait而不是module.run; watch语句不适用于. run. Reference here。
所以这就变成了:
字符串
k2arahey2#
对于像ssh这样没有salt模块方法的服务,如
.configtest
,可以手动完成,如下所示:字符串