Update vmcreate1.sh

This commit is contained in:
2025-10-26 09:51:45 +00:00
parent c0c486f3f0
commit 9b002d23b3

View File

@@ -45,7 +45,10 @@ while getopts "a:f:h" opt; do
# *) noopts=true # *) noopts=true
esac esac
done done
### Проверка допустимости опций
if [[ size >= 10 && size <= 500 ]]; then echo "Disk size increment shoud be in range of 10..500. Aborting."; exit 1; fi if [[ size >= 10 && size <= 500 ]]; then echo "Disk size increment shoud be in range of 10..500. Aborting."; exit 1; fi
# Вывод переменных для дебага: # Вывод переменных для дебага:
if [[ -v file ]]; then echo "File: $file"; fi if [[ -v file ]]; then echo "File: $file"; fi
if [[ -v pubkey ]]; then echo "Public key: $pubkey"; fi if [[ -v pubkey ]]; then echo "Public key: $pubkey"; fi
@@ -62,11 +65,17 @@ if [[ $# -eq 0 && -v "$file" && ! -f "$file" ]]; then
N) read -p "Enter file name: " file;; N) read -p "Enter file name: " file;;
*) echo "Use '-f' flag for help"; exit 0;; *) echo "Use '-f' flag for help"; exit 0;;
esac esac
if [[ ! -f "$file" ]]; then echo "File `$file` does not exist. Exiting."; exit 1; fi if [[ ! -f "$file" ]]; then
echo "File `$file` does not exist. Exiting."
exit 1
fi
fi fi
# Если заданы аргументы И файл # Если заданы аргументы И файл
if [[ $# -ne 0 && -v "$file" ]]; then echo "Please enter file OR arguments. Use '-f' flag for help"; exit 2; fi if [[ $# -ne 0 && -v "$file" ]]; then
echo "Please enter file OR arguments. Use '-f' flag for help"
exit 2
fi
# Проверка файла на соответствие шаблону IPv4 адреса и hostname, создаём временный файл из валидных строк # Проверка файла на соответствие шаблону IPv4 адреса и hostname, создаём временный файл из валидных строк
if [[ -e "$file" ]]; then if [[ -e "$file" ]]; then
@@ -77,15 +86,14 @@ if [[ -e "$file" ]]; then
hostname=$(echo $line | cut -d ' ' -f 2) hostname=$(echo $line | cut -d ' ' -f 2)
if [[ $? -eq 0 ]]; then if [[ $? -eq 0 ]]; then
hostcheck "$hostname" hostcheck "$hostname"
if [[ $? -eq 0 ]]; if [[ $? -eq 0 ]]; then
then
echo $line >> hosts.tmp echo $line >> hosts.tmp
else else
echo "Hostname `$hostname` is not valid. Should contain only letters, numbers and dash. Aborting." echo "Hostname `$hostname` is not valid. Should contain only letters, numbers and dash. Aborting."
rm hosts.tmp rm hosts.tmp
exit 3 exit 3
fi fi
else else
echo "`$ip` is not a valid IPv4 address (10.10.*.*). Aborting." echo "`$ip` is not a valid IPv4 address (10.10.*.*). Aborting."
rm hosts.tmp rm hosts.tmp
exit 4 exit 4
@@ -94,19 +102,18 @@ if [[ -e "$file" ]]; then
fi fi
# Если заданы аргументы, то создаем временный файл # Если заданы аргументы, то создаем временный файл
if [[ $# -ne 0 ]] then if [[ $# -ne 0 ]]; then
touch hosts.tmp touch hosts.tmp
echo -n "" > hosts.tmp echo -n "" > hosts.tmp
for arg in "$@"; do for arg in "$@"; do
ipcheck "$arg" ipcheck "$arg"
if [ $? -eq 0 ] if [ $? -eq 0 ]; then
then
echo -n "$arg " >> ./hosts.tmp echo -n "$arg " >> ./hosts.tmp
echo -n "vm" >> ./hosts.tmp echo -n "vm" >> ./hosts.tmp
printf "%03d\n" "$(echo -n $arg | cut -d '.' -f 3)" >> ./hosts.tmp printf "%03d\n" "$(echo -n $arg | cut -d '.' -f 3)" >> ./hosts.tmp
printf "%03d\n" "$(echo -n $arg | cut -d '.' -f 4)" >> ./hosts.tmp printf "%03d\n" "$(echo -n $arg | cut -d '.' -f 4)" >> ./hosts.tmp
echo >> hosts.tmp echo >> hosts.tmp
else else
echo "Argument `$arg` is not a valid IPv4 address (10.10.*.*). Aborting." echo "Argument `$arg` is not a valid IPv4 address (10.10.*.*). Aborting."
rm hosts.tmp rm hosts.tmp
exit 5 exit 5
@@ -136,7 +143,11 @@ ipcheck() {
hostcheck (){ hostcheck (){
local hostname=$1 local hostname=$1
local pattern="^[a-zA-Z0-9-]+$" local pattern="^[a-zA-Z0-9-]+$"
if [[ "$hostname" =~ $pattern ]]; then return 0; else return 1; fi if [[ "$hostname" =~ $pattern ]]; then
return 0
else
return 1
fi
} }
# Проверяем ключ # Проверяем ключ
@@ -171,12 +182,12 @@ mksnippet (){
snippet="${path}${vmnum}_user.yaml" snippet="${path}${vmnum}_user.yaml"
cp ./user.yaml "$snippet" cp ./user.yaml "$snippet"
sed -i "s/HOSTNAME/$hostname/g" "$snippet" sed -i "s/HOSTNAME/$hostname/g" "$snippet"
if [[ -n $username ]]; if [[ -n $username ]]; then
then sed -i "s|user: root|user: ${username}\nsudo: ALL=(ALL) NOPASSWD:ALL|" "$snippet" sed -i "s|user: root|user: ${username}\nsudo: ALL=(ALL) NOPASSWD:ALL|" "$snippet"
fi fi
if [[ -n $password ]]; if [[ -n $password ]]; then
phash=$(cat $password | mkpasswd -m sha-256 -s) phash=$(cat $password | mkpasswd -m sha-256 -s)
then sed -i "s|.*password.*| - ${phash}|" "$snippet" sed -i "s|.*password.*| - ${phash}|" "$snippet"
fi fi
sed -i "s|.*ssh-rsa.*| - ${pubkey}|" "$snippet" sed -i "s|.*ssh-rsa.*| - ${pubkey}|" "$snippet"
} }
@@ -185,10 +196,19 @@ for line in $(cat hosts.tmp)
do do
ip=$(echo $line | cut -d ' ' -f 1) ip=$(echo $line | cut -d ' ' -f 1)
vlan=$(echo $ip | cut -d '.' -f 3) vlan=$(echo $ip | cut -d '.' -f 3)
if [[ vlan -eq 0 ]]; then mask=23; gw="10.10.0.1"; vlan=100; else mask=24; gw="10.10.${vlan}.1"; fi if [[ vlan -eq 0 ]]; then
mask=23
gw="10.10.0.1"
vlan=100
else
mask=24
gw="10.10.${vlan}.1"
fi
hostname=$(echo $line | cut -d ' ' -f 2) hostname=$(echo $line | cut -d ' ' -f 2)
vmnum="$vlan(printf "%03d\n" "$(echo -n $ip | cut -d '.' -f 4)")" vmnum="$vlan(printf "%03d\n" "$(echo -n $ip | cut -d '.' -f 4)")"
if [[ $vlan -eq 0 ]]; then $vlan=100; fi if [[ $vlan -eq 0 ]]; then
$vlan=100
fi
mksnippet mksnippet
#### DEBUG 2 #### DEBUG 2
echo "IP: $ip" echo "IP: $ip"
@@ -201,9 +221,11 @@ do
#### ####
echo -n "Now cloning VM $vmnum from a template....." echo -n "Now cloning VM $vmnum from a template....."
qm clone 5000 $vmnum --name $hostname --full &>/dev/null qm clone 5000 $vmnum --name $hostname --full &>/dev/null
if [ $? -eq 0 ] if [ $? -eq 0 ]; then
then echo "OK" echo "OK"
else "ERROR"; exit 8 else
echo "ERROR"
exit 8
fi fi
qm set $vmnum --tags $node,$tag qm set $vmnum --tags $node,$tag
qm resize $vmnum scsi0 +"$size"G qm resize $vmnum scsi0 +"$size"G
@@ -211,13 +233,12 @@ do
qm set $vmnum --ipconfig0 ip="$ip"/"$mask",gw="$gw" qm set $vmnum --ipconfig0 ip="$ip"/"$mask",gw="$gw"
qm cloudinit update $vmnum qm cloudinit update $vmnum
qm start $vmnum qm start $vmnum
if [ -v harule ] if [ -v harule ]; then
then
ha-manager add vm:$vmnum --state started --max_relocate 2 ha-manager add vm:$vmnum --state started --max_relocate 2
ha-manager rules add node-affinity $harule --resources vm:$vmnum --nodes pve1,pve2,pve3 --strict 1 ha-manager rules add node-affinity $harule --resources vm:$vmnum --nodes pve1,pve2,pve3 --strict 1
echo "HA rule added" echo "HA rule added"
# ОБЯЗАТЕЛЬНО ПРОВЕРИТЬ КОМАНДУ!!! # ОБЯЗАТЕЛЬНО ПРОВЕРИТЬ КОМАНДУ!!!
fi fi
done done
# Финальная часть # Финальная часть