在ansible部署期间验证nginx.conf

Eri*_*all 16 nginx ansible

我有一个运行多个站点的 Ansible 配置的服务器。

我的 Ansible 任务大致如下:

- name: site nginx config
  template: src="nginx-site.conf.j2" dest=/etc/nginx/conf.d/{{item.name}}.conf
            owner=root group=root mode=0444
  with_items: sites
  notify: restart nginx

- name: nginx conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
  notify: restart nginx
Run Code Online (Sandbox Code Playgroud)

我想使用validateAnsible 模板模块的参数来调用nginx -t并确保我的新配置在语法上有效。它适用于主要的 nginx.conf:

  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
            validate="/usr/sbin/nginx -c %s -t"
Run Code Online (Sandbox Code Playgroud)

但它似乎没有对特定于站点的配置文件进行更改。放置validate特定于站点的模板不起作用,因为它们需要包含在http指令中才能有效。

我可以做些什么来检查这些特定于站点的文件的有效性?

小智 14

您可以在那里做一些技巧并验证放置的文件,例如(从https://gist.github.com/psd/5042334借来的想法): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'


小智 6

考虑到其他答案的担忧,我使用了类似于已接受答案的方法。

为此目的创建了这个要点

这个想法是将整个/etc/nginx目录复制到一个临时目录,从%s参数中更改一个文件并测试主要的 nginx 配置是否存在问题。如果您假设最初 nginx 配置是有效的,并且所有修改 nginx 配置的任务都使用它来验证,那么我想不会有问题。

作为一个班轮,它看起来像这样:

validate: bash -c 'NGINX_CONF_DIR=`mktemp -d`; cp -rTp /etc/nginx/ "$NGINX_CONF_DIR" && cp -Tp %s "$NGINX_CONF_DIR"/sites-enabled/new-site.conf && nginx -t -c "$NGINX_CONF_DIR"/nginx.conf'


Xav*_*cas 5

直接调用validate包含在 nginx 主配置文件中的文件是没有意义的,因为特定配置文件中指令的有效性可能取决于其他配置文件(例如,您有两个配置文件声明相同的服务器块等等)。

nginx -t每当您想验证任何 nginx 的配置更改时,您必须始终调用主配置文件而不是其子部分之一。


小智 5

这是一种更直接的方法,至少适用于 Ansible 2.5:

- name: Verify Nginx config
  become: yes
  command: nginx -t
  changed_when: false
Run Code Online (Sandbox Code Playgroud)

它运行相当于sudo nginx -t并检查其输出。如果 nginx 配置中有错误,它将返回非零值,并且 Ansible 任务将出现错误 ( changed_when)。

如果你以用户身份安装 Nginx,只需删除become,尽管我认为即使使用它它仍然可以工作。

  • 这是一个不好的例子,当使用 Ansible 中的 template 模块和 validate 选项时,你可以保证配置的有效性,但是如果你部署模板然后手动检查并失败,那么你仍然会遇到问题部署了无效模板,不需要恢复。 (5认同)