Update vmcreate1.sh
This commit is contained in:
69
vmcreate1.sh
69
vmcreate1.sh
@@ -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
|
||||||
|
|
||||||
# Финальная часть
|
# Финальная часть
|
||||||
|
|||||||
Reference in New Issue
Block a user