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
esac
done
### Проверка допустимости опций
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 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;;
*) echo "Use '-f' flag for help"; exit 0;;
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
# Если заданы аргументы И файл
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, создаём временный файл из валидных строк
if [[ -e "$file" ]]; then
@@ -77,8 +86,7 @@ if [[ -e "$file" ]]; then
hostname=$(echo $line | cut -d ' ' -f 2)
if [[ $? -eq 0 ]]; then
hostcheck "$hostname"
if [[ $? -eq 0 ]];
then
if [[ $? -eq 0 ]]; then
echo $line >> hosts.tmp
else
echo "Hostname `$hostname` is not valid. Should contain only letters, numbers and dash. Aborting."
@@ -94,13 +102,12 @@ if [[ -e "$file" ]]; then
fi
# Если заданы аргументы, то создаем временный файл
if [[ $# -ne 0 ]] then
if [[ $# -ne 0 ]]; then
touch hosts.tmp
echo -n "" > hosts.tmp
for arg in "$@"; do
ipcheck "$arg"
if [ $? -eq 0 ]
then
if [ $? -eq 0 ]; then
echo -n "$arg " >> ./hosts.tmp
echo -n "vm" >> ./hosts.tmp
printf "%03d\n" "$(echo -n $arg | cut -d '.' -f 3)" >> ./hosts.tmp
@@ -136,7 +143,11 @@ ipcheck() {
hostcheck (){
local hostname=$1
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"
cp ./user.yaml "$snippet"
sed -i "s/HOSTNAME/$hostname/g" "$snippet"
if [[ -n $username ]];
then sed -i "s|user: root|user: ${username}\nsudo: ALL=(ALL) NOPASSWD:ALL|" "$snippet"
if [[ -n $username ]]; then
sed -i "s|user: root|user: ${username}\nsudo: ALL=(ALL) NOPASSWD:ALL|" "$snippet"
fi
if [[ -n $password ]];
if [[ -n $password ]]; then
phash=$(cat $password | mkpasswd -m sha-256 -s)
then sed -i "s|.*password.*| - ${phash}|" "$snippet"
sed -i "s|.*password.*| - ${phash}|" "$snippet"
fi
sed -i "s|.*ssh-rsa.*| - ${pubkey}|" "$snippet"
}
@@ -185,10 +196,19 @@ for line in $(cat hosts.tmp)
do
ip=$(echo $line | cut -d ' ' -f 1)
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)
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
#### DEBUG 2
echo "IP: $ip"
@@ -201,9 +221,11 @@ do
####
echo -n "Now cloning VM $vmnum from a template....."
qm clone 5000 $vmnum --name $hostname --full &>/dev/null
if [ $? -eq 0 ]
then echo "OK"
else "ERROR"; exit 8
if [ $? -eq 0 ]; then
echo "OK"
else
echo "ERROR"
exit 8
fi
qm set $vmnum --tags $node,$tag
qm resize $vmnum scsi0 +"$size"G
@@ -211,8 +233,7 @@ do
qm set $vmnum --ipconfig0 ip="$ip"/"$mask",gw="$gw"
qm cloudinit update $vmnum
qm start $vmnum
if [ -v harule ]
then
if [ -v harule ]; then
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
echo "HA rule added"