在ansible部署期间验证nginx.conf


11

我有一台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

我想使用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"

但这似乎并没有改变站点特定的配置文件。放置validate特定于站点的模板无效,因为需要将它们包装在http指令中才能生效。

我该怎么做才能检查这些特定于站点的文件的有效性?

Answers:



4

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

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


1
好。所以我想我需要说服ansible将所有内容捆绑在一起以进行验证吗?
艾琳致电

@ErinCall理想情况下,即使您的剧本在途中受到干扰,您的nginx配置也应保持完全有效。
迈克尔·汉普顿'18

3

考虑到其他答案的关注点,我使用了与接受的答案类似的方法。

为此目的创建了要点

想法是将整个/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'


1
我需要此解决方案而不是可接受的答案,因为我的Nginx conf包含fastcgi_params。
Yep_It's_Me

3

这是至少与Ansible 2.5兼容的更直接的方法:

- name: Verify Nginx config
  become: yes
  command: nginx -t
  changed_when: false

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

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


1
这是一个不好的例子,当template在Ansible中使用模块和validate选项时,您可以保证配置的有效性,但是如果您部署模板然后手动检查并失败,则仍然存在无效的问题。模板已部署,无需还原。
拉宾
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.