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 арасындағы айырманы түсіндіреді және жасыл қорытындыдан болжаудың орнына бір рет оқыған жөн. Бұл нұсқаулықтағының бәрі сол бір айырмадан шығады.

Қатысты мақалалар