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
|
||||
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,15 +86,14 @@ 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
|
||||
else
|
||||
echo "Hostname `$hostname` is not valid. Should contain only letters, numbers and dash. Aborting."
|
||||
rm hosts.tmp
|
||||
exit 3
|
||||
fi
|
||||
else
|
||||
else
|
||||
echo "`$ip` is not a valid IPv4 address (10.10.*.*). Aborting."
|
||||
rm hosts.tmp
|
||||
exit 4
|
||||
@@ -94,19 +102,18 @@ 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
|
||||
printf "%03d\n" "$(echo -n $arg | cut -d '.' -f 4)" >> ./hosts.tmp
|
||||
echo >> hosts.tmp
|
||||
else
|
||||
else
|
||||
echo "Argument `$arg` is not a valid IPv4 address (10.10.*.*). Aborting."
|
||||
rm hosts.tmp
|
||||
exit 5
|
||||
@@ -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 ]];
|
||||
phash=$(cat $password | mkpasswd -m sha-256 -s)
|
||||
then sed -i "s|.*password.*| - ${phash}|" "$snippet"
|
||||
if [[ -n $password ]]; then
|
||||
phash=$(cat $password | mkpasswd -m sha-256 -s)
|
||||
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,13 +233,12 @@ 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"
|
||||
# ОБЯЗАТЕЛЬНО ПРОВЕРИТЬ КОМАНДУ!!!
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Финальная часть
|
||||
|
||||
Reference in New Issue
Block a user