Eu tenho um único servidor provisionado pelo Ansible executando vários sites.
Minhas tarefas Ansible se parecem com:
- 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
Eu gostaria de usar o validate
parâmetro para o módulo de modelo do 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 não captar alterações nos arquivos de configuração específicos do site. Colocar validate
os modelos específicos do site não funciona, pois eles precisam ser agrupados em uma http
diretiva para serem válidos.
O que posso fazer para verificar a validade desses arquivos específicos do site?
Não faz sentido chamar diretamente
validate
um arquivo incluído no arquivo de configuração principal do nginx porque a validade das diretivas em um arquivo de configuração específico pode depender do restante dos arquivos de configuração (por exemplo, você tem dois arquivos de configuração que declaram o mesmo bloco de servidor etc).Você deve sempre chamar
nginx -t
o arquivo de configuração principal e não uma de suas subpartes sempre que quiser validar qualquer alteração na configuração do nginx.fonte
Eu usei uma abordagem semelhante à resposta aceita, levando em consideração as preocupações da outra resposta.
Eu criei essa essência para esse propósito.
A idéia é copiar o
/etc/nginx
diretório inteiro para um diretório temporário, alterar um arquivo do%s
parâmetro e testar a configuração principal do nginx quanto a problemas. Se você assumir que inicialmente a configuração do nginx é válida e todas as tarefas que modificam a configuração do nginx o usam para validar, acho que não haveria problema.Como uma linha, 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'
fonte
Aqui está uma maneira mais direta de trabalhar pelo menos com o Ansible 2.5:
Ele executa o equivalente
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 apresentaria um erro (changed_when
).Se você instalou o Nginx como usuário, basta remover o
become
, embora eu ache que ainda funcionaria mesmo com ele.fonte
template
módulo e a opção validar no Ansible, você tem uma garantia para a validade da configuração, mas se você implantar o modelo e depois verificar e falhar manualmente, ainda terá o problema de que um inválido modelo foi implantado e não precisa ser revertido.