Playbook icrası yaşıl bitir, WireGuard vahidi aktivdir, handshake işləyir, amma yeni peer heç yerə çatmır. Server dünənki konfiqurasiya ilə işləyərkən playbook-un uğur bildirməsini izləmək xüsusi bir narahatçılıqdır, çünki çıxışda heç nə səhv deyil. Ansible tam istəniləni etdi: vahidin başladılmasını təmin etdi, vahid isə artıq başlamışdı. Yenidən yazılmış konfiqurasiya faylını tətbiq etmək başqa bir vəzifədir və yalnız nəsə xidmətə onu yenidən oxumağı söylədikdə baş verir.

İkinci icranın əslində nə bildirdiyinə baxın

Dəyişdirilmiş konfiqurasiya yerində olmaqla playbook-u iki dəfə işə salın və yekunu müqayisə edin. İkinci icra vahid tapşırığını changed deyil, ok kimi göstərməlidir, çünki artıq işləyən xidmət dizayn olaraq toxunulmadan qalır. Bu, idempotentliyin düzgün işləməsidir və yeni faylın kernelə heç vaxt çatmamasının səbəbi də elə budur.

Hansı tapşırıqların ümumiyyətlə nəyəsə toxunacağını görmək üçün diff çıxışı ilə yoxlama icrası əlavə edin.

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 damğası bir dənə də log sətri oxumadan əvvəl hekayəni danışır. Əgər konfiqurasiya faylı vahidin aktiv olduğu andan daha yenidirsə, işləyən interfeys köhnə fayldan qurulub və sonrakı bütün simptomlar bundan irəli gəlir.

Bu, Ansible qüsuru deyil. Eyni davranış «işlədiyinə əmin ol» ilə «bununla işlədiyinə əmin ol» arasında fərq qoyan istənilən konfiqurasiya idarəetmə alətində görünür. Fərq bir gününüzü itirənə qədər pedantik görünür.

Başladılmış vəziyyətdir, yenidən yükləmə deyil

state: started vahid haqqında bir şərt təsdiqləyir. Xidmətin girişlərini yenidən oxuduğuna zəmanət vermir və heç vaxt açmadığı faylın dəyişdiyini bilə bilməz. wg-quick yerləşdirməsində girişlərə interfeys konfiqurasiyası, ünvanlar, marşrutlar, DNS qeydləri və hər hansı post-up hook daxildir.

Buna görə yenilənmiş fayl yeni peer, fərqli ünvan və ya dəyişdirilmiş marşrut direktivi daşıya bilər, canlı interfeys isə köhnə dəsti verməyə davam edir. Handshake hələ də uğurludur, çünki yüklənmiş açarlar və son nöqtələr hələ də etibarlıdır. Bu, nasazlığı çətin görünən edən və insanların zaman damğasına baxmazdan əvvəl bir saat DNS arxasınca qaçmasının səbəbidir.

Daha iki modul seçimi çox vaxt həll yolu sanılır. daemon_reload systemd-nin vahid fayllarını yenidən oxumasına səbəb olur, bunun WireGuard konfiqurasiya faylına heç bir aidiyyəti yoxdur. state: reloaded vahiddən yenidən yükləmə əməliyyatını yerinə yetirməsini istəyir və bu əməliyyatın sizə lazım olanı edib-etmədiyi tamamilə vahiddən asılıdır. Heç biri işləyən prosesin hansı girişləri həqiqətən oxuduğunu bilməyin əvəzi deyil.

Faylı quraşdırın, sonra handler-ə bildiriş göndərin

İdempotentliyi saxlayıb dəyişiklikləri tətbiq edən naxış adi naxışdır: faylı yazan tapşırıq handler-ə bildiriş göndərir və handler yalnız fayl həqiqətən dəyişdikdə işləyir. Redaktə olmadan ikinci icra heç nə etmir və istədiyiniz də elə 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: restarted

Handler-lər pyesin sonunda, onlara bildiriş göndərən tapşırıqlardan sonra işləyir, ona görə həmin pyesdə sonrakı tapşırıq hələ də köhnə interfeysi görə bilər. Sıra vacibdirsə, yeni konfiqurasiyadan asılı tapşırıqdan əvvəl handler-ləri meta: flush_handlers ilə açıq şəkildə boşaldın.

Vahidin yenidən yükləmə əməliyyatını yoxlamamısınızsa, reload yerinə restart istifadə edin. Upstream wg-quick vahidi birini dəstəkləyir və WireGuard konfiqurasiyasını sinxronlaşdırır, amma ünvan, marşrut, DNS və ya hook qurulumunu yenidən icra etmir. Ona görə marşrut direktivi əlavə etdikdən sonra reload uğurlu görünür və heç nəyi dəyişmir.

Canlı cihazı faylla müqayisə edin

Bu sinif xətaları bağlayan yoxlama kernelin saxladığı ilə faylın dediyi arasındakı müqayisədir. İki əmr müqayisə oluna bilən çıxış verir və fərq dediyimiz sapmadır.

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

wg showconf şəxsi açar daxil olmaqla canlı cihazı çap edir, ona görə bu çıxışa sirr kimi yanaşın və onu bilettə yapışdırmayın. wg-quick strip faylı yalnız wg-quick açarları çıxarılmış halda çap edir, buna görə ikisi ümumiyyətlə müqayisə oluna bilir.

Peer siyahısındakı fərq faylın heç vaxt tətbiq olunmadığını bildirir. Yalnız dəyişməsini gözlədiyiniz açarlar və ya son nöqtələrlə məhdud fərq nəyinsə onu qismən tətbiq etdiyini bildirir. Heç fərq olmaması konfiqurasiyanın aktual olduğunu və nasazlığın başqa yerdə olduğunu bildirir ki, bu da özlüyündə faydalı nəticədir.

Yenidən başlatma xərcini qəsdən ödəyin

İnterfeysin yenidən başladılması tuneli qoparır və əgər həmin tunel inzibati sessiyanızı daşıyırsa, yenidən başlatma onu tələb edən sessiyanı bitirir. Handler-i dəyişiklik pəncərəsinin arxasına qoyun və ya playbook-u interfeysin yenidən başladılmasından asılı olmayan idarəetmə yolundan işə salın.

Xərc insanları reload-a çəkir. Bu, ağlabatan instinktdir və reload-un hansı dəyişiklikləri tətbiq etdiyini bildikdə düzgün olur. Upstream wg-quick vahidində peer və açar dəyişiklikləri üçün kifayətdir; ünvanlama, marşrutlaşdırma və hook-lar üçün deyil. Bunu bir dəfə həll etmək dəyişiklik pəncərəsi zamanı kəşf etməkdən ucuzdur.

systemd_service modulunun sənədləri started, restarted və reloaded arasındakı fərqi izah edir və yaşıl yekundan nəticə çıxarmaq əvəzinə bir dəfə oxumağa dəyər. Bu yazıdakı hər şey həmin bir fərqdən irəli gəlir.

Əlaqəli məqalələr