仅当configtest通过时,才从盐状态重新加载nginx配置

时间:2016-05-03 16:18:23

标签: nginx salt-stack

我最近编写了一个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的方法。

这可能吗?

1 个答案:

答案 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/*