Mae Ansible yn dweud bod wedi cychwyn, ond mae WireGuard yn dal i redeg yr hen ffurfweddiad
Mae state: started yn gadael uned sy'n rhedeg yn barod, felly ni chaiff wg0.conf a ailysgrifennwyd ei gymhwyso byth. Ychwanegwch handler newid, yna cymharwch y ddyfais fyw â'r ffeil.
Mae'r playbook yn gorffen yn wyrdd, mae uned WireGuard yn actif, mae'r handshake yn gweithio, ac eto nid yw'r peer newydd yn cyrraedd unrhyw beth. Mae gwylio playbook yn adrodd llwyddiant tra bo'r gweinydd yn rhedeg ffurfweddiad ddoe yn siomedig iawn, oherwydd nid oes dim o'i le yn yr allbwn. Gwnaeth Ansible yn union yr hyn a ofynnwyd: sicrhaodd fod yr uned wedi cychwyn, ac yr oedd hi wedi cychwyn yn barod. Mae cymhwyso ffeil ffurfweddiad a ailysgrifennwyd yn dasg wahanol, ac mae'n digwydd dim ond pan fydd rhywbeth yn dweud wrth y gwasanaeth i'w hail-ddarllen.
Edrychwch beth mae ail rediad yn ei adrodd mewn gwirionedd
Rhedwch y playbook ddwywaith gyda'r ffurfweddiad newydd yn ei le a chymharwch y crynodeb. Dylai'r ail rediad ddangos tasg yr uned fel ok, nid changed, oherwydd gadewir gwasanaeth sy'n rhedeg eisoes yn llonydd yn ôl y cynllun. Dyna idempotens yn gweithio'n gywir, a dyna hefyd pam nad yw'r ffeil newydd byth yn cyrraedd y cnewyllyn.
Ychwanegwch rediad gwirio ag allbwn diff i weld pa dasgau a fyddai'n cyffwrdd unrhyw beth o gwbl.
ansible-playbook -i inventory site.yml --check --diff
systemctl show wg-quick@wg0 -p ActiveEnterTimestamp -p NRestarts
stat -c '%y %n' /etc/wireguard/wg0.confMae'r tair stamp amser yn adrodd yr hanes cyn i chi ddarllen un llinell log. Os yw'r ffeil ffurfweddiad yn fwy newydd na'r foment y daeth yr uned yn actif, adeiladwyd y rhyngwyneb sy'n rhedeg o ffeil hŷn, ac mae pob symptom dilynol yn deillio o hynny.
Nid diffyg yn Ansible yw hyn. Mae'r un ymddygiad i'w weld gydag unrhyw offeryn rheoli ffurfweddiad sy'n gwahanu „sicrha fod yn rhedeg“ oddi wrth „sicrha fod yn rhedeg hyn“. Mae'r gwahaniaeth yn edrych yn fân nes ei fod yn costio prynhawn i chi.
Mae cychwyn yn gyflwr, nid ail-lwytho
Mae state: started yn honni amod am yr uned. Nid yw'n addo y bydd y gwasanaeth yn ail-ddarllen ei fewnbynnau, ac ni all wybod bod ffeil na chafodd ei hagor erioed wedi newid. Mewn defnydd wg-quick mae'r mewnbynnau'n cynnwys ffurfweddiad y rhyngwyneb, y cyfeiriadau, y llwybrau, y cofnodion DNS a'r bachau post-up.
Felly gall ffeil wedi'i diweddaru gynnwys peer newydd, cyfeiriad gwahanol neu gyfarwyddeb llwybro newidiedig tra bo'r rhyngwyneb byw yn parhau i wasanaethu'r hen set. Mae'r handshake yn dal i lwyddo oherwydd bod yr allweddi a'r pwyntiau terfyn a lwythwyd yn ddilys o hyd. Dyna'n union sy'n gwneud y methiant yn anodd ei weld, a pham mae pobl yn hela DNS am awr cyn gwirio stamp amser.
Mae dau opsiwn arall o'r modiwl yn cael eu camgymryd yn aml am ateb. Mae daemon_reload yn gwneud i systemd ail-ddarllen ffeiliau uned, sy'n amherthnasol i ffeil ffurfweddiad WireGuard. Mae state: reloaded yn gofyn i'r uned redeg ei gweithred ail-lwytho, ac mae a yw hynny'n gwneud yr hyn sydd ei angen arnoch yn dibynnu'n gyfan gwbl ar yr uned. Nid yw'r naill na'r llall yn cymryd lle gwybod pa fewnbynnau y mae'r broses sy'n rhedeg wedi'u darllen mewn gwirionedd.
Gosodwch y ffeil, yna hysbyswch handler
Y patrwm sy'n cadw idempotens ac yn dal i gymhwyso newidiadau yw'r un arferol: mae'r dasg sy'n ysgrifennu'r ffeil yn hysbysu handler, ac mae'r handler yn rhedeg dim ond pan fydd y ffeil wedi newid mewn gwirionedd. Nid yw ail rediad heb olygu yn gwneud dim, a dyna'r hyn yr ydych ei eisiau.
- 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: restartedMae handleriaid yn rhedeg ar ddiwedd y ddrama, ar ôl y tasgau a'u hysbysodd, felly gall tasg yn ddiweddarach yn yr un ddrama weld yr hen ryngwyneb o hyd. Os yw trefn yn bwysig, fflwsiwch yr handleriaid yn benodol gyda meta: flush_handlers cyn y dasg sy'n dibynnu ar y ffurfweddiad newydd.
Defnyddiwch restart yn lle reload oni bai eich bod wedi gwirio gweithred ail-lwytho'r uned. Mae uned wg-quick yr upstream yn cefnogi un, ac mae'n cydweddu ffurfweddiad WireGuard, ond nid yw'n ail-redeg gosodiad cyfeiriadau, llwybrau, DNS na bachau. Felly mae reload ar ôl ychwanegu cyfarwyddeb llwybr yn ymddangos yn llwyddiannus ac yn newid dim.
Cymharwch y ddyfais fyw â'r ffeil
Y gwiriad sy'n cau'r dosbarth hwn o fygiau yw cymharu'r hyn y mae'r cnewyllyn yn ei ddal â'r hyn y mae'r ffeil yn ei ddweud. Mae dau orchymyn yn cynhyrchu allbwn cymharol, a'r gwahaniaeth yw'r drifft.
sudo wg showconf wg0
sudo wg-quick strip wg0
sudo diff <(sudo wg showconf wg0) <(sudo wg-quick strip wg0)Mae wg showconf yn argraffu'r ddyfais fyw, gan gynnwys yr allwedd breifat, felly triniwch yr allbwn hwnnw fel cyfrinach a pheidiwch â'i bastio i docyn. Mae wg-quick strip yn argraffu'r ffeil heb allweddi wg-quick yn unig, a dyna pam mae'r ddau yn gymharol o gwbl.
Mae gwahaniaeth yn y rhestr peer yn golygu na chafodd y ffeil ei chymhwyso erioed. Mae gwahaniaeth wedi'i gyfyngu i allweddi neu bwyntiau terfyn yr oeddech yn disgwyl eu newid yn golygu bod rhywbeth wedi'i chymhwyso'n rhannol. Nid oes unrhyw wahaniaeth yn golygu bod y ffurfweddiad yn gyfredol a bod y nam yn rhywle arall, sy'n ganlyniad defnyddiol ynddo'i hun.
Talwch gost yr ailgychwyn yn fwriadol
Mae ailgychwyn y rhyngwyneb yn gollwng y twmnel, ac os yw'r twmnel hwnnw'n cario'ch sesiwn weinyddol, mae'r ailgychwyn yn diweddu'r sesiwn a'i gofynnodd. Rhowch y handler y tu ôl i ffenestr newid, neu redwch y playbook o lwybr rheoli nad yw'n dibynnu ar ailgychwyn y rhyngwyneb.
Y gost yw'r rheswm pam mae pobl yn troi at reload. Mae'n reddf resymol, ac mae'n dod yn gywir unwaith y gwyddoch pa newidiadau y mae reload yn eu cymhwyso mewn gwirionedd. Ar gyfer newidiadau peer ac allwedd ar uned wg-quick yr upstream mae'n ddigon; ar gyfer cyfeirio, llwybro a bachau nid yw. Mae setlo hyn unwaith yn rhatach na'i ddarganfod yn ystod ffenestr newid.
Mae dogfennaeth modiwl systemd_service yn esbonio'r gwahaniaeth rhwng started, restarted a reloaded, ac mae'n werth ei darllen unwaith yn hytrach na'i gasglu o grynodeb gwyrdd. Mae popeth yn y daith hon yn deillio o'r un gwahaniaeth hwnnw.