Запустіть сценарій на хост-машині під час бродячого


40

Я б хотів запустити скрипт bash на хост-машині, коли бродячі надавали сервер.

Який був би найкращий спосіб досягти цього?

Відповіді:


29

Принаймні два плагіни, які мають допомогти:

Якщо вам не байдуже, що сценарій виконується на (майже) всіх vagrantкомандах, ви також можете просто викласти з нього (або використати будь-яку магію рубіну) у Vagrantfile:

system('./myscript.sh')

Vagrant.configure('2') do |config|
  # ...
end

2
Бродячі тригери виглядають як саме те, що мені потрібно.
цифровий

Де ви знайшли цю функцію system ()? Я ніде не можу знайти жодної документації про це ...
Кріштіану Фонтес

1
@CristianoFontes, це в Kernelмодулі, задокументованому тут . KernelМодуль входить в Objectклас, тому його методи доступні у всіх областях.
tmatilai

1
Дурний мене. Я шукав бродячу документацію. Спасибі!
Кріштіану Фонтес

26

Просте (і повне) рішення

(Я кажу повний, тому що прийнята відповідь не перевіряє, чи користувач використовує бродягу. Тому сценарій виконується для кожної команди, що не є тим, чого хоче ОП.)

Однак для цього є просте рішення.

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

1
Привіт, Мік ... Гарна відповідь за це дякую. Але я не можу отримати, якщо [# {ARGV [0]} = 'вгору']; працювати над вікнами. Це ніколи не знаходить аргументу
Кріштіану Фонтес

1
Це виконує ваш сценарій першим, перш ніж все інше запуститься незалежно від його позиції у Vagrantfile. Це може бути достатньо для того, що ти робиш, але плагін-
триггери

3
@CristianoFontes ви можете зробити тест argv в рубіні поза системним викликом, і він буде працювати в windows та * nix. Я використовую це для встановлення глобальної змінної ruby, що вказує на те, що резервування відбувається шляхом пошуку команди вгору або надання в командному рядку: якщо ARGV [0] = ~ / ^ вгору | надання $ / i, а не ARGV.include? (" --небезпечення ") $ забезпеченість = справжнє інше $ провізія = помилковий кінець
Rhubarb

Це насправді погана практика, як радив Вагрант, ви повинні написати плагін, щоб підключитися до команди "вгору", ви можете вказати будь-яке: до, після та навколо виконання.
SilentICE

1
@Mick його просто з документів Vagrant ( docs.vagrantup.com/v2/plugins/commands.html ). Він також створює крихкий сценарій, оскільки ви не можете бути впевнені, що у випадках викликів argv [0] є "вище", а не вимовляти прапор. Крім того, якщо ви потрапляєте на сирий рубін, ви начебто зриваєте інкапсуляцію, яку, як передбачається, надає рамка. Існують механізми, які роблять це правильно, так що IMHO слід використовувати ті, коли це можливо
SilentICE

9

Розмістіть це біля верхньої частини вашого 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 був портативний, але це має розпочати роботу.


1
Хороша відповідь, я буду використовувати це для установки низького переадресації портів
poindexter

6

На основі відповіді @ 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розширення.
Бен Джонсон

4

Відповідно до сказаного @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якщо це не вдасться), а потім лінія коментує себе.


Було б простіше просто зіткнути список бродячих плагінів, а не коментувати Vagrantfile, що може спричинити проблеми для інших користувачів вашої команди. if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
Йорданія

Проблема в цьому полягає в тому, що він буде спрацьовувати і на інших командах, що робити, якщо ви запустили vagrant statusраніше vagrant up...
Мік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.