'vagrant up'にパラメーターを渡し、Vagrantfileのスコープに含めるにはどうすればよいですか?


回答:


112

パラメータをvagrantに渡すことはできません。唯一の方法は、環境変数を使用することです

MY_VAR='my value' vagrant up

そしてENV['MY_VAR']レシピで使用します。


1
ありがとう!gist.github.com/4435297を試しましたが、ユーザー入力を取得できますが、Chefクックブックに渡す方法がわかりません。これをENVと組み合わせてみます
Wojciech Bednarski 2013年

6
VagrantfileでもそのENV変数にアクセスして、chef.jsonハッシュに入れることができます(docs.vagrantup.com/v1/docs/provisioners/…を参照)
StephenKing 2013年

はい、それはより便利です。
ドラコアター2013年

5
浮浪者自身の作者は、環境変数を使用するように言っています:github.com/mitchellh/vagrant/issues/2064
Alexander Bird

PowerShellでは、次のようなものを使用する必要があります$ Env:MY_VAR = 'my value' | vagrant up
アルベルト

70

コマンドラインオプションを解析できるGetoptLongRubyライブラリを含めることもできます。

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
投稿してから一日中使っています。それは非常にうまくいきます!あなたの問題は何ですか ?
ベンジャミンゴーティエ2015

13
オプションは未opts処理にリストされていないようです: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov 2015

2
はい、これは機能し、imhoは最初の答えよりもエレガントです。
davidav 2015

2
@BenjaminGauthierドキュメントには、「空のオプション-(2つのマイナス記号)はオプション処理を終了するために使用されます」と記載されています。だからvagrant --custom-option=option -- up十分なはずです
CESCO 2016年

2
これはVagrant2では機能しなくなりました。独自のパラメータ以外のパラメータは受け入れません。
Jens Baitinger 2018年

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

 

プロビジョニング.sh

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 2015年

1
ここでは同じ、それは仕事をしません...私は入れputs "#{ARGV}"に行をvagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbし、それがVagrantfileの関連する引数を除去する前にその行を印刷し、これARGVを出力することをバリデータに渡されるよう除去は無益であることを意味するAn invalid option was specified任意の前に操作はARGVで実行できます。
BogdanSorlea 2015

8

@ benjamin-gauthierのGetoptLongソリューションは非常に優れており、ルビーと浮浪者のパラダイムにうまく適合します。

ただし、などのvagrant引数のクリーンな処理を修正するには、1行余分に必要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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.