75 votes

Fermeture de toutes les VM de VirtualBox (vagrant) en une seule commande bash facile à utiliser (qui peut être placée dans un fichier bash)

J'utilise vagabondage pour le développement. J'oublie d'éteindre quelques-unes des VM. Lorsque je veux me déconnecter de ma machine hôte, le processus d'arrêt d'Ubuntu semble se bloquer.

Y aurait-il un moyen de script une fermeture de toutes les boîtes vagrant avec un peu de ligne de commande-fu ? Quelque chose comme ce qui suit, mais quelque chose qui, eh bien, fonctionne.

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;

3voto

vesperto Points 172

J'utilise juste vagrant halt . Si vous l'exécutez sans autre argument, il arrête toutes les machines définies dans le fichier Vagrantfile .

1voto

kenorb Points 8840

Si vous écrivez des scripts pour analyser les commandes de Vagrant, il est conseillé d'analyser une sortie conviviale pour la machine ( --machine-readable ) qui est plus cohérent.

Le format est le suivant :

timestamp,target,type,data...

afin que vous puissiez l'importer en tant que fichier CSV, puisqu'il est séparé par des virgules.

Avec Shell, il est probablement plus difficile de l'analyser, par exemple :

for id in $(vagrant global-status --machine-readable | cut -d, -f5 | grep -B3 running | egrep -o "[0-9a-f]{7}"); do
    vagrant suspend $id;
done

Voir : Vagrant - Sortie lisible par une machine


Cependant, je trouve qu'il est plus facile d'analyser la sortie standard, par ex.

while read id name provider state path; do
  [ "$state" = "running" ] && vagrant suspend $id;
done < <(vagrant global-status)

Btw. Théoriquement vagrant La commande doit accepter une expression régulière pour la liste des VMs à suspendre selon cette GH poste par exemple :

vagrant suspend '*'

mais cela ne fonctionne pas et il y a une bogue n° 7221 qui est en attente afin de la réparer.


Billets GitHub connexes :

0voto

Johan Points 1599

Cela peut ou non fonctionner pour vous ;-) Cela fonctionne pour moi

vagrant_halt_all.sh

#!/usr/bin/env bash
if [ -z "$1" ]
then
  OPTS=""
else
  # force close if any arg passed
  OPTS="-f"
fi

for i in $(vagrant global-status | grep running | awk '{print $1}'); do 
  DIR=$(vagrant global-status | grep running | awk '{print $5}')
  cd "$DIR";
  OUT=$(vagrant halt);
  echo "attempted to halt $i: $OUT"
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X