J'aimerais exécuter un script bash script sur la machine hôte lorsque vagrant provisionne le serveur.
Quelle serait la meilleure méthode pour y parvenir ?
J'aimerais exécuter un script bash script sur la machine hôte lorsque vagrant provisionne le serveur.
Quelle serait la meilleure méthode pour y parvenir ?
(Je dis complet car la réponse acceptée ne vérifie pas si l'utilisateur utilise vagrant up. Par conséquent, le script est exécuté à chaque commande, ce qui n'est pas ce que veut l'OP).
Il existe cependant une solution simple à ce problème.
ARGV[0]
est le premier argument de la commande saisie et peut être up
, down
, status
etc. Il suffit de vérifier la valeur de ARGV[0]
dans votre fichier Vagrant.
Quelque chose comme ceci fera l'affaire :
system("
if [ #{ARGV[0]} = 'up' ]; then
echo 'You are doing vagrant up and can execute your script'
./myscript.sh
fi
")
Vagrant.configure('2') do |config|
# ...
end
Basé sur la réponse de @tmatilai mais mis à jour pour 2019, vagrant-triggers a été fusionné dans Vagrant. Vous pouvez donc maintenant faire quelque chose comme ça :
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
Ce bloc se trouve à l'intérieur de config.vm.define
. Plus de documentation : https://www.vagrantup.com/docs/triggers/
Ou directement dans le Vagrant.configure("2")
bloc :
config.trigger.before [:up, :provision] do |trigger|
...
end
Placez ceci au début de votre fichier Vagrant :
module LocalCommand
class Config < Vagrant.plugin("2", :config)
attr_accessor :command
end
class Plugin < Vagrant.plugin("2")
name "local_shell"
config(:local_shell, :provisioner) do
Config
end
provisioner(:local_shell) do
Provisioner
end
end
class Provisioner < Vagrant.plugin("2", :provisioner)
def provision
result = system "#{config.command}"
end
end
end
Ensuite, invoquez simplement dans votre fichier Vagrant comme ceci :
config.vm.provision "list-files", type: "local_shell", command: "ls"
Et via la ligne de commande comme ceci :
vagrant provision --provision-with list-files
Il s'agit d'une sorte de piratage, car il ressemble à un plug-in, mais n'en est pas vraiment un (il n'apparaîtra pas lorsque vous ferez vagrant plugin list
). Je ne recommande pas de procéder de cette manière, sauf qu'elle présente l'avantage de ne pas nécessiter l'installation d'un plugin, de sorte que votre fichier Vagrant fonctionnera sur toute machine qui prend en charge la dernière version de configuration (version 2 au moment où j'écris ces lignes). Bien que cela semble prometteur sur le plan de la portabilité, il y a aussi le problème de la commande que vous lancez et qui est multiplateforme. Vous devrez prendre en compte si vous voulez que votre fichier Vagrant soit portable, mais cela devrait vous aider à démarrer.
En accord avec ce que @tmatilai a dit à propos de l'utilisation de
system('./myscript.sh')
Je l'ai trouvé assez utile pour des commandes ponctuelles comme l'installation de commandes vagrant ou d'un provisionneur qui pourrait ne pas être installé dans le système. J'évite juste qu'il se relance à chaque fois que j'invoque la commande vagrant
en ajoutant un sed pour auto-commenter les commandes Vagrantfile
.
Par exemple :
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
Et j'en fais la première ligne de mon fichier Vagrant. De cette façon, il installera d'abord le plugin vagrant-fabric, fabric et jinja (j'essaierai d'abord sans le plugin vagrant-fabric). sudo
pour virtualenvs
et avec sudo
en cas d'échec), puis la ligne se commente elle-même.
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.