다음과 같이 Chef 요리 책에 매개 변수를 전달하는 방법을 찾고 있습니다.
$ vagrant up some_parameter
그런 다음 some_parameter
Chef 요리 책 중 하나 를 사용 하십시오.
다음과 같이 Chef 요리 책에 매개 변수를 전달하는 방법을 찾고 있습니다.
$ vagrant up some_parameter
그런 다음 some_parameter
Chef 요리 책 중 하나 를 사용 하십시오.
답변:
vagrant에 매개 변수를 전달할 수 없습니다. 유일한 방법은 환경 변수를 사용하는 것입니다.
MY_VAR='my value' vagrant up
그리고 ENV['MY_VAR']
레시피에 사용하십시오 .
명령 줄 옵션을 구문 분석 할 수 있는 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 명령 전에 사용자 지정 옵션이 지정되어 있는지 확인하십시오 .
opts
:하지 처리 vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
충분해야한다
ARGV에서 변수를 읽은 다음 구성 단계로 진행하기 전에 변수를 제거 할 수 있습니다. ARGV를 수정하는 것은 기분이 좋지 않지만 명령 줄 옵션에 대한 다른 방법을 찾을 수 없습니다.
# 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
표시를 추가로 사용자 정의 인자의 제거 후 올바른 배열을.
puts "#{ARGV}"
에 라인을 vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
그리고 그것은 따라서 ARGV은 검증에 전달 될 때 제거가 헛된 것을 의미하는 Vagrantfile의 관련 인수를 제거하기 전에 그 라인을 인쇄하는 출력 An invalid option was specified
어떤 전에 작업은 ARGV에서 발생할 수 있습니다.
@ 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
깨끗하게 처리됩니다.
도움이 되었기를 바랍니다,
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