Fjirtich .ovpn-bestannen foar ien lân komme fan in oanbieder, en it plan liket foar de hân: kopiearje in tafallich bestân op syn plak en start dan de tunnel. Skreaun as in pipeline yn ExecStart stjert dat plan by it opstarten mei in statuskoade dy't neat ferklearret. It unit-bestân is gjin skript, en de reparaasje is of in shell eksplisyt derby helje of hielendal ophâlde mei it kiezen fan bestannen.

It symptoom: in unit dy't start en daliks stjert

De status lit sjen dat de tsjinst yn in fraksje fan in sekonde mislearre, en de sjoernaalrige neamt in opdracht dy't gjin inkele shell ea krigen hawwe soe. Oer de tunnel ferskynt neat, om't de tunnel nea begûn.

It krekte opdrachtrige út it sjoernaal lêze is de fluchste manier om dat te befêstigjen. systemd werhellet wat it útfierd hat, en de tekenrige sil de pipeline-tekens as letterlike arguminten sjen litte yn stee fan as operators.

Wêrom ExecStart gjin pipeline rinne kin

systemd skiftet sels de opdrachtrige, past syn eigen oanhelling en fariabele-ferfanging ta en fiert dan it resultaat direkt út. Pipes, omferwizing, glob-útwreiding troch in shell en opdrachtferfanging binne gewoan gjin part fan dy grammatika. It is in ûntwerpkar, gjin fergetten: in unit is deklaratyf oer wat rûn wurde moat, en shell-logika heart yn in skript dat de unit opropt. Beide reparaasjes folgje dêrút, en gjinien freget om de unit mear rjochten te jaan.

It ferklearret ek de misliedende útgongskoade. It earste argumint wurdt as it binêre behannele, dus in misfoarme rige mislearret foardat ek mar ien part fan jo logika rint.

Doch de kar yn ExecStartPre

De direkte reparaasje is in tariedingsstap dy't in shell eksplisyt opropt en de kar en it starten yn deselde unit hâldt, sadat in misstân yn ’e iene de oare net allinnich rinne lit.

[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf

Trije details bepale oft dit in moeting mei in echte masine oerlibbet. Nammen is de earste falstrik: systemd ferfangt %i al by it parsearjen fan ’e unit, lang foardat bash rint, dus de spesifikaasje moat bûten ienheakstekens stean. xargs -r foarkomt dat cp sûnder argumint rint as it glob nearne mei oerienkomt. En in mislearre tariedingsstap stoppet de unit, en dat is de goede útkomst: starte mei de konfiguraasje fan juster is minder as net starte. In tafallige kar dy't altyd itselde bestân nimt is meastentiids gjin min gelok. Kontrolearje oft it kopybere bestân troch in pakketfernijing oerskreaun wurdt, of oft it glob mar ien ferâldere ynfier treft.

Of lit OpenVPN it einpunt kieze

OpenVPN kin al ferskate einpunten yn ien profyl hâlde en dêr tafallich út kieze, wat de shell, de kopy en de skriuwtagong hielendal út it opstartpaad hellet.

client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>

Dizze foarm hâldt de tsjinnerkar yn it bestân dat de oanbieder skreau, dus in rotaasje dy't bestannen omneamt brekt de unit net. It makket ek de kandidaatlist kontrolearber, wat in glob oer in map nea is. It mingjen fertsjinnet noch altyd syn plak as profilen yn mear as in einpunt ferskille: ferskillende sertifikaten, ferskillende rûteleasdirektiven, ferskillend siferbelied. Yn dat gefal is de kar tusken hiele konfiguraasjes en in shell-stap is de earlike manier om dat út te drukken.

Lês de ynstânsje en it bestân dat it brûkte werom

Befêstigje hokker unit eins rint foardat jo de ynhâld debugge. De pakkete meta-tsjinst en it sjabloan binne ynfrastruktuer; de units dy't by jo bestannen hearre binne de ynstânsjes dy't nei har neamd binne.

systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager

In ynstânsje dy't nimmen him betinkt ynskeakele te hawwen liedt meastentiids werom nei in fersweefd konfiguraasjebestân yn ’e pakketmap. Skeakelje dy neamde ynstânsje út ynstee fan it sjabloan, oars bringt de folgjende pakketfernijing it werom. Start nei de wiziging de unit en lês de opdrachtrige dy't it sjoernaal rapportearret, en befêstigje dan it konfiguraasjepaad dat it eins iepene. Dat iene kontrôle skiedt in wurkjende tafallige kar fan in tsjinst dy't stil in bestân fan ôfrûne moanne werbrûkt.

Relatearre artikelen