Відповіді:
Принаймні два плагіни, які мають допомогти:
Якщо вам не байдуже, що сценарій виконується на (майже) всіх vagrant
командах, ви також можете просто викласти з нього (або використати будь-яку магію рубіну) у Vagrantfile:
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
модулі, задокументованому тут . Kernel
Модуль входить в Object
клас, тому його методи доступні у всіх областях.
(Я кажу повний, тому що прийнята відповідь не перевіряє, чи користувач використовує бродягу. Тому сценарій виконується для кожної команди, що не є тим, чого хоче ОП.)
Однак для цього є просте рішення.
ARGV[0]
є першим аргументом команди увійшов і може бути up
, down
, status
і т.д .. Просто перевірте значення ARGV[0]
у вашому Vagrantfile.
Щось подібне зробить:
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
Розмістіть це біля верхньої частини вашого Vagrantfile:
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
Потім просто посилайтеся на свій Vagrantfile так:
config.vm.provision "list-files", type: "local_shell", command: "ls"
І за допомогою такого командного рядка:
vagrant provision --provision-with list-files
Це такий собі злом, як він виглядає як плагін, але насправді це не так (він не з’явиться, коли ви це зробите vagrant plugin list
). Я не рекомендую робити це таким чином, за винятком того, що він має перевагу в тому, що не потрібно встановлювати плагін, тому ваш Vagrantfile буде працювати на будь-якій машині, яка підтримує останню версію конфігурації (версія 2 на цей час написана). Хоча це і здається переносно портативним, також існує ціла проблема міжплатформової фактичної команди, яку ви видаєте. Вам потрібно буде взяти до уваги, якщо ви хочете, щоб ваш Vagrantfile був портативний, але це має розпочати роботу.
На основі відповіді @ tmatilai, але оновленої на 2019 рік, тригери бродяг були об'єднані у Vagrant. Тепер ви можете зробити щось подібне:
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
Цей блок знаходиться всередині config.vm.define
. Подальша документація: https://www.vagrantup.com/docs/triggers/
config.vm.define
не є обов'язковою; їх можна розмістити і всередині Vagrant.configure("2") do |config| ... end
. Як підсумок, на хостах Windows Vagrant із задоволенням виконує сценарії Powershell, які також мають .ps1
розширення.
Відповідно до сказаного @tmatilai про використання
system('./myscript.sh')
Я вважав це дуже корисним для одного разу таких команд, як встановлення бродячих команд або якогось провізіонера, який може бути не встановлений у системі. Я просто уникаю його повторного запуску кожного разу, коли я викликаю vagrant
команди, додаючи sed для автоматичного коментування Vagrantfile
.
Наприклад:
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
І я роблю це перший рядок мого Vagrantfile. Таким чином, він спочатку встановить плагін-тканину бродячої тканини, тканину та джинджу (спробує спочатку без sudo
за virtualenvs
та з, sudo
якщо це не вдасться), а потім лінія коментує себе.
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
раніше vagrant up
...