Назад | Перейти на главную страницу

Проверить nginx.conf во время развертывания 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

Я бы хотел использовать validate параметр модуля шаблона Ansible для вызова 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 директива должна быть действительной.

Что я могу сделать, чтобы проверить действительность этих файлов для конкретного сайта?

Вы можете проделать там какой-нибудь трюк и проверить размещенный файл, например (идея заимствована из https://gist.github.com/psd/5042334): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'

Нет смысла напрямую звонить validate в файле, включенном в ваш основной файл конфигурации nginx, потому что действительность директив в конкретном файле конфигурации может зависеть от остальных ваших файлов конфигурации (например, у вас есть два файла конфигурации, которые объявляют один и тот же блок сервера и т. д.).

Вы всегда должны звонить nginx -t в основном файле конфигурации, а не в одной из его частей, когда вы хотите проверить любое изменение конфигурации nginx.

Я использовал подход, аналогичный принятому ответу, с учетом опасений другого ответа.

я создал это суть для этой цели.

Идея состоит в том, чтобы скопировать весь /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'

Вот более простой способ, который работает как минимум с Ansible 2.5:

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

Он запускает эквивалент sudo nginx -t и проверяет его вывод. Если в конфигурации nginx есть ошибка, он возвращает ненулевое значение, и задача Ansible выдает ошибку (changed_when).

Если вы установили Nginx как пользователь, просто удалите become, хотя, думаю, и с ним все равно заработало бы.