Herrialde baterako berrogei .ovpn fitxategi iristen dira hornitzaile batetik, eta plana begi-bistakoa dirudi: kopiatu ausazko bat bere tokian, eta gero abiarazi tunela. ExecStart barruan hodi gisa idatzita, plan hori abioan hiltzen da ezer azaltzen ez duen egoera-kode batekin. Unitate-fitxategia ez da script bat, eta konponketa da shell bat espresuki ekartzea edo fitxategiak aukeratzeari erabat uztea.

Sintoma: abiarazi eta berehala hiltzen den unitate bat

Egoerak erakusten du zerbitzuak segundo baten zati batean huts egin zuela, eta erregistroko lerroak shell batek inoiz jasoko ez zuen komando bat izendatzen du. Tunelari buruz ezer ez da agertzen, tunela ez baitzen inoiz hasi.

Erregistrotik komando-lerro zehatza irakurtzea da hori baieztatzeko modurik azkarrena. systemd-ek exekutatu zuena errepikatzen du, eta kateak hodiaren karaktereak argumentu literal gisa erakutsiko ditu, eragile gisa izan beharrean.

Zergatik ezin duen ExecStart-ek hodi bat exekutatu

systemd-ek berak zatitzen du komando-lerroa, bere komatxo eta aldagai-ordezkapena aplikatzen ditu, eta gero emaitza zuzenean exekutatzen du. Hodiek, birbideratzeak, shell baten glob hedapenak eta komando-ordezkapenak ez dira gramatika horren parte, besterik gabe. Diseinu-erabakia da, ez hutsune bat: unitate batek zer exekutatu adierazten du modu deklaratiboan, eta shellaren logika unitateak deitzen duen script bati dagokio. Bi konponketak hortik datoz, eta batek ere ez du unitateari pribilegio gehiago ematea eskatzen.

Irteera-kode engainagarria ere azaltzen du. Lehen argumentua bitar gisa tratatzen da, beraz lerro gaizki eratutako batek huts egiten du zure logikaren edozein zati exekutatu aurretik.

Egin hautaketa ExecStartPre-n

Konponketa zuzena shell bat espresuki deitzen duen prestaketa-urrats bat da, hautaketa eta abiaraztea unitate berean edukiz, bateko hutsegiteak bestea bakarrik martxan utz ez dezan.

[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

Hiru xehetasunek erabakitzen dute hau makina erreal batekin topo eginda bizirik ateratzen den. Izena jartzea da lehen tranpa: systemd-ek %i ordezkatzen du unitatea analizatzean, bash exekutatu baino askoz lehenago, beraz espezifikatzaileak komatxo bakunen kanpo egon behar du. xargs -r-ek eragozten dio cp-i argumenturik gabe exekutatzea glob-ak ezer batekin bat ez datorrenean. Eta prestaketa-urrats batek huts eginez gero unitatea gelditzen da, eta hori da emaitza zuzena: atzoko konfigurazioarekin abiatzea ez abiatzea baino okerragoa da. Beti fitxategi bera hartzen duen hautaketa ausazkoa normalean ez da zorte txarra. Egiaztatu kopiatutako fitxategia pakete-eguneratze batek gainidazten ote duen, edo glob-ak sarrera zaharkitu bakarrekin bat egiten ote duen.

Edo utzi OpenVPN-i muturra aukeratzen

OpenVPN gai da jada profil batean hainbat mutur edukitzeko eta haien artean ausaz aukeratzeko, eta horrek shell-a, kopia eta idazketa-sarbidea erabat kentzen ditu abio-bidetik.

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

Forma honek zerbitzari-hautaketa hornitzaileak idatzitako fitxategiaren barruan mantentzen du, beraz fitxategiak berrizendatzen dituen errotazio batek ez du unitatea hausten. Hautagaien zerrenda gainbegiratzeko modukoa ere egiten du, eta direktorio baten gaineko glob-ak ez du hori sekula lortzen. Nahasteak oraindik merezi du bere lekua profilek mutur bat baino gehiagotan ezberdintzen direnean: ziurtagiri ezberdinak, bideratze-direktiba ezberdinak, zifratze-politika ezberdina. Kasu horretan hautaketa konfigurazio osoen artekoa da, eta shell-urrats bat da hori adierazteko modu zintzoa.

Irakurri berriz instantzia eta erabili zuen fitxategia

Baieztatu zein unitatek egiten duen benetan lan bere edukia araztu aurretik. Paketatutako meta-zerbitzua eta txantiloia azpiegitura dira; zure fitxategiei dagozkien unitateak haien izena daramaten instantziak dira.

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

Inork piztu zuela gogoratzen ez duen instantzia bat pakete-direktorioko konfigurazio-fitxategi galdu batera eramaten du normalean. Itzali instantzia izendatu hori, txantiloia izan beharrean, bestela hurrengo pakete-eguneratzeak berriro ekarriko du. Aldaketaren ondoren, abiarazi unitatea eta irakurri erregistroak jakinarazten duen komando-lerroa, eta gero baieztatu benetan ireki zuen konfigurazio-bidea. Egiaztapen bakar horrek funtzionatzen duen ausazko hautaketa aurreko hilabeteko fitxategi bat isil-isilik berrerabiltzen duen zerbitzutik bereizten du.

Erlazionatutako artikuluak