'vagrant up'에 매개 변수를 전달하고 Vagrantfile 범위에 포함하는 방법은 무엇입니까?


답변:


112

vagrant에 매개 변수를 전달할 수 없습니다. 유일한 방법은 환경 변수를 사용하는 것입니다.

MY_VAR='my value' vagrant up

그리고 ENV['MY_VAR']레시피에 사용하십시오 .


1
감사! gist.github.com/4435297을 시도해 보았고 사용자 입력을 얻을 수 있지만 Chef 쿡북에 전달하는 방법을 모릅니다. 지금 시도 ENV와 함께이 결합됩니다
요이치 Bednarski

6
Vagrantfile에서도 ENV var에 액세스하여 chef.json 해시에 넣을 수 있습니다 ( docs.vagrantup.com/v1/docs/provisioners/… 참조 )
StephenKing 2013 년

예, 더 편리합니다.
Draco Ater 2013 년


powershell에서는 $ Env : MY_VAR = 'my value'| 방랑자
Alberto R.

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
게시 한 이후로 하루 종일 사용하고 있습니다. 그것은 아주 잘 작동합니다! 무엇이 문제입니다 ?
Benjamin Gauthier 2015

13
이 옵션이 나열되지 않은 것으로 보인다 opts:하지 처리 vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov

2
네, 작동합니다. 첫 번째 대답보다 imho가 더 우아합니다.
davidav 2015-09-01

2
@BenjaminGauthier 문서는 "빈 옵션-(2 개의 빼기 기호)는 옵션 처리를 종료하는 데 사용됩니다."라고 말합니다. 그래서 vagrant --custom-option=option -- up충분해야한다
CESCO

2
이것은 더 이상 Vagrant 2에서 작동하지 않습니다. 자체 매개 변수 외에는 어떤 매개 변수도 허용하지 않습니다.
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

 

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

이것은 나를 위해 작동하지 않는 것 같습니다. 항상 오류가 발생 합니다 . 잘못된 옵션이 지정되었습니다 . 이렇게 puts ARGV표시를 추가로 사용자 정의 인자의 제거 후 올바른 배열을.
majkinetor

1
여기에 같은, 그것은 ... 나는하지 작업 넣어 않습니다 puts "#{ARGV}"에 라인을 vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb그리고 그것은 따라서 ARGV은 검증에 전달 될 때 제거가 헛된 것을 의미하는 Vagrantfile의 관련 인수를 제거하기 전에 그 라인을 인쇄하는 출력 An invalid option was specified어떤 전에 작업은 ARGV에서 발생할 수 있습니다.
BogdanSorlea

8

@ benjamin-gauthier의 GetoptLong 솔루션은 정말 깔끔하고 루비 및 방랑 패러다임과 잘 어울립니다.

그러나 .NET과 같은 방랑 인자의 깨끗한 처리를 수정하려면 한 줄이 추가로 필요합니다 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.