Valide o nginx.conf durante a implementação ansible

8

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?

    
por Erin Call 09.03.2015 / 18:11

4 respostas

6

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; }"'

    
por 26.10.2016 / 23:32
3

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.

    
por 09.03.2015 / 19:50
3

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'

    
por 24.08.2017 / 09:22
1

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.

    
por 04.09.2018 / 13:51

Tags