web-dev-qa-db-ja.com

「vagrant up」でパラメータを渡し、Vagrantfileのスコープに含める方法は?

次のようなパラメータをChef cookbookに渡す方法を探しています。

$ vagrant up some_parameter

そして、some_parameterシェフの料理本の1つ。

79

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

MY_VAR='my value' vagrant up

そして、ENV['MY_VAR']レシピで。

105
Draco Ater

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コマンドの前にカスタムオプションが指定されていることを確認してください。

ライブラリに関する詳細情報 こちら

64

構成フェーズに進む前に、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

provision.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
23
tsuriga

@ benjamin-gauthierのGetoptLongソリューションは本当にすてきで、Rubyと迷惑なパラダイムにぴったりです。

ただし、vagrant destroy -fなどの迷惑な引数のクリーンな処理を修正するには、1行追加する必要があります。

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はきれいに処理されます。

お役に立てれば、

5
Kannan V
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
0
sophia