Бир өлкө үчүн кырк .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

Эч ким күйгүзгөнүн эсинде сактабаган инстанция адатта пакет каталогунда адашкан конфигурация файлына алып барат. Шаблонду эмес, ошол аталган инстанцияны өчүрүңүз, болбосо кийинки пакет жаңыртуусу аны кайтарат. Өзгөртүүдөн кийин юнитти баштаңыз жана журнал билдирген буйрук сабын окуңуз, анан ал чындап ачкан конфигурация жолун ырастаңыз. Ошол бир текшерүү иштеп жаткан кокустан тандоону өткөн айдын файлын унчукпай кайра колдонуп жаткан кызматтан ажыратат.

Тектеш макалалар