【问题标题】:Reload nginx config from salt state, only if the configtest passes仅当 configtest 通过时才从 salt state 重新加载 nginx 配置
【发布时间】:2016-05-05 17:45:35
【问题描述】:

我最近编写了一个 salt state,它通过柱子中的一些静态变量处理多个服务器的 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 通过,它将重新加载。

但是,我希望仅当任一配置文件已更改 并且 配置测试通过,或者如果 nginx 更改 并且 配置测试通过时,才会重新加载。我知道如果 ALL 的事情都是真的,我可以使用 onlyif 来运行一个状态,并且根据经验,你可以多次使用相同的方法(所以我不能有 3 个不同的 onlyif - 正确如果我错了,我)。

但只有在配置文件已更改(或 nginx 已更新)且 configtest 已通过时,我看不到任何重新加载 nginx 的方法。

这可能吗?

【问题讨论】:

  • 我已经更新了我的答案;看来您需要使用 module.wait 而不是 module.run 才能使 watch 属性按预期工作。抱歉,我第一次没听懂。

标签: nginx salt-stack


【解决方案1】:

让重载状态观察配置测试状态;让 config-test 状态观察配置文件状态和 pkg 状态。测试只有在发生变化时才会运行,并且只有在测试运行并通过时才会重新加载。

警告:从结构上讲,这是可行的,但我从未使用过 nginx.configtest,所以我不能保证它会按照你的想法行事。

您还需要使用 module.wait 而不是 module.run; watch 语句不适用于 .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/*

【讨论】:

  • 谢谢,我试试看!
  • 感谢您的建议,我已根据您的建议更新了问题。不确定我对 for 循环所做的操作是否会导致以下部分不起作用。非常感谢任何进一步的建议!
  • 再次感谢,我明天早上试试!
猜你喜欢
  • 2014-02-13
  • 2022-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多