Любой админ, получая новую задачу с кучей однотипных действий, сталкивается с выбором: либо сделать это вручную, медленно и нудно, но зато гарантированно, либо автоматизировать, но затратить неизвестно сколько времени и, возможно, не достичь результата к сроку, да еще и нагоняй от начальства получить. Каждый выбирает своё, в зависимости от опыта и решимости.
Вот и мне такое досталось: либо потратить 2 дня на формирование 200 клиентских конфигов для OpenVPN, либо написать скрипт. Я крепко задумалась. С одной стороны, текущие задачи никто не отменял, поэтому когда тут изучать баш и писать скрипты, а с другой... Админ я, в конце-то концов, или нет?! Зря, что ли, меня учили такие крутые люди, как
klink0v,
hvostat_hvostat, и
rustedowl?
Поэтому в один из дней я пришла пораньше, погуглила, увидела, что никто прямо такую задачу скриптом еще не решал, почитала чужие скрипты, подумала и написала-таки скрипт, который построчно читает из текстового файлика имя клиента, генерирует для него ключи, создает в указанном месте папку с именем клиента, складывает туда ключи, сертификаты и создает файл конфига.
Остается только положить эту папочку на клиента, и всё!
Конечно, это совсем простой скрипт, как я сейчас понимаю, тем более, это было не прямо-таки "с нуля", но это мой первый скрипт на баше и я страшно горжусь тем, что человек разумный во мне в этот момент восторжествовал над человеком ленивым.))
P.S.: да, скрипт еще не до конца причёсан и не очень хорошо прокомментирован, но я это потом доведу до ума. =)
#!/bin/bash
OPENVPN_DIR=/etc/openvpn
OPENVPN_RSA_DIR=$OPENVPN_DIR/easy-rsa
OPENVPN_KEYS=$OPENVPN_RSA_DIR/keys
KEY_DOWNLOAD_PATH=/mnt/share/
SRC_CONF=client
echo 'START create configs!!'
source ./vars
while IFS='' read -r line || [[ -n "$line" ]]; do
# Read line from file
cd $OPENVPN_RSA_DIR
echo "MAKE config for $line:"
# Check the CN doesn't already exist
if [ -f $OPENVPN_KEYS/$CN.crt ]
then
echo "Error: certificate with the CN $CN already exists!"
else
# Build clients key
export EASY_RSA="${EASY_RSA:-.}"
"$EASY_RSA/pkitool" --batch $line
if [ ! -d $KEY_DOWNLOAD_PATH/$line/ ]
then
# Create new client directory and copy keys/certs
mkdir $KEY_DOWNLOAD_PATH/$line
mkdir $KEY_DOWNLOAD_PATH/$line/keys
echo 'Create distant folders...'
/bin/cp $OPENVPN_KEYS/$line.{key,crt} $KEY_DOWNLOAD_PATH/$line/keys
echo 'Copying the certificates...'
else
/bin/cp $OPENVPN_KEYS/$line.{key,crt} $KEY_DOWNLOAD_PATH/$line/keys
fi
# Build ovpn profile using newly generated client key/cert and ca.crt
/bin/cp $OPENVPN_DIR/$SRC_CONF.conf $KEY_DOWNLOAD_PATH/$line/client.conf
/bin/cp $OPENVPN_KEYS/ca.crt $KEY_DOWNLOAD_PATH/$line/keys/ca.crt
/bin/cp $OPENVPN_KEYS/ta.key $KEY_DOWNLOAD_PATH/$line/keys/ta.key
echo 'Copying ca.crt, ta.key and client.conf...'
# Create custom config
/bin/echo "cert /etc/openvpn/keys/$line.crt" >> $KEY_DOWNLOAD_PATH/$line/client.conf
/bin/echo "key /etc/openvpn/keys/$line.key" >> $KEY_DOWNLOAD_PATH/$line/client.conf
echo 'Customizing config...'
fi
echo ''
done < "$1"