Làm thế nào để truyền tham số trên 'vagrant up' và có nó trong phạm vi của Vagrantfile?


Câu trả lời:


112

Bạn không thể chuyển bất kỳ tham số nào cho vagrant. Cách duy nhất là sử dụng các biến môi trường

MY_VAR='my value' vagrant up

Và sử dụng ENV['MY_VAR']trong công thức.


1
Cảm ơn! Tôi đã thử gist.github.com/4435297 và tôi có thể nhận thông tin đầu vào của người dùng, nhưng không biết làm thế nào để chuyển nó vào sách nấu ăn Chef. Bây giờ sẽ cố gắng kết hợp này với ENV
Wojciech Bednarski

6
Bạn có thể truy cập mà ENV var cũng trong Vagrantfile và đặt nó vào băm chef.json (xem docs.vagrantup.com/v1/docs/provisioners/... )
StephenKing

Vâng, đó là thuận tiện hơn.
Draco Ater

5
Tác giả của lang thang mình nói để sử dụng các biến môi trường: github.com/mitchellh/vagrant/issues/2064
Alexander Bird

trong powershell, bạn nên sử dụng một cái gì đó như vậy $ Env: MY_VAR = 'my value' | lang thang
Alberto R.

70

Bạn cũng có thể bao gồm thư viện GetoptLong Ruby cho phép bạn phân tích cú pháp các tùy chọn dòng lệnh.

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

Sau đó, bạn có thể chạy:

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

Lưu ý: Đảm bảo rằng tùy chọn tùy chỉnh được chỉ định trước lệnh vagrant để tránh lỗi xác thực tùy chọn không hợp lệ.

Thông tin thêm về thư viện tại đây .


1
Tôi đang sử dụng nó cả ngày kể từ khi tôi đăng. Nó hoạt động rất tốt ! Vấn đề của bạn là gì ?
Benjamin Gauthier,

13
Có vẻ như các tùy chọn không được liệt kê trong optskhông được xử lý: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov

2
Đúng, điều này hoạt động, và imho thanh lịch hơn câu trả lời đầu tiên.
davidav

2
@BenjaminGauthier Tài liệu cho biết "Tùy chọn trống - (hai ký hiệu dấu trừ) được sử dụng để kết thúc quá trình xử lý tùy chọn.". Vì vậy, vagrant --custom-option=option -- upnên có đủ
CESCO

2
Điều này không hoạt động với Vagrant 2 nữa. Nó không chấp nhận bất kỳ tham số nào bên cạnh tham số của chính nó.
Jens Baitinger

23

Có thể đọc các biến từ ARGV và sau đó xóa chúng khỏi nó trước khi tiếp tục giai đoạn cấu hình. Thật khó để sửa đổi ARGV nhưng tôi không thể tìm thấy bất kỳ cách nào khác cho các tùy chọn dòng lệnh.

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

 

cung cấp.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

Điều này dường như không hiệu quả với tôi. Tôi luôn gặp lỗi Một tùy chọn không hợp lệ đã được chỉ định . Việc làm puts ARGVhiển thị mảng chính xác sau khi loại bỏ các đối số tùy chỉnh bổ sung.
majkinetor

1
Tương tự ở đây, nó không hoạt động ... Tôi đặt một puts "#{ARGV}"dòng vào vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbvà nó in dòng đó trước khi xóa các vòng có liên quan trong Vagrantfile, do đó có nghĩa là việc xóa là vô ích vì ARGV được chuyển cho trình xác thực xuất An invalid option was specifiedtrước bất kỳ hoạt động có thể diễn ra trên ARGV.
BogdanSorlea,

8

Giải pháp GetoptLong của @ benjamin-gauthier thực sự rất gọn gàng, rất phù hợp với mô hình ruby ​​và vagrant.

Tuy nhiên, nó cần thêm một dòng để khắc phục việc xử lý sạch sẽ các đối số mơ hồ, chẳng hạn như 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

cho phép khối mã này tạm dừng khi các tùy chọn tùy chỉnh được xử lý. vì vậy bây giờ, vagrant --custom-option up --provision hoặc vagrant destroy -f được xử lý sạch sẽ.

Hi vọng điêu nay co ich,


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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.