Larian playbook berakhir hijau, unit WireGuard aktif, handshake berfungsi, dan peer baharu masih tidak sampai ke mana-mana. Melihat playbook melaporkan kejayaan sementara pelayan berjalan dengan konfigurasi semalam sungguh mengecewakan, kerana tiada apa-apa yang salah pada outputnya. Ansible melakukan tepat apa yang diminta: ia memastikan unit dimulakan, dan unit itu memang sudah berjalan. Menggunakan fail konfigurasi yang ditulis semula ialah tugas lain, dan ia hanya berlaku jika sesuatu memberitahu perkhidmatan itu untuk membacanya semula.

Lihat apa yang sebenarnya dilaporkan oleh larian kedua

Jalankan playbook dua kali dengan konfigurasi yang diubah dan bandingkan ringkasannya. Larian kedua sepatutnya menunjukkan tugas unit sebagai ok, bukan changed, kerana perkhidmatan yang sudah berjalan dibiarkan begitu sahaja mengikut reka bentuk. Itulah idempotensi yang berfungsi dengan betul, dan itulah sebabnya fail baharu tidak pernah sampai ke kernel.

Tambah larian semakan dengan output diff untuk melihat tugas mana yang akan menyentuh apa-apa.

ansible-playbook -i inventory site.yml --check --diff
systemctl show wg-quick@wg0 -p ActiveEnterTimestamp -p NRestarts
stat -c '%y %n' /etc/wireguard/wg0.conf

Ketiga-tiga cap masa menceritakan kisahnya sebelum anda membaca satu baris log. Jika fail konfigurasi lebih baharu daripada saat unit menjadi aktif, antara muka yang berjalan dibina daripada fail lama, dan setiap gejala berikutnya berpunca daripada itu.

Ini bukan kecacatan Ansible. Tingkah laku yang sama muncul pada mana-mana alat pengurusan konfigurasi yang memisahkan «pastikan ia berjalan» daripada «pastikan ia menjalankan ini». Bezanya kelihatan terlalu teliti sehingga ia merugikan anda satu petang.

Dimulakan ialah keadaan, bukan muat semula

state: started menegaskan syarat tentang unit. Ia tidak menjanjikan perkhidmatan itu membaca semula inputnya, dan ia tidak boleh tahu bahawa fail yang tidak pernah dibukanya telah berubah. Dalam penggunaan wg-quick, input termasuk konfigurasi antara muka, alamat, laluan, entri DNS dan sebarang hook post-up.

Sebab itu fail yang dikemas kini boleh mengandungi peer baharu, alamat berbeza atau arahan penghalaan yang berubah sementara antara muka hidup terus menyediakan set lama. Handshake masih berjaya kerana kunci dan titik akhir yang dimuatkan masih sah. Itulah yang menjadikan kegagalan sukar dilihat, dan sebab orang mengejar DNS selama satu jam sebelum memeriksa cap masa.

Dua pilihan modul lain sering disangka penyelesaian. daemon_reload menyebabkan systemd membaca semula fail unit, yang tidak relevan bagi fail konfigurasi WireGuard. state: reloaded meminta unit menjalankan tindakan muat semulanya, dan sama ada ia melakukan apa yang anda perlukan bergantung sepenuhnya pada unit itu. Kedua-duanya bukan pengganti kepada mengetahui input mana yang benar-benar dibaca oleh proses yang berjalan.

Pasang fail itu, kemudian beritahu handler

Corak yang mengekalkan idempotensi dan tetap menggunakan perubahan ialah corak biasa: tugas yang menulis fail memberitahu handler, dan handler hanya berjalan apabila fail benar-benar berubah. Larian kedua tanpa suntingan tidak melakukan apa-apa, dan itulah yang anda mahukan.

- name: write the interface configuration
  ansible.builtin.template:
    src: wg0.conf.j2
    dest: /etc/wireguard/wg0.conf
    owner: root
    mode: "0600"
  notify: apply wg0

- name: ensure the interface unit is enabled
  ansible.builtin.systemd_service:
    name: wg-quick@wg0
    enabled: true
    state: started

- name: apply wg0
  listen: apply wg0
  ansible.builtin.systemd_service:
    name: wg-quick@wg0
    state: restarted

Handler berjalan pada akhir play, selepas tugas yang memberitahunya, jadi tugas yang lebih lewat dalam play yang sama mungkin masih melihat antara muka lama. Jika urutan penting, kosongkan handler secara eksplisit dengan meta: flush_handlers sebelum tugas yang bergantung pada konfigurasi baharu.

Gunakan restart dan bukan reload kecuali anda telah mengesahkan tindakan muat semula unit. Unit wg-quick huluan menyokongnya dan menyegerakkan konfigurasi WireGuard, tetapi ia tidak menjalankan semula persediaan alamat, laluan, DNS atau hook. Jadi reload selepas menambah arahan laluan kelihatan berjaya dan tidak mengubah apa-apa.

Bandingkan peranti hidup dengan fail

Semakan yang menutup kelas pepijat ini ialah perbandingan antara apa yang dipegang kernel dan apa yang dikatakan fail. Dua arahan menghasilkan output yang setanding, dan perbezaannya ialah sisihan.

sudo wg showconf wg0
sudo wg-quick strip wg0
sudo diff <(sudo wg showconf wg0) <(sudo wg-quick strip wg0)

wg showconf mencetak peranti hidup, termasuk kunci peribadi, jadi anggap output itu sebagai rahsia dan jangan tampalkannya dalam tiket. wg-quick strip mencetak fail tanpa kunci khusus wg-quick, dan sebab itulah kedua-duanya boleh dibandingkan.

Perbezaan dalam senarai peer bermaksud fail itu tidak pernah digunakan. Perbezaan hanya pada kunci atau titik akhir yang anda jangkakan berubah bermaksud sesuatu menggunakannya secara separa. Tiada perbezaan bermaksud konfigurasi itu terkini dan kesalahannya di tempat lain, yang sudah menjadi hasil berguna.

Bayar kos mula semula dengan sengaja

Memulakan semula antara muka memutuskan terowong, dan jika terowong itu membawa sesi pentadbiran anda, mula semula menamatkan sesi yang memintanya. Letakkan handler di belakang tetingkap perubahan, atau jalankan playbook dari laluan pengurusan yang tidak bergantung pada mula semula antara muka.

Kos itulah sebab orang beralih kepada reload. Itu naluri yang munasabah, dan ia menjadi betul apabila anda tahu perubahan mana yang benar-benar digunakan oleh reload. Untuk perubahan peer dan kunci pada unit wg-quick huluan ia memadai; untuk pengalamatan, penghalaan dan hook tidak. Menjelaskannya sekali lebih murah daripada menemuinya semasa tetingkap perubahan.

Dokumentasi modul systemd_service menerangkan perbezaan antara started, restarted dan reloaded, dan ia wajar dibaca sekali daripada membuat andaian daripada ringkasan hijau. Segala-galanya dalam panduan ini berpunca daripada satu perbezaan itu.

Artikel berkaitan