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

问题描述 投票:0回答:2

我最近编写了一个盐状态,它通过支柱中的一些静态变量处理许多服务器的 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 的方法。

这可能吗?

nginx salt-stack
2个回答
3
投票

让重新加载状态监视配置测试状态;让 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/*

0
投票

对于像 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
© www.soinside.com 2019 - 2024. All rights reserved.