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 validate
parameter ke modul template Ansible untuk menelepon nginx -t
dan 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 validate
templat khusus situs tidak berfungsi, karena harus dibungkus dengan http
arahan agar valid.
Apa yang dapat saya lakukan untuk memeriksa validitas file khusus situs ini?
Tidak masuk akal untuk langsung memanggil
validate
file 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 -t
file konfigurasi utama dan bukan salah satu bagiannya kapan pun Anda ingin memvalidasi perubahan konfigurasi nginx apa pun.sumber
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/nginx
direktori ke direktori sementara, mengubah satu file dari%s
parameter 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'
sumber
Inilah cara yang lebih mudah yang berfungsi setidaknya dengan Ansible 2.5:
Ini menjalankan setara
sudo nginx -t
dan 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.sumber
template
modul 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.