Як передати параметр на 'vagrant up' і розмістити його у межах Vagrantfile?


85

Я шукаю спосіб передати параметр до кулінарної книги шеф-кухаря, наприклад:

$ vagrant up some_parameter

А потім використовуйте some_parameterвсередині однієї з кулінарних книг Шеф-кухаря.

Відповіді:


112

Ви не можете передати будь-який параметр вагранту. Єдиний спосіб - використовувати змінні середовища

MY_VAR='my value' vagrant up

І використовувати ENV['MY_VAR']в рецепті.


1
Дякую! Я спробував gist.github.com/4435297, і я можу отримати користувальницькі дані, але не маю уявлення, як передати їх у кулінарну книгу шеф-кухаря. Зараз спробуємо поєднати це з ENV
Войцех Беднарський

6
Ви можете отримати доступ до цього варіанта ENV також у файлі Vagrant і помістити його в хеш chef.json (див. Docs.vagrantup.com/v1/docs/provisioners/… )
StephenKing 02

Так, це зручніше.
Драко Атер

5
Сам автор бродяги каже, що слід використовувати змінні середовища: github.com/mitchellh/vagrant/issues/2064
Alexander Bird

в PowerShell ви повинні використовувати щось на зразок $ Env: MY_VAR = 'моє значення' | бродяга
Альберто Р.

70

Ви також можете включити бібліотеку GetoptLong Ruby, яка дозволяє аналізувати параметри командного рядка.

Vagrantfile

require 'getoptlong'

opts = GetoptLong.new(
  [ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)

customParameter=''

opts.each do |opt, arg|
  case opt
    when '--custom-option'
      customParameter=arg
  end
end

Vagrant.configure("2") do |config|
             ...
    config.vm.provision :shell do |s|
        s.args = "#{customParameter}"
    end
end

Тоді ви можете запустити:

$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision

Примітка: Переконайтеся, що спеціальна опція вказана перед командою vagrant, щоб уникнути помилки перевірки недійсної опції.

Більше інформації про бібліотеку тут .


1
Я використовую його цілий день з моменту публікації. Це працює дуже добре! У чому проблема ?
Бенджамін Готьє

13
Здається, варіанти не перераховані в optsне оброблених: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Ренат Заріпов

2
Так, це працює, і imho витонченіший за першу відповідь.
davidav

2
@BenjaminGauthier У документах сказано: "Порожній варіант - (два мінус-символи) використовується для завершення обробки варіантів.". Цього vagrant --custom-option=option -- upмає бути досить
CESCO

2
Це більше не працює з Vagrant 2. Він не приймає жодних параметрів, крім власних.
Йенс Бейтингер

23

Можна прочитати змінні з ARGV, а потім видалити їх з нього, перш ніж переходити до фази конфігурації. Здається модифікувати ARGV, але я не міг знайти іншого способу для параметрів командного рядка.

Vagrantfile

# Parse options
options = {}
options[:port_guest] = ARGV[1] || 8080
options[:port_host] = ARGV[2] || 8080
options[:port_guest] = Integer(options[:port_guest])
options[:port_host] = Integer(options[:port_host])

ARGV.delete_at(1)
ARGV.delete_at(1)

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Create a forwarded port mapping for web server
  config.vm.network :forwarded_port, guest: options[:port_guest], host: options[:port_host]

  # Run shell provisioner
  config.vm.provision :shell, :path => "provision.sh", :args => "-g" + options[:port_guest].to_s + " -h" + options[:port_host].to_s

 

забезпечення.ш

port_guest=8080
port_host=8080

while getopts ":g:h:" opt; do
    case "$opt" in
        g)
            port_guest="$OPTARG" ;;
        h)
            port_host="$OPTARG" ;;
    esac
done

Здається, це не працює для мене. Я завжди отримую помилку . Вказано недійсний параметр . Ведення puts ARGVвідображає правильний масив після видалення додаткових призначених для користувача параметрів.
majkinetor

1
Те саме тут, це не працює ... Я вставляю puts "#{ARGV}"рядок, vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbі він друкує цей рядок перед видаленням відповідних аргументів у файлі Vagrant, що означає, що видалення марне, оскільки ARGV передається валідатору, який виводить An invalid option was specifiedперед будь-яким операції можуть мати місце на ARGV.
BogdanSorlea

8

Рішення GetoptLong @ benjamin-gouthier дійсно акуратне, добре вписується в рубінову та бродяжу парадигму.

Однак йому потрібен один додатковий рядок для виправлення чистої обробки бродячих аргументів, таких як vagrant destroy -f.

require 'getoptlong'

opts = GetoptLong.new(
  [ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)

customParameter=''

opts.ordering=(GetoptLong::REQUIRE_ORDER)   ### this line.

opts.each do |opt, arg|
  case opt
    when '--custom-option'
      customParameter=arg
  end
end

що дозволяє цьому блоку коду робити паузу під час обробки нестандартних параметрів. так зараз, vagrant --custom-option up --provision або з vagrant destroy -f ними обробляють чисто.

Сподіваюся, це допомагає,


1
Vagrant.configure("2") do |config|

    class Username
        def to_s
            print "Virtual machine needs you proxy user and password.\n"
            print "Username: " 
            STDIN.gets.chomp
        end
    end

    class Password
        def to_s
            begin
            system 'stty -echo'
            print "Password: "
            pass = URI.escape(STDIN.gets.chomp)
            ensure
            system 'stty echo'
            end
            pass
        end
    end

    config.vm.provision "shell", env: {"USERNAME" => Username.new, "PASSWORD" => Password.new}, inline: <<-SHELL
        echo username: $USERNAME
        echo password: $PASSWORD
SHELL
    end
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.