Ansible jgħid li tħaddem, imma WireGuard għadu għaddej bil-konfigurazzjoni l-antika
state: started iħalli unit li diġà qed taħdem kif inhi, għalhekk wg0.conf miktub mill-ġdid qatt ma jiġi applikat. Żid handler tal-bidla, imbagħad qabbel it-tagħmir ħaj mal-fajl.
Il-ġirja tal-playbook tintemm ħadra, l-unit ta' WireGuard hija attiva, l-handshake jaħdem, u l-peer il-ġdid xorta ma jasal imkien. Li tara playbook jirrapporta suċċess waqt li s-server qed jaħdem bil-konfigurazzjoni tal-bieraħ huwa frustrant b'mod partikolari, għax xejn fl-output mhu ħażin. Ansible għamel eżattament dak li ntalab: żgura li l-unit kienet imnedija, u l-unit kienet diġà mniedja. L-applikazzjoni ta' fajl ta' konfigurazzjoni miktub mill-ġdid hija kompitu ieħor, u sseħħ biss jekk xi ħaġa tgħid lis-servizz biex jerġa' jaqrah.
Ara x'jirrapporta tassew it-tieni ġirja
Ħaddem il-playbook darbtejn bil-konfigurazzjoni mibdula u qabbel is-sommarju. It-tieni ġirja għandha turi l-kompitu tal-unit bħala ok, mhux changed, għax servizz li diġà qed jaħdem jitħalla kwiet skont id-disinn. Din hija idempotenza li taħdem sew, u hija wkoll ir-raġuni għaliex il-fajl il-ġdid qatt ma jasal sal-kernel.
Żid ġirja ta' verifika b'output diff biex tara liema kompiti jmissu xi ħaġa xejn.
ansible-playbook -i inventory site.yml --check --diff
systemctl show wg-quick@wg0 -p ActiveEnterTimestamp -p NRestarts
stat -c '%y %n' /etc/wireguard/wg0.confIt-tliet timbri tal-ħin jgħidu l-istorja qabel ma taqra linja waħda tal-log. Jekk il-fajl tal-konfigurazzjoni huwa iżjed ġdid mill-mument li fih l-unit saret attiva, l-interface li qed taħdem inbniet minn fajl eqdem, u kull sintomu sussegwenti joħroġ minn hemm.
Dan mhuwiex difett ta' Ansible. L-istess imġiba tidher f'kull għodda ta' ġestjoni tal-konfigurazzjoni li tifred «assigura li qed jaħdem» minn «assigura li qed jaħdem dan». Id-distinzjoni tidher pedantika sakemm tiswielek nofs jum.
Imnedija hija stat, mhux rikarigu
state: started jistqarr kundizzjoni dwar l-unit. Ma jwegħedx li s-servizz jerġa' jaqra l-inputs tiegħu, u ma jistax ikun jaf li fajl li qatt ma fetaħ inbidel. F'implimentazzjoni wg-quick l-inputs jinkludu l-konfigurazzjoni tal-interface, l-indirizzi, ir-rotot, id-dħul DNS u kwalunkwe hook post-up.
Għalhekk fajl aġġornat jista' jkun fih peer ġdid, indirizz differenti jew direttiva ta' routing mibdula waqt li l-interface ħaj tkompli sservi s-sett antik. L-handshake xorta jirnexxi għax iċ-ċwievet u l-endpoints mgħobbija għadhom validi. Dan huwa eżattament dak li jagħmel il-ħsara diffiċli biex tidher, u għaliex in-nies jiġru wara d-DNS għal siegħa qabel ma jiċċekkjaw timbru tal-ħin.
Żewġ għażliet oħra tal-modulu spiss jitqiesu bħala soluzzjoni. daemon_reload iġiegħel lil systemd jerġa' jaqra l-fajls tal-unit, li mhuwiex rilevanti għal fajl tal-konfigurazzjoni ta' WireGuard. state: reloaded jitlob lill-unit teżegwixxi l-azzjoni ta' rikarigu tagħha, u jekk tagħmilx dak li għandek bżonn jiddependi għal kollox mill-unit. Lanqas waħda mhija sostitut għal li tkun taf liema inputs il-proċess li qed jaħdem fil-fatt qara.
Installa l-fajl, imbagħad avża handler
Il-mudell li jżomm l-idempotenza u xorta japplika l-bidliet huwa dak tas-soltu: il-kompitu li jikteb il-fajl javża handler, u l-handler jaħdem biss meta l-fajl fil-fatt inbidel. It-tieni ġirja mingħajr editjar ma tagħmel xejn, u dan huwa dak li trid.
- 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: restartedIl-handlers jaħdmu fl-aħħar tal-play, wara l-kompiti li avżawhom, għalhekk kompitu aktar tard fl-istess play jista' għadu jara l-interface antik. Jekk l-ordni hija importanti, vojta l-handlers b'mod espliċitu b'meta: flush_handlers qabel il-kompitu li jiddependi mill-konfigurazzjoni l-ġdida.
Uża restart minflok reload sakemm ma tkunx ivverifikajt l-azzjoni ta' rikarigu tal-unit. L-unit wg-quick upstream tappoġġa waħda u tissinkronizza l-konfigurazzjoni ta' WireGuard, iżda ma terġax teżegwixxi l-issetupjar tal-indirizzi, rotot, DNS jew hooks. Għalhekk reload wara li żżid direttiva ta' rotta jidher li jirnexxi u ma jbiddel xejn.
Qabbel it-tagħmir ħaj mal-fajl
Il-verifika li tagħlaq din il-klassi ta' buggs hija tqabbil bejn dak li għandu l-kernel u dak li jgħid il-fajl. Żewġ kmandi jipproduċu output komparabbli, u d-differenza hija d-devjazzjoni.
sudo wg showconf wg0
sudo wg-quick strip wg0
sudo diff <(sudo wg showconf wg0) <(sudo wg-quick strip wg0)wg showconf jistampa t-tagħmir ħaj, inkluż iċ-ċavetta privata, għalhekk ittratta dak l-output bħala sigriet u twaħħalx fil-biljett. wg-quick strip jistampa l-fajl mingħajr iċ-ċwievet speċifiċi għal wg-quick, u għalhekk it-tnejn huma komparabbli.
Differenza fil-lista tal-peer tfisser li l-fajl qatt ma ġie applikat. Differenza biss fiċ-ċwievet jew fl-endpoints li kont qed tistenna li jinbidlu tfisser li xi ħaġa applikatu parzjalment. L-ebda differenza tfisser li l-konfigurazzjoni hija aġġornata u l-ħsara hija x'imkien ieħor, li fih innifsu huwa riżultat utli.
Ħallas l-ispiża tal-bidu mill-ġdid b'mod deliberat
Il-bidu mill-ġdid tal-interface jaqta' t-tunnel, u jekk dan it-tunnel iġorr is-sessjoni amministrattiva tiegħek, il-bidu mill-ġdid itemm is-sessjoni li talbitu. Poġġi l-handler wara tieqa tal-bidla, jew ħaddem il-playbook minn passaġġ ta' ġestjoni li ma jiddependix mill-bidu mill-ġdid tal-interface.
L-ispiża hija r-raġuni għaliex in-nies jaqbdu għar-reload. Dan huwa istint raġonevoli, u jsir korrett ladarba tkun taf liema bidliet reload fil-fatt japplika. Għal bidliet tal-peer u taċ-ċwievet fuq l-unit wg-quick upstream huwa biżżejjed; għall-indirizzar, ir-routing u l-hooks le. Li tħalliha ċara darba tiswa inqas milli tiskopriha waqt tieqa tal-bidla.
Id-dokumentazzjoni tal-modulu systemd_service tispjega d-differenza bejn started, restarted u reloaded, u jiswa li taqraha darba minflok tiddeduċiha minn sommarju ħadrani. Kollox f'dan il-gwida joħroġ minn dik id-differenza waħda.