Você pode fazer algum truque e validar o arquivo colocado como (ideia emprestada do link ):
validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'
Eu tenho um único servidor com provisionamento Ansible executando vários sites.
As tarefas do My Ansible são mais ou menos como:
- 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
Gostaria de usar o parâmetro validate
no módulo de modelo da Ansible para chamar nginx -t
e garantir que minhas novas configurações sejam sintaticamente válidas. Funciona para o nginx.conf principal:
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
owner=root group=root mode=0444
validate="/usr/sbin/nginx -c %s -t"
Mas parece que não há mudanças nos arquivos de configuração específicos do site. Colocar validate
nos modelos específicos do site não funciona, pois eles precisam ser agrupados em uma diretiva http
para serem válidos.
O que posso fazer para verificar a validade desses arquivos específicos do site?
Você pode fazer algum truque e validar o arquivo colocado como (ideia emprestada do link ):
validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'
Não faz sentido chamar diretamente validate
em um arquivo incluído em seu arquivo de configuração principal nginx porque a validade das diretivas em um determinado arquivo de configuração pode depender do resto de seus arquivos de configuração (por exemplo, você tem dois arquivos de configuração que declaram o mesmo bloco de servidor, etc.).
Você sempre deve chamar nginx -t
no arquivo de configuração principal e não em uma de suas subpartes sempre que quiser validar a alteração de configuração do nginx.
Eu usei uma abordagem semelhante à resposta aceita levando em conta as preocupações da outra resposta.
Eu criei esta essência para esse fim.
A idéia é copiar todo o diretório /etc/nginx
para um diretório temporário, alterar um arquivo do parâmetro %s
e testar a configuração principal do nginx em busca de problemas. Se você assumir que inicialmente a configuração do nginx é válida e todas as tarefas que modificam a configuração do nginx usam isso para validar, então eu acho que não haveria nenhum problema.
Como um forro, ficaria assim:
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'
Aqui está uma maneira mais direta que funciona pelo menos com o Ansible 2.5:
- name: Verify Nginx config
become: yes
command: nginx -t
changed_when: false
Ele executa o equivalente a sudo nginx -t
e verifica sua saída. Se houver um erro na configuração do nginx, ele retornará diferente de zero e a tarefa Ansible poderá gerar um erro ( changed_when
).
Se você instalou o Nginx como um usuário, basta remover o become
, embora eu ache que ainda funcionaria mesmo com ele.