Skip to content

Instantly share code, notes, and snippets.

@DjLeChuck
Last active June 1, 2022 20:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DjLeChuck/9cf846fcc9a50bd0f75a010612804018 to your computer and use it in GitHub Desktop.
Save DjLeChuck/9cf846fcc9a50bd0f75a010612804018 to your computer and use it in GitHub Desktop.
Gestion de VMs via multipass
#!/bin/bash
# /!\ Nécessite "jq" /!\
# Grandement basé sur le script deploy.sh de xavki <3 : https://gitlab.com/xavki/presentation-ansible-fr/-/blob/master/14-plateforme-dev-docker/deploy.sh
help() {
echo "
Options :
- --create : lancer des VMs
- --drop : supprimer les VMs créer par le deploy-vm
- --infos : caractéristiques des VMs (ip, nom, user...)
- --start : démarrage des VMs
- --stop : arrêt des VMs
- --restart : redémarrage des VMs
- --ansible : déploiement arborescence ansible
"
}
listVms() {
multipass list --format json | jq --arg MASK "$USER-vm-" '.list[] | { name: .name, ip: .ipv4[0] } | select(.name | contains($MASK))'
}
createNodes() {
# définition du nombre de VM
nb_machine=1
[ "$1" != "" ] && nb_machine=$1
# setting min/max
min=1
max=0
# récupération de idmax
idmax=$(multipass list | cut -d ' ' -f 1 | grep "$USER-vm-" | cut -d '-' -f 3 | sort -r | head -1)
# redéfinition de min et max
min=$(($idmax + 1))
max=$(($idmax + $nb_machine))
sshkey="$(cat $HOME/.ssh/id_rsa.pub)"
config="
package_update: true
users:
- name: $USER
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- $(cat $HOME/.ssh/id_rsa.pub)
"
# lancement des VMs
for i in $(seq $min $max); do
echo "$config" | multipass launch --name $USER-vm-$i --disk 50G --cloud-init -
echo "VM $USER-vm-$i créée"
done
infosNodes
}
dropNodes() {
echo "Suppression des VMs..."
for vm in $(listVms | jq -c); do
name=$(echo $vm | jq -r '.name')
multipass delete --purge $name
done
echo "Fin de la suppression"
}
startNodes() {
echo "Démarrage des VMs..."
for vm in $(listVms | jq -c); do
name=$(echo $vm | jq -r '.name')
multipass start $name
done
echo ""
infosNodes
}
stopNodes() {
echo "Arrêt des VMs..."
for vm in $(listVms | jq -c); do
name=$(echo $vm | jq -r '.name')
multipass stop $name
done
echo ""
}
restartNodes() {
echo "Redémarrage des VMs..."
for vm in $(listVms | jq -c); do
name=$(echo $vm | jq -r '.name')
multipass restart $name
done
echo ""
infosNodes
}
createAnsible() {
echo "Création en cours..."
echo ""
ANSIBLE_DIR="ansible_dir"
mkdir -p $ANSIBLE_DIR
echo "all:" >$ANSIBLE_DIR/00_inventory.yml
echo " vars:" >>$ANSIBLE_DIR/00_inventory.yml
echo " ansible_python_interpreter: /usr/bin/python3" >>$ANSIBLE_DIR/00_inventory.yml
echo " hosts:" >>$ANSIBLE_DIR/00_inventory.yml
for vm in $(listVms | jq -c); do
ip=$(echo $vm | jq -r '.ip')
echo " $ip:" >>$ANSIBLE_DIR/00_inventory.yml
done
mkdir -p $ANSIBLE_DIR/host_vars
mkdir -p $ANSIBLE_DIR/group_vars
echo "Création terminée !"
}
infosNodes() {
echo ""
echo "Informations des VMs : "
echo ""
listVms | jq -r '.name + " - " + .ip'
echo ""
}
#si option --create
if [ "$1" == "--create" ]; then
createNodes $2
# si option --drop
elif [ "$1" == "--drop" ]; then
dropNodes
# si option --start
elif [ "$1" == "--start" ]; then
startNodes
# si option --stop
elif [ "$1" == "--stop" ]; then
stopNodes
# si option --restart
elif [ "$1" == "--restart" ]; then
restartNodes
# si option --ansible
elif [ "$1" == "--ansible" ]; then
createAnsible
# si option --infos
elif [ "$1" == "--infos" ]; then
infosNodes
# si aucune option affichage de l'aide
else
help
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment