Bitta mamlakat uchun qirqta .ovpn fayli provayderdan keladi va reja ravshan ko'rinadi: tasodifiy birini joyiga ko'chirib, keyin tunnelni ishga tushirish. Buni ExecStart ichida quvur sifatida yozsangiz, bu reja yuklanish vaqtida hech narsani tushuntirmaydigan holat kodi bilan o'ladi. Unit fayli skript emas, va tuzatish yo shellni aniq jalb qilish yoki fayl tanlashdan butunlay voz kechishdir.

Belgisi: ishga tushib, darhol o'ladigan unit

Holat xizmat soniyaning bir qismida ishlamaganini ko'rsatadi va jurnal satri hech bir shell hech qachon qabul qilmagan buyruqni nomlaydi. Tunnel haqida hech narsa ko'rinmaydi, chunki tunnel hech qachon boshlanmagan.

Jurnaldan aniq buyruq satrini o'qish buni tasdiqlashning eng tez yo'li. systemd bajargan narsasini takrorlaydi va satr quvur belgilarini operator sifatida emas, balki so'zma-so'z argument sifatida ko'rsatadi.

ExecStart nega quvurni ishga tushira olmaydi

systemd buyruq satrini o'zi bo'ladi, o'zining qo'shtirnoq va o'zgaruvchilarni almashtirish qoidalarini qo'llaydi va keyin natijani bevosita bajaradi. Quvurlar, yo'naltirish, shell tomonidan glob kengaytirish va buyruqni almashtirish bu grammatikaning bir qismi emas. Bu dizayn tanlovi, kamchilik emas: unit nima ishga tushirilishini deklarativ aytadi va shell mantig'i unit chaqiradigan skriptga tegishli. Ikkala tuzatish ham shundan kelib chiqadi va hech biri unitga ko'proq huquq berishni talab qilmaydi.

Bu chalg'ituvchi chiqish kodini ham tushuntiradi. Birinchi argument binar fayl deb qabul qilinadi, shuning uchun noto'g'ri satr sizning mantigingizning biron qismi ishlashidan oldin muvaffaqiyatsiz bo'ladi.

Tanlovni ExecStartPre ichida qiling

To'g'ridan-to'g'ri tuzatish shellni aniq chaqiradigan tayyorgarlik qadamidir va tanlov bilan ishga tushirishni bir unitda saqlaydi, shunda biridagi nosozlik ikkinchisini yolg'iz ishlashga qoldirmaydi.

[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

Uch tafsilot bu haqiqiy mashina bilan to'qnashuvga bardosh berishini hal qiladi. Nomlash birinchi tuzoq: systemd %i ni unitni tahlil qilishda, bash ishga tushishidan ancha oldin almashtiradi, shuning uchun spetsifikator bitta qo'shtirnoqdan tashqarida turishi kerak. xargs -r glob hech narsaga mos kelmasa cp ning argumentsiz ishga tushishini oldini oladi. Muvaffaqiyatsiz tayyorgarlik qadami esa unitni to'xtatadi va bu to'g'ri natija: kechagi konfiguratsiya bilan boshlash umuman boshlamaslikdan yomonroq. Har doim bir xil faylni oladigan tasodifiy tanlov odatda omadsizlik emas. Ko'chirilgan fayl paket yangilanishi bilan ustidan yozilayotganini yoki glob faqat bitta eskirgan yozuvga mos kelishini tekshiring.

Yoki OpenVPN oxirgi nuqtani tanlasin

OpenVPN allaqachon bitta profilda bir nechta oxirgi nuqtani saqlab, ular orasidan tasodifiy tanlashi mumkin, bu shell, nusxa va yozish huquqini yuklanish yo'lidan butunlay olib tashlaydi.

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

Bu shakl server tanlovini provayder yozgan fayl ichida saqlaydi, shuning uchun fayllar nomini o'zgartiradigan rotatsiya unitni buzmaydi. U nomzodlar ro'yxatini audit qilinadigan ham qiladi, katalog ustidagi glob hech qachon bunday bo'lmaydi. Profillar oxirgi nuqtadan ko'proq narsada farq qilsa, aralashtirish hali ham o'z o'rnini oladi: boshqa sertifikatlar, boshqa marshrutlash direktivalari, boshqa shifr siyosati. Bunday holda tanlov butun konfiguratsiyalar orasida bo'ladi va shell qadami buni ifodalashning halol yo'lidir.

Ishlatilgan instans va faylni qayta o'qing

Mazmunini sozlashdan oldin qaysi unit haqiqatan ishlayotganini tasdiqlang. Paketlangan meta xizmat va shablon infratuzilmadir; sizning fayllaringizga mos unitlar o'sha nom bilan atalgan instanslardir.

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

Hech kim yoqilganini eslay olmaydigan instans odatda paket katalogida adashgan konfiguratsiya fayliga olib boradi. Shablonni emas, o'sha nomli instansni o'chiring, aks holda keyingi paket yangilanishi uni qaytaradi. O'zgarishdan keyin unitni ishga tushiring va jurnal xabar qiladigan buyruq satrini o'qing, so'ngra u haqiqatan ochgan konfiguratsiya yo'lini tasdiqlang. O'sha bitta tekshiruv ishlaydigan tasodifiy tanlovni o'tgan oyning faylini jimgina qayta ishlatayotgan xizmatdan ajratadi.

O'xshash maqolalar