Бір ел үшін қырық .ovpn файлы провайдерден келеді, және жоспар айқын көрінеді: кездейсоқ біреуін өз орнына көшіріп, содан кейін туннельді іске қосу. Оны ExecStart ішінде құбыр ретінде жазсаңыз, бұл жоспар жүктелу кезінде ештеңені түсіндірмейтін күй кодымен өледі. Юнит файлы скрипт емес, ал түзету — shell-ді анық түрде әкелу немесе файл таңдауды мүлдем тоқтату.

Белгісі: іске қосылып, дереу өлетін юнит

Күй қызметтің секундтың бір бөлігінде сәтсіз аяқталғанын көрсетеді, ал журнал жолы ешбір shell қабылдамайтын пәрменді атайды. Туннель туралы ештеңе көрінбейді, өйткені туннель ешқашан басталмады.

Журналдан нақты пәрмен жолын оқу — мұны растаудың ең жылдам жолы. systemd не орындағанын қайталайды, ал жол құбыр таңбаларын оператор ретінде емес, тура мағыналы аргумент ретінде көрсетеді.

ExecStart неге құбырды іске қоса алмайды

systemd пәрмен жолын өзі бөледі, өзінің тырнақшалары мен айнымалыларды алмастыруын қолданады, содан кейін нәтижені тікелей орындайды. Құбырлар, қайта бағыттау, shell-дің глоб кеңейтуі және пәрменді алмастыру бұл грамматиканың бөлігі емес. Бұл — дизайн таңдауы, ал өткізіп жіберу емес: юнит нені іске қосу керегін декларативті түрде айтады, ал shell логикасы юнит шақыратын скриптке тиесілі. Екі түзету де осыдан туындайды және ешқайсысы юнитке көбірек құқық беруді талап етпейді.

Бұл жаңылыстыратын шығу кодын да түсіндіреді. Бірінші аргумент бинарлық файл ретінде қарастырылады, сондықтан дұрыс емес жол сіздің логикаңыздың кез келген бөлігі іске қосылмай тұрып сәтсіз аяқталады.

Таңдауды ExecStartPre ішінде жасаңыз

Тікелей түзету — shell-ді анық шақыратын дайындық қадамы, ол таңдау мен іске қосуды бір юнитте ұстайды, сондықтан біреуіндегі сәтсіздік екіншісін жалғыз жұмыс істеп тұруға қалдырмайды.

[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

Үш бөлшек бұның нақты машинамен бетпе-бет кездесуге төтеп беретінін шешеді. Атау — бірінші тұзақ: systemd %i-ті юнитті талдау кезінде, bash іске қосылғанға әлдеқайда бұрын алмастырады, сондықтан спецификатор дара тырнақшалардан тыс тұруы керек. xargs -r глоб ештеңеге сәйкес келмегенде cp-тің аргументсіз іске қосылуын болдырмайды. Ал сәтсіз дайындық қадамы юнитті тоқтатады, және бұл дұрыс нәтиже: кешегі конфигурациямен бастау бастамағаннан да нашар. Әрқашан бір файлды алатын кездейсоқ таңдау әдетте сәтсіздік емес. Көшірілген файлдың пакет жаңартуымен қайта жазылып жатқанын немесе глобтың тек бір ескірген жазбаға сәйкес келетінін тексеріңіз.

Немесе OpenVPN өзі соңғы нүктені таңдасын

OpenVPN бір профильде бірнеше соңғы нүктені ұстап, олардың арасынан кездейсоқ таңдай алады, бұл shell-ді, көшіруді және жазу құқығын жүктелу жолынан толығымен алып тастайды.

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

Бұл нысан сервер таңдауын провайдер жазған файлдың ішінде ұстайды, сондықтан файлдарды қайта атайтын ротация юнитті бұзбайды. Ол үміткерлер тізімін тексеруге болатын етеді, ал каталог үстіндегі глоб бұлай ешқашан болмайды. Араластыру профильдер соңғы нүктеден көбірек айырмашылықта болғанда әлі де өз орнын алады: әртүрлі сертификаттар, әртүрлі маршруттау директивалары, әртүрлі шифр саясаты. Бұл жағдайда таңдау тұтас конфигурациялар арасында болады, ал shell қадамы мұны білдірудің адал жолы.

Пайдаланылған инстанция мен файлды қайта оқыңыз

Мазмұнын жөндеуге кіріспес бұрын қай юнит шын мәнінде жұмыс істеп тұрғанын растаңыз. Пакеттелген мета-қызмет пен үлгі — инфрақұрылым; сіздің файлдарыңызға сәйкес юниттер — солардың атымен аталған инстанциялар.

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

Ешкім қосқанын есіне алмайтын инстанция әдетте пакет каталогындағы адасқан конфигурация файлына әкеледі. Үлгіні емес, сол аталған инстанцияны өшіріңіз, әйтпесе келесі пакет жаңартуы оны қайтарады. Өзгерістен кейін юнитті іске қосып, журнал хабарлайтын пәрмен жолын оқыңыз, содан кейін ол шынымен ашқан конфигурация жолын растаңыз. Сол бір тексеру жұмыс істеп тұрған кездейсоқ таңдауды өткен айдың файлын үнсіз қайта пайдаланып жүрген қызметтен ажыратады.

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