Bir ülke için kırk .ovpn dosyası bir sağlayıcıdan gelir ve plan açık görünür: rastgele birini yerine kopyala, sonra tüneli başlat. ExecStart içinde bir boru hattı olarak yazıldığında, bu plan önyüklemede hiçbir şey açıklamayan bir durum koduyla ölür. Birim dosyası bir betik değildir ve düzeltme ya açıkça bir shell getirmek ya da dosya seçmeyi tamamen bırakmaktır.

Belirti: başlayıp hemen ölen bir birim

Durum, hizmetin saniyenin bir bölüğünde başarısız olduğunu gösterir ve günlük satırı hiçbir shell'in asla almayacağı bir komutu adlandırır. Tünel hakkında hiçbir şey görünmez, çünkü tünel hiç başlamamıştır.

Günlükten tam komut satırını okumak bunu doğrulamanın en hızlı yoludur. systemd yürüttüğü şeyi yansıtır ve dize, boru hattı karakterlerini işleç olarak değil, birebir bağımsız değişken olarak gösterir.

ExecStart neden bir boru hattı çalıştıramaz

systemd komut satırını kendisi böler, kendi tırnak ve değişken değiştirme kurallarını uygular ve ardından sonucu doğrudan yürütür. Boru hatları, yönlendirme, kabuğun glob genişletmesi ve komut değiştirme bu dilbilgisinin parçası değildir. Bu bir tasarım tercihidir, eksiklik değil: birim neyin çalıştırılacağını bildirimsel olarak söyler ve kabuk mantığı birimin çağırdığı betiğe aittir. Her iki düzeltme de bundan doğar ve hiçbiri birime daha fazla yetki vermeyi gerektirmez.

Bu aynı zamanda yanıltıcı çıkış kodunu da açıklar. İlk bağımsız değişken ikili dosya olarak kabul edilir, bu yüzden bozuk bir satır mantığınızın herhangi bir kısmı çalışmadan önce başarısız olur.

Seçimi ExecStartPre içinde yapın

Doğrudan düzeltme, açıkça bir shell çağıran bir hazırlık adımıdır ve seçimi ve başlatmayı aynı birimde tutar, böylece birindeki arıza diğerini tek başına çalışır bırakmaz.

[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

Üç ayrıntı bunun gerçek bir makineyle teması atlatıp atlatmayacağını belirler. Adlandırma ilk tuzaktır: systemd, birimi ayrıştırırken, bash çalışmadan çok önce %i yerine koyar, bu yüzden belirteç tek tırnakların dışında durmalıdır. xargs -r, glob hiçbir şeyle eşleşmediğinde cp komutunun bağımsız değişken olmadan çalışmasını önler. Başarısız bir hazırlık adımı ise birimi durdurur ve doğru sonuç budur: dünkü yapılandırmayla başlamak, hiç başlamamaktan daha kötüdür. Her zaman aynı dosyayı alan rastgele bir seçim genellikle kötü şans değildir. Kopyalanan dosyanın bir paket güncellemesiyle üzerine yazılıp yazılmadığını veya glob'un yalnızca tek bir eski girdiyle eşleşip eşleşmediğini kontrol edin.

Veya uç noktayı OpenVPN seçsin

OpenVPN zaten tek bir profilde birkaç uç nokta tutabilir ve aralarından rastgele seçim yapabilir; bu, kabuğu, kopyayı ve yazma erişimini önyükleme yolundan tamamen çıkarır.

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

Bu biçim, sunucu seçimini sağlayıcının yazdığı dosyanın içinde tutar, böylece dosyaları yeniden adlandıran bir rotasyon birimi bozmaz. Ayrıca aday listesini denetlenebilir kılar; bir dizin üzerindeki glob bunu asla yapamaz. Profiller bir uç noktadan fazlasında farklılaştığında karıştırma yine de yerini korur: farklı sertifikalar, farklı yönlendirme direktifleri, farklı şifreleme politikası. Bu durumda seçim bütün yapılandırmalar arasındadır ve bir kabuk adımı bunu ifade etmenin dürüst yoludur.

Kullanılan örneği ve dosyayı geri okuyun

İçeriğinde hata ayıklamadan önce hangi birimin gerçekten çalıştığını doğrulayın. Paketlenmiş meta hizmet ve şablon altyapıdır; dosyalarınıza karşılık gelen birimler, onların adını taşıyan örneklerdir.

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

Kimsenin etkinleştirdiğini hatırlamadığı bir örnek genellikle paket dizinindeki başıboş bir yapılandırma dosyasına kadar gider. Şablon yerine o adlandırılmış örneği kapatın, aksi halde bir sonraki paket yükseltmesi onu geri getirir. Değişiklikten sonra birimi başlatın ve günlüğün bildirdiği komut satırını okuyun, ardından gerçekten açtığı yapılandırma yolunu doğrulayın. O tek kontrol, çalışan bir rastgele seçimi, geçen ayın dosyasını sessizce yeniden kullanan bir hizmetten ayırır.

İlgili makaleler