У меня есть один предоставленный 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
директиву, чтобы быть действительными.
Что я могу сделать, чтобы проверить правильность этих файлов, специфичных для сайта?
Нет смысла напрямую вызывать
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:
Он запускает эквивалент
sudo nginx -t
и проверяет свой вывод. Если в конфиге nginx есть ошибка, он возвращает ненулевое значение, и задача Ansible выдаст ошибку (changed_when
).Если вы установили Nginx как пользователь, просто удалите его
become
, хотя я думаю, что он все равно будет работать даже с ним.источник
template
модуля и опции проверки в Ansible у вас есть гарантия на действительность конфигурации, но если вы развернете шаблон, а затем выполните ручную проверку и потерпите неудачу, то у вас все еще будет проблема, что недопустимый Шаблон был развернут, и его не нужно возвращать.