Juhuslik OpenVPN-i valik systemdis: miks ExecStart ebaõnnestub
systemd ei ole kest, seega ExecStarti sees segatud koopia sureb. Viige valik ExecStartPre-sse või laske OpenVPN-il ise server valida.
Nelikümmend .ovpn faili ühe riigi jaoks tulevad pakkujalt ja plaan tundub ilmne: kopeeri juhuslik fail oma kohale ja käivita siis tunnel. Kui see kirjutada toruks ExecStart sees, sureb see plaan käivitamisel olekukoodiga, mis ei selgita midagi. Unit-fail ei ole skript ja parandus on kas tuua kest selgesõnaliselt sisse või üldse failide valimine lõpetada.
Sümptom: unit, mis käivitub ja sureb kohe
Olek näitab, et teenus ebaõnnestus sekundi murdosa jooksul, ja logirida nimetab käsku, mida ükski kest ei oleks kunagi saanud. Tunnelist ei ilmu midagi, sest tunnel ei alanud kunagi.
Täpse käsurea lugemine logist on selle kinnitamise kiireim viis. systemd kordab seda, mida ta käivitas, ja string näitab toru märke sõnasõnaliste argumentidena, mitte operaatoritena.
Miks ExecStart ei saa toru käivitada
systemd jagab käsurea ise osadeks, rakendab oma jutumärgistust ja muutujate asendust ning käivitab seejärel tulemuse otse. Torud, ümbersuunamine, kesta glob-laiendus ja käsuasendus lihtsalt ei kuulu sellesse grammatikasse. See on disainivalik, mitte puudujääk: unit deklareerib, mida käivitada, ja kesta loogika kuulub skripti, mille unit välja kutsub. Mõlemad parandused tulenevad sellest ja kumbki ei nõua unitile rohkemate õiguste andmist.
See selgitab ka eksitavat väljumiskoodi. Esimest argumenti käsitletakse binaarfailina, seega vigane rida ebaõnnestub enne, kui ükski osa sinu loogikast jookseb.
Tee valik ExecStartPre-s
Otsene parandus on ettevalmistav samm, mis kutsub kesta selgesõnaliselt välja ja hoiab valiku ja käivituse samas unitis, nii et ühe ebaõnnestumine ei saa jätta teist üksi tööle.
[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
Kolm detaili otsustavad, kas see peab vastu kokkupuutele päris masinaga. Nimetamine on esimene lõks: systemd asendab %i juba uniti parsimise ajal, ammu enne bash-i käivitumist, seega peab spetsifikaator asuma väljaspool üksikuid jutumärke. xargs -r takistab cp käivitumist ilma argumendita, kui glob ei vasta millelegi. Ja ebaõnnestunud ettevalmistav samm peatab uniti, mis on õige tulemus: eilse konfiguratsiooniga alustamine on hullem kui mitte alustada. Juhuslik valik, mis võtab alati sama faili, ei ole tavaliselt halb õnn. Kontrolli, kas kopeeritud faili kirjutab üle paketi uuendus, või kas glob vastab ainult ühele vananenud kirjele.
Või lase OpenVPN-il lõpp-punkt valida
OpenVPN suudab juba hoida ühes profiilis mitut lõpp-punkti ja valida nende vahel juhuslikult, mis eemaldab kest, kopeerimise ja kirjutamisõiguse käivitusteelt täielikult.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
See vorm hoiab serveri valiku pakkuja kirjutatud faili sees, seega failide ümbernimetamisega rotatsioon ei riku uniti. See teeb ka kandidaatide nimekirja kontrollitavaks, mida glob kataloogi kohal kunagi ei ole. Segamine väärib endiselt oma kohta, kui profiilid erinevad enamas kui lõpp-punktis: erinevad sertifikaadid, erinevad marsruutimisdirektiivid, erinev šifripoliitika. Sel juhul on valik tervete konfiguratsioonide vahel ja kestasamm on aus viis seda väljendada.
Loe tagasi instants ja fail, mida see kasutas
Enne sisu silumist kinnita, milline unit tegelikult jookseb. Pakendatud meta-teenus ja mall on taristu; sinu failidele vastavad unitid on nende järgi nimetatud instantsid.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
Instants, mille lubamist keegi ei mäleta, viib tavaliselt paketikataloogis eksleva konfiguratsioonifailini. Lülita välja just see nimega instants, mitte mall, muidu toob järgmine pakendiuuendus selle tagasi. Pärast muudatust käivita unit ja loe käsurida, millest logi teatab, seejärel kinnita konfiguratsioonitee, mille see tegelikult avas. See üks kontroll eristab töötavat juhuslikku valikut teenusest, mis vaikselt kasutab uuesti eelmise kuu faili.