Ansible başlatıldı diyor, ama WireGuard hâlâ eski yapılandırmayla çalışıyor
state: started zaten çalışan bir unit'e dokunmaz, bu yüzden yeniden yazılan wg0.conf hiçbir zaman uygulanmaz. Bir değişiklik handler'ı ekleyin, ardından canlı cihazı dosyayla karşılaştırın.
Playbook çalışması yeşil biter, WireGuard unit'i etkindir, handshake çalışır ve yeni peer yine hiçbir yere ulaşamaz. Sunucu dünkü yapılandırmayla çalışırken playbook'un başarı bildirmesini görmek özellikle sinir bozucudur, çünkü çıktıda yanlış olan hiçbir şey yoktur. Ansible tam olarak isteneni yaptı: unit'in başlatıldığından emin oldu ve unit zaten başlatılmıştı. Yeniden yazılmış bir yapılandırma dosyasını uygulamak başka bir iştir ve yalnızca bir şey hizmete onu yeniden okumasını söylediğinde gerçekleşir.
İkinci çalışmanın gerçekte ne bildirdiğine bakın
Playbook'u değiştirilmiş yapılandırmayla iki kez çalıştırın ve özeti karşılaştırın. İkinci çalışma unit görevini changed değil ok olarak göstermelidir, çünkü zaten çalışan hizmet tasarım gereği rahat bırakılır. Bu, doğru çalışan idempotence'tir ve yeni dosyanın çekirdeğe asla ulaşmamasının nedeni de budur.
Hangi görevlerin herhangi bir şeye dokunacağını görmek için diff çıktılı bir kontrol çalışması ekleyin.
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Üç zaman damgası tek bir log satırı okumadan önce hikâyeyi anlatır. Yapılandırma dosyası unit'in etkinleştiği andan daha yeniyse, çalışan arayüz daha eski bir dosyadan oluşturulmuştur ve sonraki tüm belirtiler bundan kaynaklanır.
Bu bir Ansible kusuru değildir. Aynı davranış, «çalıştığından emin ol» ile «tam olarak bunu çalıştırdığından emin ol» arasında ayrım yapan her yapılandırma yönetimi aracında görülür. Fark, size bir öğleden sonraya mal olana kadar gereksiz ayrıntı gibi görünür.
Başlatılmış bir durumdur, yeniden yükleme değil
state: started unit hakkında bir koşul öne sürer. Hizmetin girdilerini yeniden okuyacağını vaat etmez ve hiç açmadığı bir dosyanın değiştiğini bilemez. Bir wg-quick kurulumunda girdiler arayüz yapılandırmasını, adresleri, rotaları, DNS kayıtlarını ve varsa post-up kancalarını içerir.
Bu yüzden güncellenmiş bir dosya yeni bir peer, farklı bir adres veya değiştirilmiş bir yönlendirme direktifi içerebilirken canlı arayüz eski kümeyi sunmaya devam eder. Handshake hâlâ başarılıdır çünkü yüklenen anahtarlar ve uç noktalar hâlâ geçerlidir. Arızayı görünür kılan tam olarak budur ve insanların zaman damgasını kontrol etmeden önce bir saat DNS peşinde koşmasının nedeni de budur.
Modülün iki başka seçeneği sıklıkla çözüm sanılır. daemon_reload systemd'nin unit dosyalarını yeniden okumasını sağlar, bunun WireGuard yapılandırma dosyasıyla ilgisi yoktur. state: reloaded unit'ten yeniden yükleme eylemini yürütmesini ister ve bunun ihtiyacınızı karşılayıp karşılamadığı tamamen unit'e bağlıdır. Hiçbiri çalışan sürecin hangi girdileri gerçekten okuduğunu bilmenin yerini tutmaz.
Dosyayı kurun, sonra bir handler'ı bilgilendirin
Idempotence'i koruyup değişiklikleri yine de uygulayan kalıp olağan olandır: dosyayı yazan görev bir handler'ı bilgilendirir ve handler yalnızca dosya gerçekten değiştiğinde çalışır. Düzenleme olmadan ikinci çalışma hiçbir şey yapmaz ve istediğiniz de budur.
- 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: restartedHandler'lar play'in sonunda, kendilerini bilgilendiren görevlerden sonra çalışır, bu yüzden aynı play'deki daha sonraki bir görev hâlâ eski arayüzü görebilir. Sıra önemliyse, yeni yapılandırmaya bağlı görevden önce handler'ları meta: flush_handlers ile açıkça boşaltın.
Unit'in yeniden yükleme eylemini doğrulamadıysanız reload yerine restart kullanın. Üst akış wg-quick unit'i birini destekler ve WireGuard yapılandırmasını eşitler, ancak adres, rota, DNS veya kanca kurulumunu yeniden yürütmez. Bu yüzden bir rota direktifi ekledikten sonraki reload başarılı görünür ve hiçbir şeyi değiştirmez.
Canlı cihazı dosyayla karşılaştırın
Bu hata sınıfını kapatan kontrol, çekirdeğin tuttuğu ile dosyanın söylediği arasındaki karşılaştırmadır. İki komut karşılaştırılabilir çıktı verir ve fark sapmadır.
sudo wg showconf wg0
sudo wg-quick strip wg0
sudo diff <(sudo wg showconf wg0) <(sudo wg-quick strip wg0)wg showconf özel anahtar dahil canlı cihazı yazdırır, bu yüzden bu çıktıyı sır olarak görün ve bir bilete yapıştırmayın. wg-quick strip dosyayı wg-quick'e özgü anahtarlar olmadan yazdırır ve bu yüzden ikisi karşılaştırılabilir.
Peer listesindeki bir fark dosyanın hiç uygulanmadığı anlamına gelir. Yalnızca değişmesini beklediğiniz anahtar veya uç noktalardaki fark, bir şeyin onu kısmen uyguladığı anlamına gelir. Hiç fark olmaması yapılandırmanın güncel olduğu ve arızanın başka yerde olduğu anlamına gelir; bu da kendi başına yararlı bir sonuçtur.
Yeniden başlatma bedelini bilinçli olarak ödeyin
Arayüzü yeniden başlatmak tüneli düşürür ve o tünel yönetici oturumunuzu taşıyorsa, yeniden başlatma onu isteyen oturumu sonlandırır. Handler'ı bir değişiklik penceresinin arkasına koyun veya playbook'u arayüzün yeniden başlatılmasına bağlı olmayan bir yönetim yolundan çalıştırın.
Bedel, insanların neden reload'a başvurduğunun nedenidir. Makul bir içgüdüdür ve reload'ın gerçekte hangi değişiklikleri uyguladığını bildiğinizde doğru olur. Üst akış wg-quick unit'inde peer ve anahtar değişiklikleri için yeterlidir; adresleme, yönlendirme ve kancalar için değildir. Bunu bir kez netleştirmek, bir değişiklik penceresi sırasında keşfetmekten daha ucuzdur.
systemd_service modülünün belgeleri started, restarted ve reloaded arasındaki farkı açıklar ve yeşil bir özetten tahmin etmek yerine bir kez okumaya değer. Bu rehberdeki her şey o tek farktan kaynaklanır.