Validar nginx.conf durante a implantação ansible

11

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 validateparâmetro para o módulo de modelo do Ansible para chamar nginx -te 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 validateos modelos específicos do site não funciona, pois eles precisam ser agrupados em uma httpdiretiva para serem válidos.

O que posso fazer para verificar a validade desses arquivos específicos do site?

Erin Call
fonte

Respostas:

9

Você pode fazer alguns truques e validar arquivos inseridos como (ideia emprestada de https://gist.github.com/psd/5042334 ): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'

Hubbitus
fonte
isso realmente funciona, voto positivo!
13dimitar
4

Não faz sentido chamar diretamente validateum 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 -to arquivo de configuração principal e não uma de suas subpartes sempre que quiser validar qualquer alteração na configuração do nginx.

Xavier Lucas
fonte
1
Está bem. Então, acho que preciso convencer o ansible a agrupar tudo para validação de uma só vez?
Erin Chamada
@ErinCall Idealmente, sua configuração do nginx deve permanecer completamente válida, mesmo que o seu manual seja interrompido parcialmente.
Michael Hampton
3

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/nginxdiretório inteiro para um diretório temporário, alterar um arquivo do %sparâ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'

jadkik94
fonte
1
Eu precisava dessa solução em vez da resposta aceita, porque meu nginx conf incluía fastcgi_params.
Yep_It's_Me
3

Aqui está uma maneira mais direta de trabalhar pelo menos com o Ansible 2.5:

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

Ele executa o equivalente sudo nginx -te 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.

Juha Untinen
fonte
1
Este é um mau exemplo, ao usar o templatemó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.
Rabin