Playbook жашыл менен бүтөт, WireGuard unit активдүү, handshake иштейт, бирок жаңы peer эч жерге жетпейт. Сервер кечээки конфигурация менен иштеп жатканда playbook ийгилик жөнүндө кабарлаганын көрүү өзгөчө көңүл калтырат, анткени чыгышта эч нерсе туура эмес эмес. Ansible так суралганды кылды: unit иштеп баштаганын камсыздады, ал эми unit мурун эле иштеп турган. Кайра жазылган конфигурация файлын колдонуу башка милдет жана ал бир нерсе кызматка аны кайра окууну айтканда гана болот.

Экинчи жүргүзүү чындыгында эмнени кабарлайт, көрүңүз

Өзгөртүлгөн конфигурация менен playbook-ту эки жолу иштетип, жыйынтыкты салыштырыңыз. Экинчи жүргүзүү unit тапшырмасын changed эмес, ok деп көрсөтүшү керек, анткени иштеп турган кызмат долбоор боюнча тынч калтырылат. Бул туура иштеген idempotence жана жаңы файлдын kernel-ге эч качан жетпешинин себеби да ушунда.

diff чыгышы менен текшерүү жүргүзүүсүн кошуп, кайсы тапшырмалар бир нерсеге тийерин көрүңүз.

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

Үч убакыт белгиси бир сап log окуудан мурун окуяны айтып берет. Эгер конфигурация файлы unit активдешкен учурдан жаңыраак болсо, иштеп турган интерфейс эскирээк файлдан курулган, жана кийинки бардык белгилер ошондон келип чыгат.

Бул Ansible кемчилиги эмес. Ошол эле жүрүм-турум «иштеп жатканын текшер» менен «так ушуну иштеп жатканын текшер» деп бөлгөн ар кандай конфигурация башкаруу куралында кездешет. Айырма түштөн кийин бир жарым күн жоготконго чейин майда-чүйдө болуп көрүнөт.

Иштетилген — абал, кайра жүктөө эмес

state: started unit жөнүндө шартты бекітет. Ал кызматтын киргизүүлөрүн кайра окушуна убада бербейт жана эч качан ачпаган файл өзгөргөнүн биле албайт. wg-quick жайгаштыруусунда киргизүүлөргө интерфейс конфигурациясы, даректер, маршруттар, DNS жазуулары жана кандайдыр бир post-up hook кирет.

Ошондуктан жаңыртылган файлда жаңы peer, башка дарек же өзгөргөн маршруттоо нускамасы болушу мүмкүн, ал эми иштеп турган интерфейс эски топтомду тейлей берет. Handshake дагы эле ийгиликтүү, анткени жүктөлгөн ачкычтар жана акыркы чекиттер дагы эле жарактуу. Так ушул себептен бузулууну байкоо кыйын жана адамдар убакыт белгисин текшерүүдөн мурун бир саат DNS кууп жүрүшөт.

Модулдун дагы эки опциясы чечим катары кабылданат. daemon_reload systemd-ге unit файлдарын кайра окутат, бул WireGuard конфигурация файлына тиешеси жок. state: reloaded unit-тен кайра жүктөө аракетин аткарууну сурайт, ал эми анын керектүүнү аткарары толугу менен unit-ке байланыштуу. Экөө тең иштеп турган процесс кайсы киргизүүлөрдү чындыгында окуганын билүүнүн ордун баспайт.

Файлды орнотуп, анан handler-ге кабарлаңыз

Idempotence-ти сактап, өзгөртүүлөрдү колдонгон үлгү кадимкидей: файлды жазган тапшырма handler-ге кабарлайт, ал эми handler файл чындап өзгөргөндө гана иштейт. Оңдоосуз экинчи жүргүзүү эч нерсе кылбайт, сизге да ушул керек.

- 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-лер play аягында, аларга кабарлаган тапшырмалардан кийин иштейт, ошондуктан ошол эле play-деги кийинки тапшырма дагы эле эски интерфейсти көрүшү мүмкүн. Тартип маанилүү болсо, жаңы конфигурацияга көз каранды тапшырманын алдында handler-лерди meta: flush_handlers аркылуу ачык бошотуңуз.

Unit-тин кайра жүктөө аракетин текшербесеңиз, reload ордуна restart колдонуңуз. Upstream wg-quick unit аны колдойт жана WireGuard конфигурациясын синхрондайт, бирок даректер, маршруттар, DNS же hook жөндөөсүн кайра аткарбайт. Ошондуктан маршрут нускамасын кошкондон кийинки reload ийгиликтүү көрүнөт жана эч нерсени өзгөртпөйт.

Иштеп турган түзмөктү файл менен салыштырыңыз

Бул класстагы каталарды жапкан текшерүү — kernel кармаган нерсе менен файл айткан нерсенин салыштыруусу. Эки буйрук салыштырууга боло турган чыгыш берет, ал эми айырма — четтөө.

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

wg showconf жеке ачкычты кошкондой иштеп турган түзмөктү басып чыгарат, ошондуктан бул чыгышты сыр катары кабыл алып, тикетке чаптабаңыз. wg-quick strip файлды wg-quick-ке таандык ачкычтарсыз басып чыгарат, ошондуктан экөөнү салыштырууга болот.

Peer тизмесиндеги айырма файл эч качан колдонулбаганын билдирет. Өзгөрөт деп күткөн ачкычтар же акыркы чекиттер гана айырмаланса, бир нерсе аны жарым-жартылай колдонгон. Эч айырма жок болсо, конфигурация учурдагы жана ката башка жерде, бул өзү пайдалуу жыйынтык.

Кайра иштетүү наркын атайылап төлөңүз

Интерфейсти кайра иштетүү туннелди үзөт, эгер ал туннель административдик сессияңызды ташып жатса, кайра иштетүү ошону талап кылган сессияны бүтүрөт. Handler-ди өзгөртүү терезесинин артына коюңуз же playbook-ту интерфейсти кайра иштетүүгө көз каранды эмес башкаруу жолунан иштетиңиз.

Ушул нарк адамдарды reload-го тартат. Бул акылга сыярлык инстинкт жана reload чындыгында кайсы өзгөртүүлөрдү колдонорун билсеңиз туура болот. Upstream wg-quick unit-инде peer жана ачкыч өзгөртүүлөрү үчүн жетиштүү; даректөө, маршруттоо жана hook үчүн жетишсиз. Муну бир жолу тактап алуу өзгөртүү терезесинде табуудан арзан.

systemd_service модулунун документтери started, restarted жана reloaded ортосундагы айырманы түшүндүрөт жана жашыл жыйынтыктан божомолдоонун ордуна бир жолу окуган жөн. Бул колдонмодогунун баары ошол бир айырмадан келип чыгат.

Тектеш макалалар