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