Validasi nginx.conf selama penyebaran yang mungkin dilakukan

11

Saya memiliki satu server yang disediakan untuk menjalankan beberapa situs.

Tugas Ansible saya terlihat seperti:

- 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

Saya ingin menggunakan validateparameter ke modul template Ansible untuk menelepon nginx -tdan memastikan konfigurasi baru saya valid secara sintaksis. Ini berfungsi untuk nginx.conf utama:

  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
            validate="/usr/sbin/nginx -c %s -t"

Tetapi sepertinya tidak menerima perubahan pada file konfigurasi khusus situs. Menempatkan validatetemplat khusus situs tidak berfungsi, karena harus dibungkus dengan httparahan agar valid.

Apa yang dapat saya lakukan untuk memeriksa validitas file khusus situs ini?

Erin Call
sumber

Jawaban:

9

Anda dapat melakukannya di sana beberapa trik dan memvalidasi file yang ditempatkan seperti (ide dipinjam dari https://gist.github.com/psd/5042334 ): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'

Hubbitus
sumber
ini benar-benar berfungsi, upvote!
13dimitar
4

Tidak masuk akal untuk langsung memanggil validatefile yang termasuk dalam file konfigurasi utama nginx Anda karena validitas arahan dalam file konfigurasi tertentu dapat bergantung pada sisa file konfigurasi Anda (misalnya Anda memiliki dua file konfigurasi yang menyatakan blok server yang sama dll).

Anda harus selalu memanggil nginx -tfile konfigurasi utama dan bukan salah satu bagiannya kapan pun Anda ingin memvalidasi perubahan konfigurasi nginx apa pun.

Xavier Lucas
sumber
1
Baik. Jadi saya kira saya perlu meyakinkan semua orang untuk mengumpulkan semuanya untuk validasi dalam satu pukulan?
Erin Call
@ErinCall Idealnya konfigurasi nginx Anda harus tetap benar-benar valid bahkan jika playbook Anda diinterupsi sebagian.
Michael Hampton
3

Saya menggunakan pendekatan yang mirip dengan jawaban yang diterima dengan mempertimbangkan kekhawatiran jawaban lain.

Saya membuat intisari ini untuk tujuan itu.

Idenya adalah untuk menyalin seluruh /etc/nginxdirektori ke direktori sementara, mengubah satu file dari %sparameter dan menguji konfigurasi nginx utama untuk masalah. Jika Anda berasumsi bahwa awalnya konfigurasi nginx valid dan semua tugas yang memodifikasi konfigurasi nginx menggunakannya untuk memvalidasi, maka saya kira tidak akan ada masalah.

Sebagai satu liner akan terlihat seperti ini:

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
sumber
1
Saya membutuhkan solusi ini daripada jawaban yang diterima karena nginx conf saya termasuk fastcgi_params.
Yep_It's_Me
3

Inilah cara yang lebih mudah yang berfungsi setidaknya dengan Ansible 2.5:

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

Ini menjalankan setara sudo nginx -tdan memeriksa hasilnya. Jika ada kesalahan dalam konfigurasi nginx, ia mengembalikan non-nol dan tugas Ansible akan kesalahan ( changed_when).

Jika Anda menginstal Nginx sebagai pengguna, hapus saja become, meskipun saya pikir itu akan tetap berfungsi bahkan dengan itu.

Juha Untinen
sumber
1
Ini adalah contoh yang buruk, ketika menggunakan templatemodul dan opsi validasi di Ansible Anda memiliki jaminan untuk validitas konfigurasi, tetapi jika Anda menggunakan template dan kemudian secara manual memeriksa dan gagal, maka Anda masih memiliki masalah yang tidak valid template dikerahkan, dan tidak perlu dikembalikan.
Rabin