124 lines
3.6 KiB
Bash
124 lines
3.6 KiB
Bash
#!/bin/bash
|
|
show_help()
|
|
echo 'Usage:'
|
|
echo 'vmcreate [-h][-a rule_name][-k pub_keyfile][-f filename]'
|
|
echo 'Arguments:'
|
|
echo '-h - show this help;'
|
|
echo '-a - add hosts to HA affinity rules;'
|
|
echo "-f - get IP addresses and Hostnames from 'flilename';"
|
|
echo "-k - embed custom public key or create new if 'pub_keyfile' not specified"
|
|
echo "\nIf file not specified, script will use arguments as a list of IP addresses."
|
|
echo "In this case Hostname will be inherited from 2 last IP octets. Example for 10.10.35.20: 'vm035020'."
|
|
|
|
|
|
# Обрабатываем опции
|
|
while getopts "a:f:h" opt; do
|
|
case $opt in
|
|
a) harule=$OPTARG; ;;
|
|
f) file="$OPTARG" ;;
|
|
h) show_help ; exit 0;;
|
|
# *) noopts=true
|
|
esac
|
|
done
|
|
|
|
if [ $# -eq 0 && -v $file && ! -f $file ]; then
|
|
local input=y
|
|
echo "File $file does not exist. Use default 'hosts' file? Y/n: "
|
|
read input
|
|
case $input in
|
|
y) file=hosts;;
|
|
Y) file=hosts;;
|
|
n) read -p "Enter file name: " file;;
|
|
N) read -p "Enter file name: " file;;
|
|
*) echo "Use '-f' flag for help"; exit 0;;
|
|
fi
|
|
|
|
if [ $# -ne 0 && -v file ]; then show_help; fi
|
|
|
|
# Если заданы аргументы, то создаем временный файл
|
|
if [ $# -ne 0 ] then
|
|
touch hosts.tmp
|
|
for arg in "$@"; do
|
|
ipcheck "$arg"
|
|
if [ $? -eq 0 ] then
|
|
echo -n "$arg " >> ./hosts.tmp
|
|
echo $arg | cut -d '.' -f 3,4 | sed 's/\.//' >> hosts.tmp
|
|
fi
|
|
done
|
|
fi
|
|
|
|
function ip_check() {
|
|
# Функция написана гуглом
|
|
local ip=$1
|
|
local stat=1
|
|
oldIFS=$IFS
|
|
# Check if the IP matches the general IPv4 pattern
|
|
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
|
# Split the IP into octets
|
|
IFS='.' read -r -a octets <<< "$ip"
|
|
# Check if each octet is within the valid range (0-255)
|
|
if [[ ${octets[0]} -le 255 && ${octets[1]} -le 255 \
|
|
&& ${octets[2]} -le 255 && ${octets[3]} -le 255 ]]; then
|
|
stat=0
|
|
fi
|
|
fi
|
|
return $stat
|
|
IFS=$oldIFS
|
|
}
|
|
|
|
hostame_generate(){
|
|
|
|
}
|
|
|
|
keypair_generate (){
|
|
|
|
#указать в конце функции переменную для вывода названия приватного ключа
|
|
privkey=
|
|
}
|
|
|
|
embed_key(){
|
|
#
|
|
}
|
|
|
|
|
|
|
|
|
|
cat $file | while read line
|
|
do
|
|
ip=$(echo $line | cut -d ' ' -f 1)
|
|
hostname=$(echo $line | cut -d ' ' -f 2)
|
|
vmnum=$(echo $ip | cut -d '.' -f 3,4 | sed 's/\.//')
|
|
qm clone 5000 $vmnum --name $hostname --full
|
|
if [ $? -eq 0 ]
|
|
then echo "clone OK"
|
|
else "clone ERROR"; exit 1
|
|
fi
|
|
qm set $vmnum --tags 3,gfx
|
|
## preparing custom CloudInit snippets
|
|
cp ./user.yaml /mnt/pve/syno-tigra/snippets/${vmnum}_user.yaml
|
|
sed -i "s/HOSTNAME/$hostname/g" /mnt/pve/syno-tigra/snippets/${vmnum}_user.yaml
|
|
qm resize $vmnum scsi0 +50G
|
|
qm set $vmnum --cicustom "user=syno-tigra:snippets/${vmnum}_user.yaml"
|
|
qm set $vmnum --ipconfig0 ip=$ip/24,gw=10.10.35.1
|
|
qm cloudinit update $vmnum
|
|
qm start $vmnum
|
|
echo "VMs from $1 successfully created"
|
|
if [ haadd ]
|
|
then
|
|
ha-manager add vm:$vmnum --state started --max_relocate 2
|
|
ha-manager rules add node-affinity $ha_rule --resources vm:$vmnum --nodes pve1,pve2,pve3 --strict 1
|
|
# ОБЯЗАТЕЛЬНО ПРОВЕРИТЬ КОМАНДУ!!!
|
|
fi
|
|
echo "HA rules added"
|
|
done
|
|
|
|
# Финальная часть
|
|
if [ -e hosts.tmp]
|
|
then
|
|
rm hosts.tmp
|
|
fi
|
|
if [ -v $privkey ]
|
|
then
|
|
echo "Generated private key $privkey"
|
|
echo "SAVE IT IMMEDIATELY!!!"
|
|
fi |