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.conf

Mae'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: restarted

Mae 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.

Erthyglau cysylltiedig