Veertig .ovpn-lêers vir een land kom van ’n verskaffer, en die plan lyk voor die hand liggend: kopieer ’n ewekansige een na sy plek en begin dan die tonnel. As ’n pyplyn binne ExecStart geskryf, sterf daardie plan by die boot met ’n statuskode wat niks verduidelik nie. Die unit-lêer is nie ’n skrip nie, en die regstelling is óf om ’n dop eksplisiet in te bring óf om heeltemal op te hou om lêers te kies.

Die simptoom: ’n unit wat begin en dadelik sterf

Die status wys die diens het in ’n breukdeel van ’n sekonde gefaal, en die joernaalreël noem ’n opdrag wat geen dop ooit sou ontvang het nie. Niks oor die tonnel verskyn nie, want die tonnel het nooit begin nie.

Om die presiese opdragreël uit die joernaal te lees, is die vinnigste manier om dit te bevestig. systemd eggo wat dit uitgevoer het, en die string sal die pyplynkarakters as letterlike argumente wys eerder as as operateurs.

Waarom ExecStart nie ’n pyplyn kan loop nie

systemd verdeel self die opdragreël, pas sy eie aanhaling en veranderlike-vervanging toe en voer dan die resultaat direk uit. Pyppe, herleiding, dop-glob en opdragvervanging is eenvoudig nie deel van daardie grammatika nie. Dit is ’n ontwerpkeuse eerder as ’n weglating: ’n unit is deklaratiw oor wat om te loop, en dop-logika hoort in ’n skrip wat die unit aanroep. Albei regstellings volg daaruit, en nie een vereis dat die unit meer regte kry nie.

Dit verduidelik ook die misleidende uittreekode. Die eerste argument word as die binêre program behandel, so ’n wanvormige reël faal voordat enige van jou logika loop.

Doen die keuse in ExecStartPre

Die direkte regstelling is ’n voorbereidingsstap wat ’n dop eksplisiet aanroep en die keuse en die begin in dieselfde unit hou, sodat ’n fout in die een nie die ander alleen kan laat loop nie.

[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

Drie besonderhede bepaal of dit ’n werklike masjien oorleef. Benaming is die eerste lokval: systemd vervang %i tydens die ontleding van die unit, lank voordat bash loop, so die specifier moet buite enkelaanhalings sit. xargs -r verhoed dat cp met geen argument loop wanneer die glob niks pas nie. En ’n mislukte voorbereidingsstap stop die unit, wat die korrekte uitkoms is: begin met gister se konfigurasie is slegter as om nie te begin nie. ’n Ewekansige keuse wat altyd dieselfde lêer kies, is gewoonlik nie slegte geluk nie. Kyk of die gekopieerde lêer deur ’n pakketopdatering oorgeskryf word, of of die glob net een verouderde inskrywing pas.

Of laat OpenVPN die eindpunt kies

OpenVPN kan al verskeie eindpunte in een profiel hou en ewekansig onder hulle kies, wat die dop, die kopie en die skryftoegang heeltemal uit die boot-pad verwyder.

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

Hierdie vorm hou die bedienerkeuse in die lêer wat die verskaffer geskryf het, so ’n rotasie wat lêers hernoem, breek nie die unit nie. Dit maak ook die kandidaatlys ouditeerbaar, wat ’n glob oor ’n gids nooit is nie. Die skommel verdien steeds sy plek wanneer profiele in meer as ’n eindpunt verskil: verskillende sertifikate, verskillende roeteringsriglyne, verskillende syferbeleid. In daardie geval is die keuse tussen hele konfigurasies, en ’n dop-stap is die eerlike manier om dit uit te druk.

Lees die instansie en die lêer wat dit gebruik het terug

Bevestig watter unit werklik loop voordat jy die inhoud ontfout. Die verpakte meta-diens en die sjabloon is infrastruktuur; die units wat met jou lêers ooreenstem, is die instansies wat na hulle vernoem is.

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

’n Instansie wat niemand onthou hulle het dit geaktiveer nie, spoor gewoonlik terug na ’n verdwaalde konfigurasielêer in die pakketgids. Skakel daardie genoemde instansie af eerder as die sjabloon, anders bring die volgende pakketopgradering dit terug. Begin ná die verandering die unit en lees die opdragreël wat die joernaal rapporteer, en bevestig dan die konfigurasiepad wat dit werklik oopgemaak het. Daardie een kontrole skei ’n werkende ewekansige keuse van ’n diens wat stilweg ’n lêer van verlede maand hergebruik.

Verwante artikels