从salt状态重新加载nginx配置,仅当测试通过时

vof42yt1  于 2023-11-17  发布在  Nginx
关注(0)|答案(2)|浏览(127)

我最近写了一个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已经更新),并通过了测试。
这可能吗?

8qgya5xd

8qgya5xd1#

让reload状态监视config-test状态;让config-test状态监视configfiles状态和pkg状态。只有在发生变化时,测试才会运行,只有在测试运行并通过时,才会发生reload。
警告:从结构上讲,这是可行的,但我从来没有使用过nginx. nginx测试,所以我不能保证它的行为像你想的那样。
您还需要使用模块.wait而不是module.run; watch语句不适用于. run. Reference 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/*

字符串

k2arahey

k2arahey2#

对于像ssh这样没有salt模块方法的服务,如.configtest,可以手动完成,如下所示:

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

字符串

相关问题